你的位置:首页 > ASP.net教程

[ASP.net教程]Winform开发之SqlCommand常用属性和方法


SqlCommand类表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程,有若干个属性和若干个方法,具体的各类方法使用可以从msdn上找到。

这里介绍几个常用东东

一、属性

     CommandText   获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程。
  CommandTimeout 获取或设置在终止执行命令的尝试并生成错误之前的等待时间。 
  CommandType   获取或设置一个值,该值指示释 CommandText 是SQL语句,存储过程还是表操作。
  Connection     获取或设置 SqlCommand 的此实例使用的 SqlConnection。
  Parameters     获取 SqlParameterCollection。
  Transaction     获取或设置将在其中执行 SqlCommand 的 SqlTransaction。

static void Main(string[] args)    {      string str = "server=.;database=JunTest;uid=sa;pwd=123";      SqlConnection conn = new SqlConnection(str);      SqlCommand cmd = conn.CreateCommand();      cmd.CommandText = "Update Person Set Name = 'Ado.net修改' WHERE Id = @Id";  //设置操作语句      //看看默认的发生错误等待时间(秒)      Console.WriteLine(cmd.CommandTimeout); //30      //指明CommandText是SQL语句,存储过程还是表操作。枚举类型,转到定义可看      Console.WriteLine(cmd.CommandType);  //输出 Text 表示这是一条SQL语句 cmd.CommandText=CommandType.StoredProcedure/CommandType.Text      //SqlCommand的SqlConnection实例对象      Console.WriteLine(cmd.Connection.ConnectionString);   //"server=.;database=JunTest;uid=sa;pwd=123";      //设置参数值      cmd.Parameters.Add("@Id", SqlDbType.Int);      cmd.Parameters["@Id"].Value = 1;      Console.WriteLine(cmd.Parameters["@Id"].Value);   //输出1      conn.Open();      conn.Close();      Console.ReadKey();    }

二、方法

1、SqlCommand.ExecuteNonQuery 方法

对数据库的增删改都用这个操作,只是里面调用的sql语句和存储过程不同

static void Main(string[] args)    {      string str = "server=.;database=JunTest;uid=sa;pwd=123;";      SqlConnection conn = new SqlConnection(str);    //创建连接      SqlCommand cmd = conn.CreateCommand();       //创建命令      cmd.CommandText = "Update Person Set PersonName = 'Ado.net修改' WHERE PersonId = @Id";  //设置操作语句      cmd.Parameters.Add("@Id", SqlDbType.Int);      //添加参数,说明类型      cmd.Parameters["@Id"].Value = 1;          //设置参数值      conn.Open();                    //打开连接      int i = cmd.ExecuteNonQuery();           //执行命令,ExecuteNonQuery由名称看出,只能用于非查询语句      conn.Close();                    //关闭连接      Console.WriteLine(i);                //输出影响行数            Console.ReadKey();    }

2、ExecuteScalar()

创建一个 SqlCommand,然后使用 ExecuteScalar 执行它。 向该示例传递两个字符串,一个字符串表示要插入到表中的新值,另一个字符串用于连接至数据源。 如果已插入新行,则此函数会返回新的“Identity”列值,如果失败,则返回 0。

static public int AddProductCategory(string newName, string connString){  Int32 newProdID = 0;  string sql =    "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "    + "SELECT CAST(scope_identity() AS int)";  using (SqlConnection conn = new SqlConnection(connString))  {    SqlCommand cmd = new SqlCommand(sql, conn);    cmd.Parameters.Add("@Name", SqlDbType.VarChar);    cmd.Parameters["@name"].Value = newName;    try    {      conn.Open();      newProdID = (Int32)cmd.ExecuteScalar();    }    catch (Exception ex)    {      Console.WriteLine(ex.Message);    }  }  return (int)newProdID;}

3、ExecuteReader() 

static void Main(string[] args)    {      string str = "server=.;database=JunTest;uid=sa;pwd=123;";      SqlConnection conn = new SqlConnection(str);    //创建连接      SqlCommand cmd = conn.CreateCommand();       //创建命令      cmd.CommandText = "SELECT * FROM Person";      //设置操作语句      conn.Open();                    //打开连接      //SqlDataReader读取数据      using (SqlDataReader reader = cmd.ExecuteReader())      {        while (reader.Read())        {          Console.WriteLine(reader[0] + ":" + reader[1]);   //输出当前行的第一列,第二列数据        }      }      cmd.CommandText = "SELECT Count(*) FROM Person";      object obj = cmd.ExecuteScalar();          //仅查询第一行第一列      Console.WriteLine((int)obj);      conn.Close();                    //关闭连接            Console.ReadKey();    }

 4、Execute

数据库字段存的就是

<Article> <author age="30">张三</author> <length>12000</length> <price>42</price></Article>

static void Main(string[] args)    {      string str = "server=.;database=JunTest;uid=sa;pwd=123;";      SqlConnection conn = new SqlConnection(str);    //创建连接      SqlCommand cmd = conn.CreateCommand();       //创建命令      cmd.CommandText = "SELECT * FROM Person";      //设置操作语句      conn.Open();                    //打开连接      cmd.CommandText = "SELECT Top 1 ArticleInfo FROM Article"; //查询      using (//由Command实例返回      {        while (reader.Read())        {          if (reader.Name == "author")          {            Console.WriteLine(reader.ReadInner//输出张三          }        }      }      conn.Close();          Console.ReadKey();    }

还有就是以上这些方法的异步版本,本处仅以以下两个方法示例:

  5、BeginExecuteNonQuery() 异步版ExecuteNonQuery()

  6、EndExecuteNonQuery()  异步版ExecuteNonQuery()

class Program  {    static void Main(string[] args)    {      string str = "server=.;database=JunTest;uid=sa;pwd=123;Asynchronous Processing=true";      SqlConnection conn = new SqlConnection(str);      //创建连接      SqlCommand cmd = conn.CreateCommand();         //创建命令      cmd.CommandText = "INSERT INTO Person VALUES(11,'郭嘉')";  //设置操作语句      conn.Open();                      //打开连接      cmd.BeginExecuteNonQuery(BeginCallback, cmd);      //异步执行语句      Console.WriteLine("不管你执没执行完,我继续做我的事!");      Console.ReadKey();    }    public static void BeginCallback(IAsyncResult result)    {      Console.WriteLine("正在执行SQL命令!");      SqlCommand cmd = result.AsyncState as SqlCommand;  //获得异步传入的参数      Console.WriteLine("成功执行命令:" + cmd.CommandText);      Console.WriteLine("本次执行影响行数为:" + cmd.EndExecuteNonQuery(result));      Console.WriteLine("关闭连接!");      cmd.Connection.Close();   //正式关闭连接    }  }

本文一部分来自msdn,一部分来自逆心的博客