据我所知,以下两个C#代码示例将信息写入Access数据库,应该会产生相同的输出。然而,第一个是有效的,第二个是错误的。
第一个代码:如果没有AutoNumber主键字段,效果非常好。但直到我尝试添加一行,其中任何字段都没有不同。我必须有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);
试试这个:插入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
);
我不确定您是否正确使用了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);
注意:我还没有测试编辑:添加了一个丢失的昏迷
我在网上搜索了一段时间,试图了解我得到的回复。所有这些都是很好的建议。这是"奥卡姆剃刀"的一个很好的例子。我在"字符串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;