每个数据库操作都包含在个步骤:
(1)打开一个数据库连接。(前面会以SQL-Server为例,后面讲介绍通用的连库语法)
(2)执行所需的数据库操作并返回结果。
(3)关闭数据库连接。
一、用于连接SQL-Server的SqlConnection类:
每当创建一个新的数据库连接时,总是要指定至少三个重要的数据:
(1)将要连接的SQL-Server实例名
(2)访问服务器的用户授权信息
(3)所要操作的数据库
SqlConnection connection = new SqlConnection();
connection.ConnectionString = “ Server=(local)\SqlExress; ”+
“ User ID= SA; Password=qwerty; ”
“Database=” ;
Connection.Open();
上面这段代码简单明了:首先创建一个SqlConnection对象,接着设置ConnectionString属性,最后打开连接。在做任何操作之前都要先打开连接。
连接字符串包含在个重要的元素。第一个是要连接的数据库的实例的名字。在指定了服务器后,就需要提供登录到服务器所需的安全信息。上段代码表示的是SQL Server的认证模式,也可以使用Windows认证模式,用Windows认证模式时不用提供用户名和密码,因为SQL Server将使用当前登录用户的Windows登录信息。
用Windows认证登录时,需要用Integrated Security=True (或是Integrated Security=SSPI )来代替User ID= SA; Password=qwerty字符串。连接字符串最后一部分要指定所要操作的数据库。
最后,要注意的是连接字符串中有几个可以互换的同义字;如可以使用Data Source或是Data Server代替Server , 用Initial Catalog 代替Database等等。。
二、提交命令与执行存储过程
在打开一个连接后,通常需要创建一个SqlCommand对象去执行操作。
(1) 创建SqlCommand对象
Sqlcommand这个类可以将要与数据库交互的信息保存起来,它存放的是要执行的SQL查询或是存储过程的名字。
SqlCommand command = new SqlCommand();
Command.Connection = connection;
Command.CommandText = “GetDepartments”;
Command.CommandType = CommandTye.StoredProcedure;
GetDepartments是存储过程的名字,这个例子在SQL的存储过程中有介绍。
上面这段代码首先创建一个SqlCommand对象,然后设置一些属性。第一个设置的是Connection,因为每一个命令都是在特定的连接上执行的。另一个重要的属性是CommandText,即需要执行的指定命令。它也可以SQL语句。这里用的是存储过程的名字,这就将存储过程引入了ADO.NET中。
在默认的情况下,CommandText属性接受的是SQL语句,因为这里提供的是存储过程名称,所以需要告诉SqlCommand对象,也就是把CommandType属性设为CommandTye.StoredProcedure。
● 使用输入参数
如果你看过了我在SQL中讲的存储过程的话,你应该知道好多存储过程是要引入参数的,那么怎么把参数代入呢。这就用到了Parameters 这个集合了。
SqlParameter param = command.CreateParameter();
param.ParameterName = “@DepartmentID”;
param.Value = value;
param.Type= Type.Int32;
command.Parameters.Add(param);
还有一个重要的属性是大小(Size),是用来设置那些没有固定大小的参数类型的,如VarChar.
● 使用输出参数
存储过程的输出参数和返回值很相似,它们在存储过程中被赋值,等存储过程执行完成后,调用该过程的函数就可以读取该值。
创建输出参数的代码如下所示:
SqlParameter param = command.CreateParameter();
param.ParameterName = “@HowManyProducts”;
param.Direction = ParameterDirection.Output;
param.Type= Type.Int32;
command.Parameters.Add(param);
这和输入参数的代码几乎一样,除了应为参数提供一个值,并将Direction属性改为ParameterDirection.Output之外。
● 从输出参数中获取结果
Int howManyProducts = int32.Parse(command.Parameters[“@HowManyProducts”].ToString());
用类似上面的这段代码来读取带有输出参数的存储过程的返回值。这可以在执行完存储过程并闭数据连接后,从Parameter对象中读取参数值。在本例中,ToString()用于把返回值转换成一个字符串,然后再解析或转换为整数。
(2) 执行命令和关闭连接
在创建完连接以及SqlCommand对象,并设置了各种参数后,就可以执行命令了。在执行完了数据库操作后要马上关闭连接。
SqlCommand类的三种Execute方法:
ExecuteNonQuery:用于执行不返回任何记录的SQL语句或存储过程。在数据库中执行如更新、插入、删除操作时,应使用这个方法。实际上它返回了一个整数值,用来说明受SQL语句影响的行数。
来个小例子:
connection.Open();
command.ExecuteNonQuery();
command.close();
ExecuteScalar: 它返回的也是单个值,但该返回值是从数据库中读出来的,而不是受影响的行数。它常用于选择一个值的SQL语句。如果用SELECT返回多行或多列,则使用该方法仅返回第一行第一列的数据。
ExecuteReader: 被用于返回多条记录的SELECT语句。它将返回一个包含查询结果的SqlDataReader。一个SqlDataReader对象是以向前且只读的形式逐个读取并返回结果的。SqlDataReader有利的一面是它是从数据库中取数最快的对象,不利的一面是操作前需要一个已打开连接,在它被关闭之前,无法使用同一个连接执行其它任何数据库操作。但这个可以通过把SqlDataReader读取的所有记录存入DataTable对象中解决。
DataTabler 的父类是DataSet,它是一个非常强大的对象,它像一个“内存中”的数据库。DataSet能存储数据表、它们的数据类型、表间的关系等。好多教科书中都用它保持数据,但实际上因为它的复杂的性,它会消耗许多的内存,要尽可能的避免使用它。
下面再来一个简单的例子,它将从数据库中读取一些记录并把它们保存在DataTable中:
conn.Open();
SqlDataReader reader = comm.ExecuteReader();
DataTable table = new DataTable();
table.Load(reader);
reader.Close();
conn.Close();