ExecuteNonQuery方法主要用來更新數據。
通常使用它來執行Update、Insert和Delete語句。
該方法返回值意義如下:
對於Update、Insert和Delete語句,返回值為該命令所影響的行數。
對於所有其他類型的語句,返回值為-1。
Command對象通過ExecuteNonQuery方法更新數據庫的過程非常簡單,需要進行的步驟如下:
(1)創建數據庫連接。
(2)創建Command對象,並指定一個SQL Insert、Update、Delete查詢或存儲過程。
(3)把Command對象依附到數據庫連接上。
(4)調用ExecuteNonQuery方法。
(5)關閉連接。
下面依次看一看更新、添加和刪除操作。
更新記錄
下面的代碼顯示了一個簡單的數據庫更新操作,其作用是修改學號為“20013150“的學生信息:
1 string updateQuery="Update studentInfo set sName=‘小李‘"+"Where ID=‘200131500145‘"; 2 3 //新建連接 4 5 SqlConnection conn=new SqlConnection(); 6 7 conn.Connectionstring=connectionString; 8 9 //新建命令對象 10 11 SqlCommand cmd=new SqlCommand(updateQuery,conn); 12 13 // 調用命令對象的ExecuteNonQuery方法 14 15 conn.Open(); 16 17 int RecordsAffected=cmd. ExecuteNonQuery(); 18 19 conn.Close();
代碼本身非常簡單。
但需要注意的是ExecuteNonQuery方法的返回值,這個方法返回命令影響的記錄數量。
例如,如果命令是SQL UPDATE語句,則將返回被更新記錄的數量。
相似的,當執行INSERT命令時返回插入到數據庫的記錄的數量。
如果期望命令更新記錄,但是ExecuteNonQuery方法返回的值為0,則說明更新操作失敗了。
(1)字符串拼接方式
也許讀者已經注意到了在上面的代碼中updateQuery是在程序中定義的,其操作固定在了程序中,用戶無法和應用程序交互,
而在實際中命令應該根據用戶輸入的信息進行處理,比如用戶在文本框中輸入了新的用戶信息以后單擊更新,
然后程序將用戶輸入的數據更新到數據庫。
要達到這個目的,就必須依據用戶輸入的數據來構造命令。構造命令可以有多種形式。
假設現在已經將用戶輸入的數據保存到了變量中:
String userName="小李";
String userId="200131500145";
此時userName和user id變量分別保存了學生姓名和學號,命名可以通過如下拼接命令字符串的形式構造:
string updateQuery="Update student Set sName=‘ "+username+" ‘ "+"Where ID=‘ "+user id+" ‘ "
這種拼接字符串構造命令的方式是最直接最簡單的,但也是最不安全的。
可以采用參數化來實現相同的功能。
(2)參數化方式
SQL Server.NET數據提供程序和OLE DB.NET數據提供程序在指定參數時區別非常大,下面分別介紹。
①在SQL Server .NET數據提供程序中指定參數
SQL Server .NET數據提供程序支持指定的參數。
當命令文本在指定具體命令時,必須指出哪一部分是在運行時進行設置的,也就是必須指出哪部分是參數。
那些可變的部分即參數,它們都必須有一個@前綴。
Update student set sName=@userName where ID=@userid
這個命令中,@userName和@userid為參數,它們的值在運行時是可變的。
當命令中帶參數時,構造Command對象的方法和前面的並沒有任何不同:
string updateQuery="Update student Set sName=@username"+"Where ID=@userid" ;
SqlConnection conn=new SqlConnection(connectionString);
SqlCommand cmd=new SqlCommand(updateQuery, conn);
現在就有了包含參數的Command對象。
目前需要做的就是為命令中的每一個參數創建一個Parameter對象。
SqlCommand類提供了一個Parameters集合屬性,用以為命令保存所有的參數。
通過調用Parameters集合的Add方法,在集合中添加一個新的參數。
crud. Parameters.Add (" @userName", userName);
cmd. Parameters.Add("@userid", userid);
上面Add方法中的第一個參數為命令中的參數名,后面的userName則是用於定義的變量,保存了用戶輸入的信息。
除此之外,可以用其他方法創建Parameter對象,然后添加到集合中。
SqlParameter paramUserName= new SqlParameter("@userName",SqlDbType.NVarChar,50);
paramUserName.Value=userName;
cmd. Parameters.Add(paramUserName) ;
上面的代碼
首先新建了一個SqlParameter對象,命名為paramUserName,該對象對應於命令中的@userName參數,在SqlParameter的構造函數中為參數指定了類型為SqlDbType.NVarChar,長度為50。
接着為paramUserName指定了Value屬性,表示在運行時將用這個值代替命令中的@userName。
最后是調用Add方法將參數添加到命令的參數集合中,這一步很容易被初學者忽略,要格外注意。
帶參數的命令設置好以后可以和往常一樣執行ExecuteNonQuery方法,這並沒有任何不同。
②除了直接使用SQL語句作為命令以外,還可以使用存儲過程作為命令內容。
為了ADO.NET應用程序中執行存儲過程,需要把存儲過程的名稱賦給命令文本,同時將命令的CommandType屬性設置為存儲過程。
如果存儲過程返回值,或者有一些參數,還必須創建參數,並把創建的參數添加到命令的Parameters集合中。
在數據庫Student添加如下名為UpdateStudentInfo的存儲過程,
代碼如下:
1 CREATE PROCEDURE UpdateStudentInfo 2 3 ( 4 5 @userName nvarchar(20), 6 7 @user id nvarchar(20); 8 9 ) 10 11 AS 12 13 Update studentInfo 14 15 Set sName=@userName Where ID=@user id 16 17 GO
為了執行該存儲過程,必須創建一個Command對象並將存儲過程的名稱傳入它的構造函數。
SqlConnection conn=new SqlConnection(connectionString);
SqlCommand cmd=new SqlCommand("UpdateStudentInfo", conn);
接下來要把命令的CommandType屬性設置為StoredProcedure。
cmd.CommandType=CommandType.StoredProcedure;
后續步驟和參數化命令是相同的,先設置參數然后執行對應命令。