C#表单/访问数据库插入带有“自动编号”字段的行

时间:2012-03-22 20:23:17

标签: c# ms-access autonumber

以下两个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);

3 个答案:

答案 0 :(得分:2)

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

SELECT @@IDENTITY

返回的结果将是与刚刚添加的记录关联的自动编号字段。您的原始insert 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
     );

答案 1 :(得分: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);

注意:我还没有测试过 修改:添加了一个缺失的昏迷

答案 2 :(得分:1)

我在网上搜索了一段时间,试图围绕我得到的回答。所有这些都是很好的建议。这是“奥卡姆剃刀”的一个很好的例子。我在“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;