2015-09-04 64 views
0

我有一個類:傳遞null到一個SQL命令

public class Intlist 
{ 
    public int yesFlag{ get; set; } 
    public int? noFlag { get; set; } 
} 

我需要更新數據庫表,但有時值爲null的可空整數。我使用

CommandText = @"UPDATE thetable 
       SET Yes = " + list.yesFlag + 
        ",NoFlag = " + (list.previous == null) ? DBNull.Value : list.previous + 
        ",NextValue = 10" 

我想要得到它,這樣,如果noFlag爲null,它進入數據庫空,但我發現了錯誤:

無法隱式轉換類型'串」到‘布爾’

類型條件表達式不能確定,因爲有 'System.DBNull'和'string'之間沒有隱式轉換

+2

不使用參數? – Sayka

+0

使用您正在使用的命令無法將DBNull傳遞到SQL中。嘗試使用「NULL」作爲值。 – Jason

回答

4

Sayka已經達到目標。 使用參數

您不僅可以保護數據庫免受SQL注入攻擊,還可以利用.Nets內置的功能來處理這些類型的問題。

CommandText = @"UPDATE thetable SET Yes = @yesFlag, NoFlag = @noflag, NextValue = 10"; 
    Command.Parameters.AddWithValue("@yesFlag", list.yesFlag); 
    Command.Parameters.AddWithValue("@noFlag", list.previous); 
+0

這絕對是最乾淨的解決方案。 – jwueller

+0

我改變了它,但現在我'期待參數'@noFlag',它沒有提供。'因爲它的空 – rigamonk

+1

嘗試創建參數,然後傳入值或DBNull.Value(如果值爲null)。然後將參數添加到參數集合中。 - >「SqlParameter noFlag = new SqlParameter(」@ noFlag「,SqlDbType.Int); noFlag.Value =(object)list.previous ?? DBNull.Value; cmd.Parameters.Add(noFlag);」 –

1

強烈建議使用參數。但在你的情況下,你只需輸入'Null'。它會工作。

CommandText = @"UPDATE thetable SET Yes = " + 
      list.yesFlag.ToString() + ",NoFlag = " + (list.previous == null 
      ? "NULL" : list.previous) + ",NextValue = 10"; 

該查詢將會保持原樣。

+0

@cubrr是正確的。這不會編譯。做'(list.previous == null?「NULL」:list.previous)'而不是。 – jwueller

+0

我得到了「無法確定條件表達式的類型,因爲'string'和'int?'之間沒有隱式轉換。 \t「error – rigamonk

+0

您已經在該類中聲明瞭yes標誌,因此您可能需要使用.ToString()。看到我更新的答案 – Sayka