【问题标题】:INSERT statement tries to insert data to column, which is not given in the codeINSERT 语句尝试向列插入数据,代码中没有给出
【发布时间】:2019-05-02 18:18:46
【问题描述】:

我尝试将数据插入图片所示表格中的 ansatID 列。用户必须在 DataGridView 中标记一行,在左侧的 textBox1 中插入他的 ID,然后按下按钮“Tilføj ansat til vagten”,他的 ID 应该插入到 DataGridView 中标记行的列 ansatID 中。但我收到错误消息:''无法将值 NULL 插入'Dato'列,表'Vagtplan.dbo.Vagter';列不允许空值。插入失败。该语句已终止。'' 我想知道为什么该语句会尝试将数据插入“Dato”列?我试过以下代码:

 private void button5_Click(object sender, EventArgs e)
    {

        try
        {
            String ConnectionString = @"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True";
            SqlConnection myconnection = new SqlConnection(ConnectionString);
            myconnection.Open();

            SqlCommand AddNumberCommand = myconnection.CreateCommand();
            AddNumberCommand.CommandText = "INSERT INTO dbo.Vagter ([ansatID]) VALUES (@ansatID)";

            AddNumberCommand.Parameters.Add("@ansatID", SqlDbType.Int).Value = textBox1.Text;

            AddNumberCommand.ExecuteNonQuery();

            myconnection.Close();
            MessageBox.Show("Du har valgt vagten.");
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

列 ansatID 是表中的外键,列 ansatID 可以为空。 预期结果是应将 ansatID 插入到 DataGridView 中标记行的列 ansatID 中。该表显示在所附图片上。

【问题讨论】:

  • 根据错误信息,Dato 是不可为空的类型。由于您没有为其提供值,因此 sql 将插入 null。您应该在 SSMS 中使该类型可以为空。
  • 您的插入需要为Dato 列提供值,因为Dato 不允许空值并且没有默认值。当您插入一行时,Dato 中必须有一些内容。它什么都没有。你需要提供一些东西。
  • 当您INSERT 一行时,每列的值都会被评估。如果未传递任何值,则使用 DEFAULT 值,如果没有,则该列将填充 NULL。您尚未在 INSERT 中定义 Dato 并且它似乎没有 DEFAULT 值,因此使用了 NULL,但是,由于该列设置为 NOT NULL,因此不允许使用该值INSERT 失败。
  • 另一方面,很高兴看到一个格式良好的问题和有人使用带有Parameters.Add 的参数化语句;继续努力:)

标签: c# sql-server winforms insert


【解决方案1】:

他的 ID 应该插入到 ansatID 列中,用于标记行 数据网格视图

这是错误的方法。您尝试更新一列。你的主键是什么?

UPDATE dbo.Vagter set [ansatID] = @ansatID WHERE MyPK = @myPk;

【讨论】:

  • 主键在'Dato'列中定义
  • 那你可以UPDATE dbo.Vagter set [ansatID] = @ansatID WHERE Dato = @dato;你应用dato参数,方法和第一个参数一样。在这里,您可以找到如何从选定行中获取值:link
【解决方案2】:

问题是您使用的是INSERTINSERT 语句插入完整的 数据。在您的情况下,由于您只为一列指定一个值,SQL Server 将尝试将 NULL 插入您未命名的所有列中,这就是引发您所看到的错误的原因。您的 INSERT 语句格式正确(做得很好!),但这并不是您真正想要的语句。

您正在寻找UPDATE 声明。它看起来像这样:

...
AddNumberCommand.CommandText = "UPDATE dbo.Vagter SET [ansatID] = @ansatID WHERE <Primary Key Field(s) Here> = <Appropriate Value(s)>";
...

【讨论】:

  • 好吧,现在我明白了:) 但是如何定义(在 Sql 语句中)标记行中的主键值?
  • 我有点希望你已经将它存储在某个地方,这样你就知道在你的数据网格中显示什么了。 :) 您可能需要分两步,查询他们突出显示的行以更新,以便您知道将输入的数据发送到哪里。
  • 好吧,如果我必须分两步完成,这个 UPDATE 语句会是什么样子?
  • 恐怕我的 C# 只能读代码,不能写代码。不过,您可以发布另一个问题,询问如何获取在数据网格中选择的行的主键值,我相信这里有人可以提供帮助。
猜你喜欢
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多