ExecuteNonQuery方法
ExecuteNonQuery方法主要用來更新資料。
通常使用它來執行Update、Insert和Delete語句。
該方法返回值意義如下:
對於Update、Insert和Delete語句,返回值為該命令所影響的行數。
對於所有其他型別的語句,返回值為-1。
Command物件通過ExecuteNonQuery方法更新資料庫的過程非常簡單,需要進行的步驟如下:
(1)建立資料庫連線。
(2)建立Command物件,並指定一個SQL Insert、Update、Delete查詢或儲存過程。
(3)把Command物件依附到資料庫連線上。
(4)呼叫ExecuteNonQuery方法。
(5)關閉連線。
下面依次看一看更新、新增和刪除操作。
更新記錄
下面的程式碼顯示了一個簡單的資料庫更新操作,其作用是修改學號為“20013150“的學生資訊:
string updateQuery="Update studentInfo set sName='小李'"+"Where ID='200131500145'";
//新建連線
SqlConnection conn=new SqlConnection();
conn.Connectionstring=connectionString;
//新建命令物件
SqlCommand cmd=new SqlCommand(updateQuery,conn);
// 呼叫命令物件的ExecuteNonQuery方法
conn.Open();
int RecordsAffected=cmd. ExecuteNonQuery();
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的儲存過程,
程式碼如下:
CREATE PROCEDURE UpdateStudentInfo ( @userName nvarchar(20), @user id nvarchar(20); ) AS Update studentInfo Set sName=@userName Where ID=@user id GO
為了執行該儲存過程,必須建立一個Command物件並將儲存過程的名稱傳入它的建構函式。
SqlConnection conn=new SqlConnection(connectionString);
SqlCommand cmd=new SqlCommand("UpdateStudentInfo", conn);
接下來要把命令的CommandType屬性設定為StoredProcedure。
cmd.CommandType=CommandType.StoredProcedure;
後續步驟和引數化命令是相同的,先設定引數然後執行對應命令。