C#與數據庫訪問技術之ExecuteNonQuery方法


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;

后續步驟和參數化命令是相同的,先設置參數然后執行對應命令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM