2013-12-16 26 views
1

因此,我可以成功地將新波段添加到數據庫,但有時候我不需要所有參數。在我的數據庫中,「Picture」和「Description」允許有「null」值,那麼爲什麼C#會一直給我提供參數未提供的錯誤消息?添加到數據庫中:參數未提供,但在SQL列中不需要

public static void AddBand(Band band){ 
    try 
    { 
     String sql = "INSERT INTO Band(Naam, Picture, Description, Facebook, Twitter) VALUES(@p1,@p2,@p3,@p4,@p5)"; 
     DbParameter p1 = Database.AddParameter("@p1", band.Name); 
     DbParameter p2 = Database.AddParameter("@p2", band.Picture); 
     DbParameter p3 = Database.AddParameter("@p3", band.Description); 
     DbParameter p4 = Database.AddParameter("@p4", band.Facebook); 
     DbParameter p5 = Database.AddParameter("@p5", band.Twitter); 

     Database.ModifyData(sql, p1, p2, p3, p4, p5); 

     MessageBox.Show("Band successfully added."); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

} 
+0

C#「null」值與SQL中使用的值不同。 嘗試使用'DBNull.Value'。 – jAC

+0

即使它在您的查詢中,您是否有時不提供該參數? – Chris

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

4

在ADO.NET中,如果參數具有null的值,它不發送。如果您的意思是代表數據庫null,則需要將.NET null替換爲DBNull.Value。是的,它很糟糕。

DbParameter p1 = Database.AddParameter("@p1", (object)band.Name ?? DBNull.Value); 
DbParameter p2 = Database.AddParameter("@p2", (object)band.Picture ?? DBNull.Value); 
DbParameter p3 = Database.AddParameter("@p3", (object)band.Description ?? DBNull.Value); 
DbParameter p4 = Database.AddParameter("@p4", (object)band.Facebook ?? DBNull.Value); 
DbParameter p5 = Database.AddParameter("@p5", (object)band.Twitter ?? DBNull.Value); 

另外,使用類似「短小精悍」,以節省您的痛苦:

conn.Execute(@"INSERT INTO Band(Naam, Picture, Description, Facebook, Twitter) 
    VALUES(@Name,@Picture,@Description,@Facebook,@Twitter)", band); 

它會:簡化數據訪問代碼巨大,和b:右自動獲取這些晦澀難懂的規則。

+1

是的,謝謝。這幫助和工作。很好的解釋。感謝別人幫助我。 – user2759675

0

你應該與它的參數的整數執行SP和傳遞DBNull.Value作爲價值爲那些誰打算爲空

+0

您可以在'INSERT INTO'中使用'NULL'。所以這是一個解決方案,但並不能真正解決問題。 – jAC

+1

@Pathfinder謝謝,任何想法我可以做到這一點?我不明白我該如何解決這個問題 – user2759675

0

如果參數爲空:

  • 送了它作爲DBNull.Value 或
  • 不要把它所有,但在存儲過程的參數定義默認值:

這裏是它的代碼:

CREATE PROCEDURE <MyProcedure> 
@p1 NVARCHAR(100) = NULL, 
@p2 INT = NULL 
... 
AS 
BEGIN 
... 
END 
0

總是提供數據庫pa如果查詢指定了它們,則用你的查詢進行比較。如果它是可空的,請檢查它併爲該參數提供一個DBNull.Value。

public static void AddBand(Band band){ 
    try 
    { 
     String sql = "INSERT INTO Band(Naam, Picture, Description, Facebook, Twitter) VALUES(@p1,@p2,@p3,@p4,@p5)"; 
     DbParameter p1 = Database.AddParameter("@p1", band.Name); 
     DbParameter p2 = Database.AddParameter("@p2", band.Picture 
      ?? DBNull.Value); 
     DbParameter p3 = Database.AddParameter("@p3", band.Description 
      ?? DBNull.Value); 
     DbParameter p4 = Database.AddParameter("@p4", band.Facebook); 
     DbParameter p5 = Database.AddParameter("@p5", band.Twitter); 

     Database.ModifyData(sql, p1, p2, p3, p4, p5); 

     MessageBox.Show("Band successfully added."); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

} 
+1

謝謝,這個工程。 – user2759675

相關問題