【问题标题】:How to write the query for auto-generated ID如何编写自动生成 ID 的查询
【发布时间】:2015-06-05 22:12:31
【问题描述】:

当我输入下拉列表参数作为数据时出现错误,我无法将参数数据添加到发票表中,小计,税和总计的参数数据有自己的值,但它只适用于手动输入数据。

下拉列表参数:

using (var cmd = con.CreateCommand())
{
cmd.CommandText = @"insert into Invoice(subtotal,tax,total) values (@subtotal,@tax,@total); select SCOPE_IDENTITY() as invoiceID;";
cmd.Parameters.AddWithValue("@subtotal", subtotal);
cmd.Parameters.AddWithValue("@tax", tax);
cmd.Parameters.AddWithValue("@total", total);
object OBJinvoiceID = cmd.ExecuteScalar();
}

手动输入:

using (var cmd = con.CreateCommand())
{
cmd.CommandText = @"insert into Invoice(subtotal,tax,total) values (2,2,2); select SCOPE_IDENTITY() as invoiceID;";
object OBJinvoiceID = cmd.ExecuteScalar();
}

【问题讨论】:

  • MySQL 还是 Microsoft SQL?
  • 如果设置了标识列,则不能指定值。从插入中省略它,它会起作用。
  • 我在这里遗漏了什么,还是您插入到与您正在创建的表不同的表中?

标签: c# sql auto-increment


【解决方案1】:
insert into Invoice(subtotal,tax,total) values (@subtotal,@tax,@total); select SCOPE_IDENTITY() as invoiceID;

【讨论】:

  • 是的,我之前尝试过,但我收到一条错误消息,提示“无法将值 NULL 插入 'invoiceID' 列,表;列不允许空值。插入失败。”
  • 错误发生在“object OBJinvoiceID = cmd.ExecuteScalar();”行
【解决方案2】:

我不是 .NET 人,但通过谷歌搜索,我认为您不必在插入查询中提及身份字段:

using (var cmd = con.CreateCommand())
            {
                cmd.CommandText = @"insert into Invoice(subtotal,tax,total) values (@subtotal,@tax,@total);
// the rest
            }

请看一下这个简单的教程: w3schools

【讨论】:

  • 是的,我以前尝试过,但我收到一条错误消息“无法将值 NULL 插入 'invoiceID' 列,表;列不允许空值。插入失败。”
  • 错误发生在“object OBJinvoiceID = cmd.ExecuteScalar();”行
【解决方案3】:

如果你有它在数据库中递增,你不需要在代码中再次改变它。只需从您的对帐单中删除 invoiceID

【讨论】:

  • 是的,我以前尝试过,但我收到一条错误消息“无法将值 NULL 插入 'invoiceID' 列,表;列不允许空值。插入失败。”
  • 错误发生在“object OBJinvoiceID = cmd.ExecuteScalar();”行
  • 重建您的数据库实现,使其类似于: invoiceID int NOT NULL 并确保它设置为身份。检查此link,以便您轻松完成。
【解决方案4】:

不要设置 invoiceID

insert into Invoice(subtotal,tax,total) values (@subtotal,@tax,@total);

【讨论】:

  • 是的,我以前尝试过,但我收到一条错误消息“无法将值 NULL 插入 'invoiceID' 列,表;列不允许空值。插入失败。”
  • 错误发生在“object OBJinvoiceID = cmd.ExecuteScalar();”行
  • 我看到您编辑了您的帖子,向我们展示了创建发票表的代码。它没有 invoiceID 作为身份列,这就是您收到该错误的原因。
【解决方案5】:

只需从值列表中删除该字段:

insert into Invoice(subtotal,tax,total) values (@subtotal,@tax,@total); select SCOPE_IDENTITY() as invoiceID;

您也可以使用 OUTPUT 子句获取值:

into Invoice(subtotal,tax,total) OUTPUT invoiceID values (@subtotal,@tax,@total);

如果您确实想手动设置identity-column,您可以使用SET IDENTITY_INSERT,如here in MSDN 所述

【讨论】:

  • 是的,我以前尝试过,但我收到一条错误消息“无法将值 NULL 插入 'invoiceID' 列,表;列不允许空值。插入失败。”
  • 错误发生在“object OBJinvoiceID = cmd.ExecuteScalar();”行
  • 表的名称是Invoice 还是Order1?有区别吗?当您的表具有列invoiceID 作为标识列时,它不能被插入,所以它必须被忽略。请检查表配置和 IDENTITY_INSERT 设置。
  • 有 2 个表,1 个是发票,另外 1 个是 Order1。它适用于 Order1,因为我手动输入数据。但是我设置为自增的时候报错,这个表的不同是Order1表中的数据是手动输入的,而Invoice中的数据是我从下拉列表中获取的参数
  • 因为我得到了参数 "cmd.Parameters.AddWithValue("@subtotal", subtotal);"在发票表中,所以我得到了错误?如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多