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、ExecuteXmlReader() 返回System.XmlReader实例,用于读取SQLServer中的XML字段的值
数据库字段存的就是xml
<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"; //查询XML字段 using (XmlReader reader = cmd.ExecuteXmlReader()) //由Command实例返回XmlReader的实例 { while (reader.Read()) { if (reader.Name == "author") { Console.WriteLine(reader.ReadInnerXml()); //输出张三 } } } 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,一部分来自逆心的博客