ADO.NET_Command对象

来源:互联网 发布:第二次海湾战争知乎 编辑:程序博客网 时间:2024/06/14 19:13

原文地址:http://www.dingos.cn/index.php?topic=1286.0


   ADO.NET允许初始化Command对象时,在数据库上直接执行命令。Command对象执行许多指向数据库服务器的命令,并处理这些命令所返回的数据
    与数据库建立连接之后,可以使用 Command 对象执行命令并从数据源返回结果

【Command对象提供程序】
.NET Framework 数据提供程序Command 类SQL 数据提供程序SqlCommandOLE DB 数据提供程序OleDbCommandOracle 数据提供程序OracleCommandODBC 数据提供程序OdbcCommand

【SqlCommand对象】表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。无法继承此类。
可以重置 CommandText 属性并重复使用 SqlCommand 对象。但是,在执行新的命令或先前命令之前,必须关闭 SqlDataReader。
  • 创建Command对象时,可以用命令文本初始化对象;还可以用事务对象初始化这些命令:
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "myStoredProcedureName";   //存储过程
    cmd.CommandText = "authors";   //表名
    cmd.CommandTest = "Select * From authors";   //SQL语句
  • 需要将Command对象关联到一个数据库连接,这个对象用于和数据库通信:
    SqlConnection conn = new SqlConnection();
    SqlCommand cmd = new SqlCommand("myCommandText");
    cmd.Connection = conn;
  • 使用CommandType属性指定将要执行的命令类型,可用的类型如下:
    • StoredProcedure:作为命令而提供的文本服务器上将要执行的存储过程的名称。如果存储过程需要参数,就要在Command对象的Paramenters属性中添加所需的参数;
    • TableDirect:提供的文本是数据存储器中的表名称。可以指定多个表,提供以逗号分割且不带空格的一系列表即可。
    • Text:所提供的文本是一条特殊的SQL命令。这是默认的命令类型。

【创建SqlCommand对象】
  • Command对象的属性设置为默认值:
    SqlCommand cmd = new SqlCommand();
  • 在一开始用命令文本初始化对象:
    SqlCommand cmd = new SqlCommand("myCommandText");
  • 添加Command对象要用到的Connection对象:
    SqlConnection conn = new SqlConnection();
    SqlCommand cmd = new SqlCommand( ("myCommandText", conn);
  • 用事务对象初始化:
    SqlConnection conn = new SqlConnection();
    SqlTransaction trans = conn.BeginTransaction();
    SqlCommand cmd = new SqlCommand( ("myCommandText", conn);

【SqlCommand对象常用属性】
  • CommandText
    获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程。
  • CommandType
    获取或设置一个值,该值指示如何解释 CommandText 属性。默认为Text
  • Connection
    获取或设置 SqlCommand 的此实例使用的 SqlConnection。
  • Parameters
    获取 SqlParameterCollection。
  • Transaction
    获取或设置将在其中执行 SqlCommand 的 SqlTransaction。

【SqlCommand对象执行命令】
  • ExecuteNonQuery方法:
    对连接执行 Transact-SQL 语句并返回受影响的行数。
    查询不返回结果集或者不返回除了所影响的行数之外的任何值。用于Insert、Update和Delete返回结构为影响的行数;其他语句如果执行成功,返回-1
  • ExecuteScalar方法:
    用于执行将返回一个值的命令。该方法用于执行任何一条命令且返回结果集的第1行第1列中的值。
  • ExecuteReader方法:
    用于执行命令,并将结果集作为DataReader对象返回。
  • ExecuteXMLReader方法:
    将结果作为XMLReader对象返回。

【设置SqlCommand对象】
  • 用SQL 语句的Command设置
    SqlCommand objComm=new SqlCommand();
    objComm.CommandText="SQL 语句";
    objComm.CommandType=CommandType.Text ;
    objComm. Connection=objConnection;
  • 用存储过程的Command设置
    SqlCommand objComm=new SqlCommand();
    objComm.CommandText="sp_DeleteName";
    objComm.CommandType=CommandType. StoredProcedure ;
    objComm. Connection=objConnection;
    Sp_DeleteName是在SQL Server服务器上创建的存储过程

【参数化查询】
    参数化查询对于执行性能, 防止Sql注入攻击都非常重要.ADO.NET数据提供程序一般都支持参数化查询,但各自的类型有各自的约定, 如SqlXX的支持命名参数, 而对于Access访问使用OLEDBXX则只支持匿名参数.
SqlCommand cmd=new SqlCommand(
    "Select count(*) from LoginU where Username=@un and Pwd=@pwd", con);
SqlParameter spUn = cmd.Parameters.Add("@un", SqlDbType.VarChar, 50);
spUn.Value = "Jack";
SqlParameter spPwd = cmd.Parameters.Add("@un", SqlDbType.VarChar, 50);
spPwd.Value = "123";
con.Open();
int count=(int)cmd.ExecuteScale();
con.Close();
if(count>0)
//成功登录
else
//用户名或密码不对

【执行存储过程】
1. Command对象的CommandText属性要设为“存储过程名”
2. Command对象的CommandType属性要设为“CommandType.StoredProcedure”
3. 如果有输入参数则需要为输入参数赋值
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = "TestOutput";
4. 如果有输出参数则可以在执行存储过程后获取输出参数的值
程序代码:
SqlParameter spID = new SqlParameter("@id", SqlDbType.Int); // 定义参数
spID.Direction = ParameterDirection.Output; // 指明参数为输出参数
cmd.Parameters.Add(spID); // 将参数添加的参数集中
5. 如果没有参数则可以执行Command(根据具体情况使用ExecuteReader、ExecuteNonQuery、ExecuteScalar等)
注意:如果使用ExecuteReader执行Command命令返回DataReader对象,要获取输出参数的值需要将DataReader关闭

【存储过程使用示例】
SqlConnection con=new SqlConnection("Server=.;Database=northwind;uid=sa;pwd=;");
SqlCommand cmd=new SqlCommand("SalesByCategory", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter pa1=cmd.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15);
pal.Value = "Beverages";
con.Open();
SqlDataReader rd=cmd.ExecuteReader();
Console.WriteLine("{0},{1}",rd.GetName(0),rd.GetName(1));
while (myReader.Read()){
   Console.WriteLine("{0},${1}",rd.GetString(0), rd.GetDecimal(1));
}
rd.Close();
con.Close();