4-1-6
Command对象
1.Command对象概述
数据库连接建立好以后,要操作数据库就得向数据库发送命令信息。所谓命令信息就是指SQL语句或者存储过程名称。除了增删查改数据外,命令信息还可以对数据源执行一些不返回结果集的查询,以及改变数据源结构的数据定义命令信息,如DDL语言。
在ADO.NET中,命令信息是通过Command对象管理的。与数据库建立连接之后,可以使用Command对象执行命令并从数据源返回结果。Command对象工作示意如图4-18所示:
图4-18 Command对象工作示意图
不同的数据提供程序对应着不同的Command对象,请看表4-7。在后面的内容中,主要以SqlCommand对象为例。
表4-7 各个命名空间中的command对象表
提供程序
|
Command类
|
SQL数据提供程序
|
SqlCommand
|
OLE DB数据提供程序
|
OleDbCommand
|
Oracle数据提供程序
|
OracleCommand
|
ODBC数据提供程序
|
OdbcCommand
|
2.Command对象的使用
(1)Command对象的属性和方法
Command对象最常用的属性有CommandText、CommandType和Connection。其中CommandText属性用来获取或设置欲执行的内容,可以是SQL语句或者存储过程名称。CommandType属性用来获取或设置命令类型,指示当前命令是SQL语句还是存储过程名称。当将CommandType属性设置为StoredProcedure时,应将CommandText属性设置为存储过程的名称;CommandType属性设置为Text时,应将CommandText属性设置为SQL语句。Connection属性用来获取或设置Command对象使用的Connection对象。
Command对象最常用的方法有ExecuteNonQuery()、ExecuteReader()和ExecuteScalar()。其中ExecuteNonQuery()方法对连接执行Transact-SQL语句并返回受影响的行数。可以使用ExecuteNonQuery()方法来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行UPDATE、INSERT或DELETE语句,在不使用 DataSet 的情况下更改数据库中的数据。虽然ExecuteNonQuery()方法不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。对于UPDATE、INSERT和DELETE语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也为-1。ExecuteReader()方法将CommandText所设置的命令信息发送到数据库,并生成一个SqlDataReader对象。ExecuteScalar()方法执行查询,并返回查询所返回的结果集中第一行的第一列,忽略其他列或行。使用ExecuteScalar()方法从数据库中检索单个值(例如一个聚合值)。与使用ExecuteReader()方法,然后使用SqlDataReader()返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。请看下面的示例:
private
static void CreateCommand(string queryString,string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandTimeout = 15;
command.CommandType = CommandType.Text;
command.CommandText = queryString;
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}",reader[0], reader[1]));
}
}
}
(2)Command对象组件上机实验
案例学习1:向窗体添加Command对象组件并配置实验
图4-19 向窗体添加四个基本的数据对象组件
u
实验步骤(1):添加SqlCommand组件
Sqlconnection,SqlCommand,oledbconnection,oledbcommand对象组件在默认情况下工具箱中是没有的,需要手动添加。首先右击工具箱弹出菜单;在弹出菜单中点击“选择项”;出现选择工具箱;选中要使用到的Sqlconnection,SqlCommand,oledbconnection,oledbcommand对象组件,在前面的复选框中打上对号;最后点击“确定”,上述组件就出现在工具箱中。如图4-20所示。
图4-20 添加后的四个基本的数据对象组件
u
实验步骤(2):配置SqlCommand组件SQL命令
鼠标左键单击sqlconnection对象,命名为sqlConnection1,在其connectionstring属性之中键入字符串:Data Source=(local);Initial Catalog=school;User ID=sa。其中需要用户提前配置MSSQL数据库的是:可以以用户身份登录,登录名为sa,密码为空;另外有数据库为school。
鼠标左键单击SqlCommand对象,配置其Connection属性为sqlConnection1对象,配置其commandtext为用户自定义的SQL语句,如:select * from student。
u
实验步骤(3):配置oledbCommand组件SQL命令
鼠标左键单击oledbconnection对象,命名为oledbconnection1,在其connectionstring属性之中点击下拉列表框,在弹出的添加连接对话框中点击数据源的更改按钮,在弹出的更改数据源对话框中,选择数据源为“Microsoft Access数据库文件”,点击确定后浏览本机Access数据库文件即可。
鼠标左键单击oledbCommand对象,配置其Connection属性为oleDbConnection1对象,配置其commandtext为用户自定义的SQL语句,如:select * from teacher。
案例学习2:通过编写代码来设置Command对象实验
在代码编辑器里面,通过编写代码的方式创建Command对象的过程参见图4-21所示:
图4-21 创建命令对象图
上述代码的含义是:SqlCommand1对象为SqlCommand类的实例化,表示为创建的Command对象名称。其中的strSQL是字符串类型,可以被赋值任何有效的SQL语句。
在对象创建过程中,将SQL语句作为参数传递给SqlCommand类的构造函数,这样命令对象SqlCommand1就可以用来访问数据了。构造函数还有3种类型的重载,参见表4-8:
表4-8 SqlCommand类的构造函数表
名称
|
说明
|
初始化SqlCommand类的新实例。
|
|
用查询文本初始化SqlCommand类的新实例。
|
|
初始化具有查询文本和SqlConnection的SqlCommand类的新实例。
|
|
使用查询文本、一个SqlConnection以及SqlTransaction来初始化SqlCommand类的新实例。
|
u
实验步骤(1):新建窗体
建立窗体文件form2,从工具箱之中拖拽一个button按钮到窗体上,用鼠标双击button按钮,开始进行下面代码的编辑工作。
u
实验步骤(2):编写代码
该部分代码完成,单击button按钮后,向school数据库的student表之中插入一条数据。
private
void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=(local);Initial Catalog=school;User ID=sa";
conn.Open();
SqlTransaction sqltran = conn.BeginTransaction();
string sqlstring = "insert into student(sno,sname) values(3390220,'
张三')"
;
SqlCommand comm = new SqlCommand(sqlstring, conn);
comm.Transaction = sqltran;
int p = comm.ExecuteNonQuery();
sqltran.Commit();
comm.Dispose();
comm.Clone();
conn.Dispose();
conn.Close();
}
4-1-7
.NET中的事务处理
在应用程序的数据处理过程中,经常会遇到一种情况:当某一数据发生变化后,相关的数据不能及时被更新,造成数据不一致,以至发生严重错误。例如在一个销售系统里,通过帐单处理模块完成对销售表的数据处理,客户端销售人员已经将库存货品销售出去,但与销售表相关的库存表尚未及时更新,结果娶她销售人员再读取库存数据就会出现数据不一致的现象。
为此,在数据库基础理论中我们引入事务的概念。所谓事务就是这样的一系列操作,这些操作被视为一个操作序列,要么全做,要么全部做,是一个不可分割的程序单元。在数据库数据处理中经常会发生数据更新事件,为了保证数据操作的安全与一致,大型数据库服务器都支持事务处理,以保证数据更新在可控的范围内进行。ADO.NET通过Connection对象的BeginTransaction()方法实现对事务处理的支持,该方法返回一个实现IDbTransaction接口的对象,而该对象是在System.Data中被定义的。
1.事务处理命令
调用Connection对象的BeginTransaction()方法,返回的是一个DbTransaction对象。DbTransaction对象常用的事务处理命令包括下面三个:
n
Begin:在执行事务处理中的任何操作之前,必须使用Begin命令来开始事务处理;
n
Commit:在成功将所有修改都存储于数据库时,才算是提交了事务处理;
n
Rollback:由于在事务处理期间某个操作失败,而取消事务处理已做的所有修改,这时将发生回滚;
不同命名空间里的DbTransaction类名称是不同,表示也不同。参见表4-9:
表4-9 DbTransaction类在不同命名空间里的表
OdbcTransaction
|
表示对Odbc数据源进行的SQL 事务处理。
|
OleDbTransaction
|
表示对OleDb数据源进行的SQL事务处理。
|
OracleTransaction
|
表示对Oracle数据库进行的事务处理。
|
SqlTransaction
|
表示要对SQL Server数据库进行的Transact-SQL事务处理。
|
在后面的内容中,我们主要讨论SqlTransaction对象。
2.SqlTransaction对象的使用
(1)SqlTransaction对象的属性和方法
SqlTransaction对象表示要对数据源进行的事务处理,其常用的属性有Connection。Connection属性是用来获取与该事务关联的SqlConnection对象,或者如果该事务不再有效,则为空引用。SqlTransaction对象常用的方法有Save()、Commit()和Rollback(),其中Save()方法在事务中创建保存点(它可用于回滚事务的一部分),并指定保存点名称;Commit()方法用来提交数据库事务,Rollback()方法从挂起状态回滚事务。
3.
案例学习:ADO.NET实现事务处理实验
u
实验步骤(1):新建窗体
在窗体文件form2上,从工具箱之中再拖拽一个button按钮到窗体上,命名为button2,用鼠标双击button2按钮,开始进行下面代码的编辑工作。
u
实验步骤(2):编写代码
该部分代码完成实现事务处理的基本功能。
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=(local);Initial Catalog=school;User ID=sa";
conn.Open();
//
注意此处为一个事务开始之处
SqlTransaction sqltran = conn.BeginTransaction();
string sqlstring = "insert into student(sno,sname) values(3390220,'
张三')";
SqlCommand comm = new SqlCommand(sqlstring, conn);
comm.Transaction = sqltran;
int p = comm.ExecuteNonQuery();
sqltran.Commit();
//
此处为一个事务正常结束之处
comm.Dispose();
comm.Clone();
conn.Dispose();
conn.Close();
}
通过上面的案例我们可以看出,在ADO.NET的应用程序中引入事务处理大致分四步:
n
第一步:通过连接对象产生事务对象sqltran;
n
第二步:将事务对象sqltran绑定到命令对象的Transaction属性;
n
第三步:执行命令对象;
n
第四步:通过事务对象sqltran的Commit()方法,提交事务,或者通过事务对象sqltran的Rollback()方法回滚事务。
本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/216006,如需转载请自行联系原作者