標籤:
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,一部分來自逆心的部落格
Winform開發之SqlCommand常用屬性和方法