2011-03-28 342 views
1

我一直在嘗試使用相同的SqlConnectionSqlCommand對象來執行不同的命令。使用sql命令不止一次使用不同的命令

第一個檢查重複,第二個插入數據,如果用戶輸入的數據不重複。

這裏是我的代碼示例:

 using (SqlConnection conn = new SqlConnection(ConnStr)) 
     { 
      string Command = "SELECT CountryName FROM [Countries] WHERE CountryName = @Name"; 

      using (SqlCommand comm = new SqlCommand(Command, conn)) 
      { 
       comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20); 
       comm.Parameters["@Name"].Value = Name; 

       comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit); 
       comm.Parameters["@IsVisible"].Value = IsVisible; 

       conn.Open(); 

       if (comm.ExecuteScalar() == null) 
       { 
         Command = "INSERT INTO [Countries] (CountryName, IsVisible) VALUES (@Name, @IsVisible);"; 
         comm.ExecuteNonQuery(); 
       } 
     } 

我試圖用一個連接保存訪問數據庫。

的問題是:

第一個命令運行不錯,但其插入到 數據庫 第二個命令將無法正常工作(不加任何 記錄到數據庫)和當我 試圖顯示受影響的行它 給了我-1!

的問題是:

這是檢查 重複記錄約束 國內獨一無二的理想方式?以及爲什麼第二個 命令沒有執行?

+2

因爲[連接池](http://msdn.microsoft.com/zh-cn/library/8xx3tyca.aspx),您不明確*需要*使用相同的數據庫連接來保存到數據庫的行程,幾乎肯定會被使用(除非你明確禁用了它)。如果您執行兩次(使用相同的連接或不),將有兩個調用數據庫。 – steinar 2011-03-28 23:07:12

+0

感謝您的提示+1 ..但在您看來,您是否認爲有一種方法可以在我的情況下節省旅行以減少Db的負擔? – lKashef 2011-03-28 23:11:44

+0

絕對是如果你使用存儲過程。這是一個選擇嗎? – steinar 2011-03-28 23:15:22

回答

2

當你重寫與INSERT語句中Command變量,你只需修改一個名爲Command你已經先前定義的字符串。您不修改存儲在SqlCommand對象內的命令文本。

嘗試:

comm.CommandText = 「INSERT INTO [國家](國家或地區名稱,ISVISIBLE)VALUES(@Name,@IsVisible);」;

+0

這很簡單..謝謝你=) – lKashef 2011-03-28 23:23:37

3

您正在更改string Command的值,但您實際上從未實際更改SqlCommand comm中的命令字符串。

0

我的事情,我建議你的SELECT語句來單獨插入.. 成才,如:

private void Insert() 
    { 
     using (SqlConnection conn = new SqlConnection(ConnStr)) 
     {    
     string Command = "INSERT INTO [Countries] (CountryName, IsVisible) VALUES (@Name, @IsVisible)";  

     using (SqlCommand comm = new SqlCommand(Command, conn)) 
     { 
     comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20); 
     comm.Parameters["@Name"].Value = Name; 
     comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);     comm.Parameters["@IsVisible"].Value = IsVisible; 
     conn.Open(); 

     comm.ExecuteNonQuery(); 

     conn.Close(); 
     } 

} 

private void SelectInsert() 
{ 
     using (SqlConnection conn = new SqlConnection(ConnStr)) 
    {    
    string Command = "SELECT CountryName FROM [Countries] WHERE CountryName = @Name";    
    using (SqlCommand comm = new SqlCommand(Command, conn)) 
    { 
    comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 20); 
    comm.Parameters["@Name"].Value = Name; 

    conn.Open(); 
    if (comm.ExecuteScalar() == null) 
    { 

      Insert(); //your save method 

    } 
    } 
} 

問候

+0

感謝您的時間:) ..但改變CommandText做到了! =) – lKashef 2011-03-28 23:22:04

+0

:)是啊........ – Crimsonland 2011-03-28 23:26:24

2

要回答你的第一個問題:不,這是而不是確保國名的唯一性。在您的數據庫中,您應該定義您的Countries表,以便CountryName是主鍵(或者,您可以將其他一些列聲明爲PK並在CountryName上定義唯一約束)。

然後,嘗試插入重複值將引發異常,您可以正確處理該異常(丟棄現有記錄,覆蓋它,提示用戶輸入不同的值等)。

通過您的方法檢查唯一性被認爲是不好的,因爲A)它將屬於數據庫本身的邏輯放入您的應用程序代碼中;和B)它引入了潛在的競爭條件,其中一些其他應用程序或線程會在讀取數據庫和寫入數據之間插入一個值。

+0

+1 ..我希望我也可以把這個標記爲答案..但我最初的問題是「爲什麼我沒有得到預期的輸出」..但是相反,我認爲你處理異常是非常正確的。儘管數字B對我來說有點時尚! =) – lKashef 2011-03-28 23:25:48

+1

@IKashef:B是比較少見的,儘管在許多不同線程同時訪問數據庫的環境中,它會經常發生,足以讓你失去工作。 :)我多年來繼承了其他人編寫的許多應用程序/數據庫,並且在開發人員依靠其應用程序代碼確保唯一性的每種情況下,表中都有許多重複項。這是一種保證最終無法工作的方法。 – MusiGenesis 2011-03-28 23:41:34

+0

你剛剛救了我! ..因爲我的應用程序允許不止一個人添加東西,並且有時候我們需要所有團隊成爲數據輸入的東西! ..非常感謝,如果你有任何文章要避免這個問題,當數據庫被操縱或同時訪問時,請張貼.. + 1 – lKashef 2011-03-29 00:07:08