ADO.NET的记忆碎片(一)
Connection类
Connection 对象主要是开启程序和数据库之间的连结。没有利用连结对象将数据库打开,是无法从数据库中取得数据的。这个物件在ADO.NET 的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。Connection类的构造有两种方式:
string strConn ="...";//连接字符串
1、SqlConnection cn = new SqlConnection(strConn);
2、SqlConnection cn = new SqlConnection();
cn.ConnectionString = strConn;
其中连接字符串里面有一些信息要记住,主要包含:服务器实类、数据库、登录服务器的用户名和密码等等,还有其他就不一一列出。
那么我们就简单的写一个连接字符串:
string strConn = "Data Source=.;Initial Catalog=Northwind;User ID=lmf;Password=123456";
这是一个最简单的连接字符串了,是基于这种形式的编排的: key=value; 不过说长不长说短不短的,要是记不住里面的key怎么办呢,可以下面这个办法解决:
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
bldr.DataSource=".";
bldr.InitialCatalog="Northwind";
bldr.UserId="lmf";
bldr.Password="123456";
SqlConnectionStringBuilder类是net类库的一个内置类,ConnectionString中的key的name都在SqlConnectionStringBuilder类实现了属性,可以对应对这些属性赋值,最后调用bldr.ConnectionString属性就可以得到想要的连接字符串了。
Command类
Command 对象主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连结到数据源。Command类的构造有三种方式:
string strConn ="...";//连接字符串
string strSql = "select * from tableName";
SqlConnection cn = new SqlConnection(strConn);cn.Open();
1、SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = strSql;
2、SqlCommand cmd = new SqlCommand(strSql,cn);
3、SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = strSql;
在对于Command类进行构造完成之后,就是相当于我们在数据库的客户端连接了服务器,并且写下了需要的SQL语句,不过还没有运行SQL语句。接下来就是应该执行SQL语句了。使用SqlCommand执行查询,ExecuteReader()方法:
SqlDataReader rdr = cmd.ExecuteReader();
从代码看出,ExecuteReader方法返回一个SqlDataReader对象,就是这个对象来检查查询的结果。SqlDataReader是基于流的方式查询结果。在同一时间可以查看结果中的一行,在移到下一行时,上一行就不能再次访问。有多种方式访问特定的列,基于字段名称或基于序号的查询。
遍历查询的结果:
while(rdr.Read())
{
Console.WriteLine("{0}--{1}",rdr[0],rdr["CustomerName"]);
}
rdr.Close();
以上的代码中,Read()方法的调用同时完成了两项任务:第一,将SqlDataReader放置在结果集的下一行。第二,方法返回一个boolean值,其指示是否存在可运行行。另外要说明一点在Command类执行ExecuteReader()方法返回的rdr的时候,不能直接访问结果集的第一行数据,要在rdr运行Read()方法之后才能访问结果集的第一行。
有时候一个结果集是一个一行一列的,用这个方法的可以实现不过成本太大,可以用这样的方式解决,调用ExecuteScalar()方法:
object obj = new cmd.ExecuteScalar();
ExecuteScalar()方法是返回一个object类型的值。
执行不返回结果集的查询,调用ExecuteNonQuery()方法:
cmd.ExecuteNonQuery();
但是这不能看出SQL语句是否成功执行,其实ExecuteNonQuery()返回int数值。
执行不返回结果集的查询一般有两种情况:
1、数据操作语言查询(DML):insert、 update、 delete 这三种操作是不返回结果集的。
2、数据定义语言查询(DDL):create table 、 alter view 、drop proc
如果是DML语句,返回的int数值是改变数据库表的多少行数
如果是DDl语句,返回的int是-1;