【问题标题】:C# Form / Access Database insert row with "autonumber" fieldC# Form/Access 数据库插入行与“自动编号”字段
【发布时间】:2012-04-07 11:08:28
【问题描述】:

以下两个 C# 代码示例,将信息写入 Access 数据库,据我所知,应该产生相同的输出。但是第一个有效,第二个给出错误。

第一个代码:没有自动编号主键字段,效果很好。但直到我尝试添加任何字段都没有不同的行。我必须拥有 AUTONUMBER 唯一 ID,(显然是因为缺乏不确定性)

string vsql = string.Format("insert into Log values " +
    "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}')",
    comboBox1.Text,
    comboBox2.Text,
    int.Parse(textBox1.Text),
    int.Parse(textBox1.Text),
    textBox3.Text,
    textBox2.Text,
    addRemove
    );

第二个代码:返回错误信息:

“附加信息:查询值和目标字段的数量不一样。”

据我所知,它们都具有相同数量的字段。而且,两者都没有唯一的 AUTONUMBER ID 字段,我无法添加该字段,因为我不知道如何将代码“插入”或“不插入”任何内容到自动编号字段中。同样,我显然需要这个领域。任何帮助表示赞赏!任何一种代码都是可以接受的,只要我有一个自动编号字段,当我的表单提交新记录时会自动更新。

string vsql = string.Format("INSERT INTO Log (" +
    "Location, " +
    "Drug, " +
    "Quantity, " +
    "Strength, " +
    "Initials, " +
    "'Date'," +
    "add_Remove" +
    ") VALUES (" +
    comboBox1.Text,
    comboBox2.Text,
    int.Parse(textBox1.Text),
    int.Parse(textBox1.Text),
    textBox3.Text,
    textBox2.Text,
    addRemove);

【问题讨论】:

  • 你没有错过占位符吗? {0}?
  • "insert" or "not insert" 是指插入还是更新?
  • 您使用的是什么数据库?你知道你可以在创建数据库时添加自动增量选项。
  • 第一个将起作用,未经编辑,只要没有两个相同的字段。如果我可以修复错误消息,第二个示例似乎也可以正常工作。
  • @MilkyWayJoe 是对的;您正在使用Format,但在第二个版本中没有格式占位符。第二个也没有像第一个那样正确地引用字符值或使用# 字符格式化日期值。

标签: c# ms-access autonumber


【解决方案1】:

试试这个:在你的 insert sql 命令之后,执行另一个 sql 调用:

SELECT @@IDENTITY

返回的结果将是与刚刚添加的记录关联的自动编号字段。您原来的插入 sql 命令不应该尝试插入自动编号字段值。直接省略即可。

另外,您的第二个 sql 文本有问题。将其重新格式化为如下所示:

string vsql = string.Format("insert into Log (Location,Drug,Quantity,"+
   "Strength,Initials,Date,add_Remove values" +
   "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}')",
     comboBox1.Text,
     comboBox2.Text,
     int.Parse(textBox1.Text),
     int.Parse(textBox1.Text),
     textBox3.Text,
     textBox2.Text,
     addRemove
     );

【讨论】:

  • 实际上两个string.Format 版本都应该被删除,而不是使用参数化查询
  • @ConradFrix:我不确定他使用的是 DAO 还是 ADO……也不确定 DAO 是否支持参数。但原则上,你是 100% 正确的。
  • 当有人在 C# 中使用 DAO 或 ADO 而不是 System.Data.OleDb 时,参数化查询支持是他们最不关心的问题。
【解决方案2】:

我不确定你是否正确使用String.Format

尝试改进此代码:

string vsql = string.Format(
    "INSERT INTO Log ( Location, Drug, Quantity, Strength, Initials, [Date], add_Remove) "   +
    "VALUES ('{0}', '{1}', {2}, {3}, '{4}', '{5}', '{6}')",
    comboBox1.Text, comboBox2.Text, int.Parse(textBox1.Text), int.Parse(textBox1.Text),
    textBox3.Text, textBox2.Text, addRemove);

注意:我没有测试过 编辑:添加了缺少的昏迷

【讨论】:

    【解决方案3】:

    我在网上搜索了一段时间,试图将我的头脑围绕着我得到的回复。所有这些都是很好的建议。这是“奥卡姆剃刀”的一个很好的例子。我在“string vsql”行之前插入了以下内容,它就像一个魅力。

    感谢所有回复!

    OleDbCommand dbCommand;
    OleDbDataReader dbReader;
    new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\MyDatabase.accdb");
    dbCommand = new OleDbCommand("select count(*) as Record_Count from Log", vcon);
    dbReader = dbCommand.ExecuteReader();
    if (dbReader.Read() == true)
        rowCount = dbReader["Record_Count"].ToString();
    else
        return;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      相关资源
      最近更新 更多