Command对象可以使用数据命令直接与数据源进行通信。例如,当需要执行一条插入语句,或者删除数据库中的某条数据的时候,就需要使用到Command对象。Command对象的属性包括了数据库在执行某个语句的所有必要的信息,这些信息如下所示:
1) Name:Command的程序化名称。
2) Connection:对Connection对象的引用。
3) CommandType:指定是使用SQL语句或存储过程,默认情况下是SQL语句。
4) CommandTest:命令对象包含的SQL语句或存储过程名。
5) Parameters:命令对象的参数。
通常情况下,Command对象用于数据的操作,例如执行数据的插入和删除,也可以执行数据库结
构的更改,包括表和数据库。示例代码如下所示。
string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //创建数据库连接字串
SqlConnection con = new SqlConnection(str);
con.Open();//打开数据库连接
SqlCommand cmd = new SqlCommand("insert into news values ('title')",con);//建立Command对象
上述代码使用了可用的构造函数并指定了查询字符串和Connection对象来初始化Command对象cmd。通过指定Command对象的方法可以对数据执行具体的操作。
ExecuteNonQuery方法
当指定了一个SQL语句,就可以通过ExecuteNonQuery方法来执行语句的操作。ExecuteNonQuery不仅可以执行SQL语句,开发人员也可以执行存储过程或数据定义语言语句来对数据库或目录执行构架操作。而使用ExecuteNonQuery时,ExecuteNonQuery并不返回行,但是可以通过Command对象和Parameters进行参数传递。示例代码如下所示。
string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //创建数据库连接字串
SqlConnection con = new SqlConnection(str);
con.Open(); SqlCommand cmd = new SqlCommand("insert into news values ('title')",con);
cmd.ExecuteNonQuery(); //执行SQL语句
运行上述代码后,会执行“insert into news values ( ' title' )”这条SQL语句并向数据库中插入数据。值得注意的是,修改数据库的SQL语句,例如常用的INSERT、UPDATE以及DELETE并不返回行。同样,很多存储过程同样不返回任何行。当执行这些不返回任何行的语句或存储过程时,可以使用ExecuteNonQuery。但是ExecuteNonQuery语句也会返回一个整数,表示受已执行的SQL语句或存储过程影响的行数,示例代码如下所示。
string str = "server='(local)';database='mytable';uid='sa';pwd='sa'";
SqlConnection con = new SqlConnection(str); //创建连接对象
con.Open(); //打开连接
SqlCommand cmd = new SqlCommand("delete from mynews", con); //构造Command对象
Response.Write("该操作影响了("+cmd.ExecuteNonQuery().ToString()+")行");//执行SQL语句
上述代码执行了语句“delete from mynews”并将影响的行数输出到字符串中。开发人员能够使用ExecuteNonQuery语句进行数据库操作和数据库操作所影响行数的统计。
ExecuteNonQuery执行存储过程
ExecuteNonQuery不仅能够执行SQL语句,同样可以执行存储过程和数据定义语言来对数据库或目录执行构架操作如CREATE TABLE等。在执行存储过程之前,必须先创建一个存储过程,然后在SqlCommand方法中使用存储过程。在SQL Server管理器中可以新建查询创建存储过程,示例代码如下所示。
CREATE PROC getdetail ( @id int, @title varchar(50) OUTPUT )
AS SET NOCOUNT ON
DECLARE
@newscount int SELECT
@title=mynews.title,
@newscount=COUNT(mynews.id)
FROM mynews
WHERE (id=@id)
GROUP BY mynews.title
RETURN @newscount
上述存储过程返回了数据库中新闻的标题内容。"@id”表示新闻的id,"@title"表示新闻的标题,此存储过程将返回"@title"的值,并且返回新闻的总数。上述代码可以直接在SQL管理器中菜单栏中单击【新建查询】后创建的TAB中使用,同样也可以使用SqlCommand对象进行存储过程的创建,示例代码如下所示。
string str = "CREATE PROC getdetail" +
"(" +
"@id int," +
"@title varchar(50) OUTPUT" +
")" +
"AS" +
"SET NOCOUNT ON" +
"DECLARE @newscount int" +
"SELECT @title=mynews.title,@newscount=COUNT(mynews.id)" +
"FROM mynews" +
"WHERE (id=@id)" +
"GROUP BY mynews.title" +
"RETURN @news count";
SqlCommand cmd = new SqlCommand(str, con);
cmd.ExecuteNonQuery(); //使用cmd的ExecuteNonQuery方法创建存储过程
创建存储过程后,就可以使用SqlParameter调用命令对象Parameters参数的集合的Add方法进行参数传递,并指定相应的参数,示例代码如下所示。
string str = "server='(local)';database='mytable';uid='sa';pwd='Sa'";
SqlConnection con = new SqlConnection(str);
con.Open(); //打开连接
SqlCommand cmd = new SqlCommand("getdetail", con); //使用存储过程
cmd.CommandType = CommandType.StoredProcedure; //设置Command对象的类型
SqlParameter spr; //表示执行一个存储过程
spr = cmd.Parameters.Add("@id", SqlDbType.Int); //增加参数
id spr = cmd.Parameters.Add("@title", SqlDbType.NChar,50); //增加参数title
spr.Direction = ParameterDirection.Output; //该参数是输出参数
spr = cmd.Parameters.Add("@count", SqlDbType.Int); //增加count参数
spr.Direction = ParameterDirection.ReturnValue; //该参数是返回值
cmd.Parameters["@id"].Value = 1; //为参数初始化
cmd.Parameters["@title"].Value = null; //为参数初始化
cmd.ExecuteNonQuery(); //执行存储过程
Label1.Text = cmd.Parameters["@count"].Value.ToString(); //获取返回值
上述代码使用了现有的存储过程,并为存储过程传递了参数,当参数被存储过程接受并运行后,会返回一个存储过程中指定的返回值。当执行完毕后,开发人员可以通过cmd.Parameters来获取其中一个变量的值。
ExecuteScalar方法
Command的Execute方法提供了返回单个值的功能。在很多时候,开发人员需要获取刚刚插入的数据的ID值,或者可能需要返回Count(*),Sum(Money)等聚合函数的结果,则可以使用ExecuteScalar方法。示例代码如下所示。
string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //设置连接字串
SqlConnection con = new SqlConnection(str); //创建连接
con.Open(); //打开连接
SqlCommand cmd = new SqlCommand("select count(*) from mynews", con); //创建
Command Label1.Text = cmd.ExecuteScalar().ToString(); //使用ExecuteScalar执行
上述代码创建了一个连接,并创建了一个Command对象,使用了可用的构造函数来初始化对象。当使用ExecuteScalar执行方法时,会返回单个值。ExecuteScalar方法同样可以执行SQL语句,但是与ExecuteNonQuery方法不同的是,当语句不为SELECT时,则返回一个没有任何数据的System.Data.SqlClient.SqlDataReader类型的集合。 ExecuteScalar方法执行SQL语句通常是用来执行具有返回值的功能的SQL语句,例如上面所说的当插入一条新数据时,返回刚刚插入的数值的ID号。这种功能在自动增长类型的数据库设计中,经常被使用到,示例代码如下所示。
string str = "server='(local)';database='mytable';uid='sa';pwd='sa'"; //设置连接字串
SqlConnection con = new SqlConnection(str); //创建连接 con.Open(); //打开连接
SqlCommand cmd = new SqlCommand("insert into mynews values ('this is a new title!') SELECT @@IDENTITY as 'bh'", con); //打开连接
Label2.Text = cmd.ExecuteScalar().ToString(); //获取返回的ID值
上述代码使用了“SELECT @@IDENTITY as”语法,“SELECT @@IDENTITY”语法会自动获取刚刚插入的自动增长类型的值,例如,当表中有100条数据时,插入一条数据后数据量就成101,为了不需要再次查询就获得101这个值,则可以使用“SELECT @@IDENTITY as”语法。运行结果如图7-23所示。
当使用了“SELECT @@IDENTITY as”语法进行数据操作时,ExecuteScalar方法会返回刚刚插入的数据的ID,这样就无需再次查询进行刚刚插入的数据的信息的获取。