【问题标题】:adding to database: parameter not supplied but it's not required in SQL column添加到数据库:未提供参数,但在 SQL 列中不需要
【发布时间】:2013-12-17 04:17:20
【问题描述】:

所以,我可以成功地向数据库中添加一个新波段,但有时我不需要所有参数。在我的数据库中,“图片”和“描述”被允许具有“空”值,那么为什么 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);
    }

}

【问题讨论】:

  • C# null 值与 SQL 中使用的值不同。尝试使用DBNull.Value。
  • 您是否有时不提供参数,即使它在您的查询中?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 这里缺少很多上下文。即,Database 是什么,ModifyData 究竟做了什么,你是否在IDbCommand 的参数集合上利用AddWithValue 方法?

标签: c# sql


【解决方案1】:

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

或者,使用“dapper”之类的东西来减轻你的痛苦:

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

这将 a:极大地简化您的数据访问代码,并且 b:自动正确地获取这些晦涩的规则。

【讨论】:

  • 好的,谢谢。这有帮助并且奏效了。很好的解释。也感谢其他人帮助我。
【解决方案2】:

如果参数为空:

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

代码如下:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您可以在INSERT INTO 中使用NULL。所以这是一个解决方案,但并不能真正解决问题。
    • @Pathfinder 谢谢,知道我该怎么做吗?我不知道如何解决这个问题
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多