ado.net 学习小结
连接数据源
Connection对象。Connection对象处于最顶层,是所有数据访问请求的关口。我们通过其暴露的属性进行配置。下面是一段连接字符串的示例。
if (string.IsNullOrEmpty(con.ConnectionString))
{
con.ConnectionString = "Data Source=localhost\\sql08; Initial Catalog=ado_test;user ID=sa;password=test;";// Integrated Security=SSPI
} if (con.State != ConnectionState.Open)
{
con.Open();
}
if (con.State == ConnectionState.Open)
lbConnect.Text = "CONNECTED NOW!";
其中Data Source属性指连接的数据库实例;Initial Catalog或Database用于指定数据库的名称(SQLSERVER一个实例可以打开多个数据库);Integrated Security或Trusted_Connection,如果为false(默认),则输入登录名和密码,可识别的值有True,False,Yes,No和SSPI,其中SSPI与True等效;Password和User ID不必多言。
以上几个属性是比较常见的属性。
连接字符串应该存储在项目的App.config文件中,这样如果修改连接,则无需更改程序内容。
考虑到各种处理和进程间通信的使用,创建到数据源的连接的代价是高昂的。为了解决这个问题,ADO.NET提出了连接池(connection pooling)的概念。
在每次连接请求时,如果连接字符串的值不发生改变,且连接池中包含现有的连接,那么ADO.NET则会重用现有连接,而不会创建新的连接。连接池的创建取决于连接字符串的值、事务和集成安全标识。因此强烈建议:在每次操作结束后,将Connection对象关闭,这样该连接会返回连接池。
方法 BeginTransaction:用于开始数据库事务,返回一个SqlTransaction对象。
Commit:提交
RollBack:回滚
Command对象。Command对象要与Connection对象配合使用才能执行对数据源的查询。可以把Connection对象赋给Command.Connection属性。
CommandText: 要执行的SQL文本。
CommandType:用于指定对CommandText的解释方式,值是枚举System.Data.CommandType类型,有Text,StoredProcedure和TableDirect。
Parameters:参数集合
Transaction:执行的事务
方法 ExecuteNonQuery:更新插入删除,选用此方法。以整数形式返回受影响行数。
ExecuteReader: 读取,返回一个就绪的SqlDataReader对象。
DataReader对象。
DataReader用于从数据源获取只读且只进的数据集。DataReader是在查询的过程中获取数据,而不是等待查询结束。这对提高应用程序的性能发挥着积极的作用。
DataReader要通过Command.ExecuteReader()获取,一旦获得便可以使用它的Read方法来获取数据记录。下面是一个示例,可参考:
http://hi.baidu.com/wcsjsdn/item/988454942293dad01b49dfb5
command.CommandText = "select * from dbo.demo;";
command.Parameters.Clear();
command.Connection = con;
if(con.State!=ConnectionState.Open)
{
MessageBox.Show("PLZ open database!");
return;
}
sdr = command.ExecuteReader();
txtDataReader.Text=string.Empty;
if (sdr.HasRows)//判断是否有值
{
while (sdr.Read())//调用Read方法,开始向前读取
for (int i = ; i <= sdr.FieldCount - ; i++)//DataReader相当于一行数据
{
txtDataReader.Text += sdr[i].ToString().Trim() + " ;";
}
} sdr.Close();
DataAdapter对象。
DataAdapter是客户端的DataSet和数据源之间的桥梁。我们可以通过它来增删查改数据。根据数据方向的不同,可以使用Fill(多用)方法和Update方法(少用)。
在SqlDataAdapter实例化时,可以为其提供一个Command对象。在默认情况下,这个Command会被赋给SqlDataAdapter.SelectCommand,在DataAdapter上的Fill方法调用后,该对象会使用SelectCommand属性的内容获取数据。此外还有DeleteCommand, InsertCommand,UpdateCommand属性。
if (string.IsNullOrEmpty(con.ConnectionString))
{
con.ConnectionString = "Data Source=localhost\\sql08; Initial Catalog=ado_test;user ID=sa;password=test;";// Integrated Security=SSPI
}
if (con.State != ConnectionState.Open)
con.Open();
command.CommandText = "select * from dbo.demo;";
command.Parameters.Clear();
command.Connection = con;
sda = new SqlDataAdapter();
sda.SelectCommand = command;
ds = new DataSet();
sda.Fill(ds);
if (ds.Tables.Count > )
this.dgvDemoData.DataSource = ds.Tables[];
con.Close();
查看工作接手的项目源代码,发现其三层架构中数据库方法,如果是查询返回一个DataTable,使用DataAdapter.Fill()方法;如果是执行增加删除更改,则使用Command.ExecuteNonQuery()方法。如果使用实体类,其实可以返回DataReader对象,因为DataReader比DataTable轻量。
下面是我做的一个帮助类,欢迎大家指出问题!
应该注意以下两点:
1. SqlParameterCollection类型没有定义其构造函数,因此传参数只能使用集合类(本例使用Dictionary<string,string>),再将其一个个添加到Command对象的Parameters里面去。
2.使用帮助类的帮助方法,返回一个SqlDataReader对象,这时将Connection对象关闭,会发现SqlDataReader随之关闭无法使用。如果在DataReader使用后手动将其关闭,不仅需要暴露Connection对象且用户可能没有关闭。正确的做法是在执行Command的ExecuteReader时传入枚举值CommandBehavior.CloseConnection,在使用完DataReader并将其关闭,关联的Connection对象也随之关闭。
/// <summary>
/// 查询
/// </summary>
/// <param name="queryString">查询语句</param>
/// <param name="parameters">参数集合</param>
/// <returns>DataReader</returns>
public static SqlDataReader Query(string queryString, IDictionary<string, string> parameters)
{
_command.CommandText = queryString;
_command.CommandType = System.Data.CommandType.Text;
_command.Parameters.Clear();
foreach (KeyValuePair<string, string> item in parameters)
{
_command.Parameters.AddWithValue(item.Key, item.Value);
}
_command.Connection = _con;
_con.Open();
_dataReader = _command.ExecuteReader(CommandBehavior.CloseConnection);//DataReader关闭后,关联的Connection对象也随之关闭
//_con.Close();不能关闭,关闭后DataReader对象无法使用,将其关闭的方法见上一语句
return _dataReader;
} /// <summary>
/// 执行事务操作
/// </summary>
/// <param name="transactionString">执行语句集合</param>
/// <param name="parameters">对应的参数集合的集合</param>
/// <returns>bool,执行是否成功</returns>
public static bool ExecuteNonQuery(IList<string> transactionString, IList<Dictionary<string, string>> parameters)
{
_command.Connection = _con;
_con.Open();
SqlTransaction transaction = _command.Connection.BeginTransaction();
_command.Transaction = transaction;//ExecuteNonQuery要求命令拥有事务,必须赋予它一个事务,否则报错
try
{
for (int i = ; i <= transactionString.Count - ; i++)
{
_command.CommandText = transactionString[i];
_command.CommandType = CommandType.Text;
_command.Parameters.Clear();
foreach (KeyValuePair<string, string> item in parameters[i])
{
_command.Parameters.AddWithValue(item.Key, item.Value);
}
_command.ExecuteNonQuery();
} transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw new Exception(ex.Message);
}
finally
{
transaction.Dispose();
_command.Connection.Close();
} return true;
}
下面是操作代码
string queryString = "select * from dbo.demo d where d.id = @id";
Dictionary<string,string> paras=new Dictionary<string,string>();
paras.Add("@id",""); using (SqlDataReader reader = DataHelper.Query(queryString, paras))//DataReader对象将在本块结束后释放,同时关闭Connection对象
{
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(reader[] + "," + reader[].ToString().Trim() + "," + reader[]);
}
}
Console.WriteLine(DataHelper._con.State.ToString());
}
Console.WriteLine(DataHelper._con.State.ToString()); List<string> listTransactionString = new List<string>();
List<Dictionary<string,string>> listParameters = new List<Dictionary<string,string>>(); string transactionString = "insert into dbo.demo(ID,Name,Remark) values(@id,@name,@remark)";
Dictionary<string, string> parasTransaction = new Dictionary<string, string>();
parasTransaction.Add("@id", "");
parasTransaction.Add("@name", "jack");
parasTransaction.Add("@remark", "cleaner");
listTransactionString.Add(transactionString);
listParameters.Add(parasTransaction); string transactionString2 = "insert into dbo.demo(ID,Name,Remark) values(@id,@name,@remark)";
Dictionary<string, string> parasTransaction2 = new Dictionary<string, string>();
parasTransaction2.Add("@id", "");
parasTransaction2.Add("@name", "mike");
parasTransaction2.Add("@remark", "cleaner");
listTransactionString.Add(transactionString2);
listParameters.Add(parasTransaction2); if(DataHelper.ExecuteNonQuery(listTransactionString,listParameters))
{
Console.WriteLine("transaction succeed!");
}
Console.Read();
请大家不吝指教。
ado.net 学习小结的更多相关文章
- ADO.NET学习小结【1】正在更新...
小弟正在学习ADO.net有误的地方还请大大们批评指出,小弟在此谢过了 一.ADO.net简述: 以前我们写程序尤其是写和数据库有关的应用程序时,你我都得要了解Microsoft ADO COM对象才 ...
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
随机推荐
- insert into select * from 锁表
mysql[192.168.11.187] processid[249] root@localhost in db[zjzc] hold transaction time 197 112069858, ...
- java 二叉搜索树
java二叉查找树实现: 二叉查找树,上图:比根节点小者在其左边,比根节点大者在其右边. 抽象数据结构,上代码: /** * 二叉查找树数据结构(非线程安全): * 范型类型须实现Comparable ...
- the private key for is not installed on this mac
the private key for is not installed on this mac 如果提交 时出现这个问题, 有可能是 keychain重复了, 1:要去keychain中把旧的删除, ...
- 【转】iOS开发者账号和证书
原文网址:http://www.jianshu.com/p/8e967c1d95c2 从Xcode7之后,苹果支持了免证书调试,但是若是需要调试推送功能,或者需要发布App,则需要使用付费的开发者账户 ...
- 从零开始学习ASP.NET MVC 1.0
转自:http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/ASPNET-MVC-1.html <从零开始学习ASP.NET MVC 1.0& ...
- DBcontext应用于已存在数据库
转自:http://www.cnblogs.com/Tally/archive/2013/01/30/2882855.html EF4.1有三种方式来进行数据操作及持久化.分别是Database-Fi ...
- jquery mobile (一)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SQL Server 2005 To Oracle
近期因为项目需要,将SQLServer2005转成Oracle 在这里介绍下转换步骤: 1. 准备好你要转换的数据,如图 2. 右键单击 任务/导出数据,如图 3. 执行完之后就打开选择数据源页面,填 ...
- ASP.NET MVC 中将FormCollection与实体间转换方法 (转)
将Action动作中传递的FormCollection转变成对应的实体,可以使用Controller的TryUpdateModel()方法. [HttpPost] public ActionResul ...
- 作品第一课----获取批量checkbox选中的值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...