添加到数据库:参数未提供但SQL列中不需要

时间:2013-12-16 20:01:23

标签: c# sql

所以,我可以成功地向数据库中添加一个新的波段,但有时我不需要所有的参数。在我的数据库中,“Picture”和“Description”被允许具有“null”值,那么为什么C#不断给我提供参数未提供的错误消息?

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);
    }

}

4 个答案:

答案 0 :(得分:4)

在ADO.NET中,如果参数的值为null,则 不会发送 。如果您要表示数据库null,则需要将DBNull.Value替换为null。是的,很糟糕。

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);

将:a:大大简化数据访问代码,b:自动获取这些模糊的规则。

答案 1 :(得分:0)

您应该使用其全部参数执行sp并将DBNull.Value作为值传递给那些打算为null的人

答案 2 :(得分:0)

如果参数为null:

  • 将其作为DBNull.Value发送 或
  • 根本不发送,但在存储过程中为该参数定义默认值:

这是代码:

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

答案 3 :(得分:0)

如果查询指定了数据库参数,请始终使用查询提供数据库参数。如果它可以为空,请检查它并为该参数提供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);
    }

}