C#與資料庫訪問技術總結(八)之ExecuteNonQuery方法

[0]發表於2014-11-01

ExecuteNonQuery方法

ExecuteNonQuery方法主要用來更新資料。

通常使用它來執行UpdateInsertDelete語句。

該方法返回值意義如下:

  對於UpdateInsertDelete語句,返回值為該命令所影響的行數。

  對於所有其他型別的語句,返回值為-1

Command物件通過ExecuteNonQuery方法更新資料庫的過程非常簡單,需要進行的步驟如下:

(1)建立資料庫連線。

(2)建立Command物件,並指定一個SQL InsertUpdateDelete查詢或儲存過程。

(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";

此時userNameuser 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;

後續步驟和引數化命令是相同的,先設定引數然後執行對應命令。


相關文章