关闭

ADO.Net连接

209人阅读 评论(0) 收藏 举报
分类:

连接SQLServer

  • 连接字符串:程序通过连接字符串 指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等。
  • 项目内嵌mdf文件形式的连接字符串"DataSource=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;IntegratedSecurity=True;UserInstance=True"。“.\SQLEXPRESS”表示“本机上的SQLEXPRESS实例”,如果数据库实例名不是SQLEXPRESS,则需要修改。“Database1.mdf”为mdf的文件名。
  • ADO.Net中通过SqlConnection类创建到SQLServer的连接,SqlConnection代表一个数据库连接,ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理。
Tip:

Close:关闭以后还能打开。

Dispose:直接销毁,不能再次使用。

为什么用using,using在出了作用域以后调用Dispose,SqlConnection、FileStream等的Dispose,内部都会做这样的判断:判断有没有close,如果没有Close就先Close再Dispose。

(sqlconnection在程序中一直保持它open可以吗?对于数据库来说,连接是非常宝贵的资源,一定要用完了就close、dispose。)


SqlCommand

  • ExecuteNonQuery 返回值是执行的影响行数。
  • ExecuteScalar 方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型。
  • ExecuteReader 执行返回多行结果集。


SQLHelper

封装一个 SQLHelper类方便使用,提供ExecuteDataTable(string sql,paramsSqlParameter[] parameters)、ExecuteNonQuery(string sql,paramsSqlParameter[] parameters)、ExecuteScalar(string sql,paramsSqlParameter[] parameters)等方法。 

网上有微软提供的最全的SQLHelper类,是EnterpriseLibrary中的一部分。


DataSet

  • 每次读取数据都创建连接、执行Command得到SqlDataReader太麻烦。
  • SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做的好处就是无论查询结果有多少条,对程序占用的内存都几乎没有影响。
  • SqlDataReader对于小数据量的数据来说带来的只有麻烦,优点可以忽略不计。ADO.Net中提供了数据集的机制,将查询结果填充到本地内存中,这样连接断开、服务器断开都不影响数据的读取。
  • DataSet dataset = new DataSet(); SqlDataAdapter adapter = newSqlDataAdapter(cmd); adapter.Fill(dataset);
  • SqlDataAdapter是DataSet和数据库之间沟通的桥梁。数据集DataSet包含若干表
  • DataTable,DataTable包含若干行DataRow。
  • foreach (DataRow row in dataset.Tables[0].Rows)row["Name"]。


DataSet的更新

  • 可以更新行row["Name"] ="yzk"、删除行datatable.Rows.Remove()、新增行datatable.NewRow()。这一切都是修改的内存中的DataSet,没有修改数据库
  • 可以调用SqlDataAdapterUpdate方法将对DataSet的修改提交到数据库,Update方法有很多重载方法,可以提交整个DataSet、DataTable或者若干DataRow。但是需要为SqlDataAdapter提供DeleteCommand、UpdateCommand、InsertCommand它才知道如何将对DataSet的修改提交到数据库,由于这几个Command要求的格式非常苛刻,因此开发人员自己写非常困难,可以用SqlCommandBuilder自动生成这几个Command,用法很简单:newSqlCommandBuilder(adapter)。查看生成的Command(没有直接赋值给SqlDataAdapter,看SqlCommandBuilder的)。SqlCommandBuilder要求表必须有主键。
  • 通过DataRow的RowState可以获得行的状态(删除、修改、新增等);
  • 调用DataSet的GetChanges()方法得到变化的结果集,降低传递的资源占用。


弱类型DataSet的缺点

  • 只能通过列名引用,dataset.Tables[0].Rows[0][“Age”],如果写错了列名编译时不会发现错误,因此开发时必须要记着列名。
  • int age =Convert.ToInt32(dataset.Rows[0][“Age”]),取到的字段的值是object类型,必须小心翼翼的进行类型转换,不仅麻烦,而且容易出错。
  • 将DataSet传递给其他使用者,使用者很难识别出有哪些列可以供使用
  • 运行时才能知道所有列名,数据绑定麻烦,无法使用Winform、ASP.Net的快速开发功能。
  • 自己动手写强类型DataSet(类型化DataSet,TypedDataSet),创建继承自DataSet的PersonDataSet类,封装出int?Age等属性和bool IsAgeNull等方法,向PersonDataSet中填充。


可空数据类型

  • C#中值类型(int、Guid、bool等)是不可以为空的,inti=null是错误的,因此int、bool等这些类型不能表示数据库中的“Null”。因此C#提供了“可空类型”这种语法,只要在类型后加?就构成了可空的数据类型,比如int?、bool?,这样int? i=null就可以了。解决数据库中int可以为null,而C#中int不能为null的问题。
  • 判断可空类型是否为空,i==null或者i.HasValue;
  • 得到可空变量的值,int i1=(int)i.Value或者int i1=i.Value。
  • 类型转换:不可空类型赋值给可空类型无需显式转换(一定成功),可空类型赋值给不可空类型则需显式转换(不一定成功)。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场