插入错误,使用c#中的access数据库
本文关键字:中的 access 数据库 使用 错误 插入 | 更新日期: 2023-09-27 18:20:14
我的程序有问题,cmd出错。ExecuteNonQuery();,告诉我"标准表达式中的数据类型不匹配。"
using (OleDbConnection myCons = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=QuizDatabase.accdb"))
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into HighScores ([ID],[Name],[Score]) values (?,?,?)";
cmd.Parameters.AddWithValue("@ID", id.Text);
cmd.Parameters.AddWithValue("@Name", name.Text);
cmd.Parameters.AddWithValue("@Score", score.Text);
cmd.Connection = myCons;
myCons.Open();
cmd.ExecuteNonQuery();
myCons.Close();
}
提前感谢!我真的很欣赏快速反应:)
谢谢!!史蒂夫的帮助!
AddWithValue确实很方便,但可能会导致错误。如果任何字段是数字类型,则需要将传递给AddWithValue的值转换为适当的类型。现在,您的代码传递所有字符串。可能你需要
cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(id.Text));
cmd.Parameters.AddWithValue("@Name", name.Text);
cmd.Parameters.AddWithValue("@Score", Convert.ToInt32(score.Text));
对了。如果ID列是自动编号列,则应避免传递该值。
我同意Jon Skeet的观点,即最好避免AddWithValue(使用Sql Server和其他优化数据库引擎时应该避免)。AddWithValue无法准确地将输入值转换为基础数据库类型。
这是一篇非常有趣的文章
数据访问代码如何影响数据库性能
我怀疑这就是问题所在:
cmd.Parameters.AddWithValue("@Score", score.Text);
我希望分数是数字字段,所以类似于:
cmd.Parameters.Add("@Score", OleDbType.Integer).Value = numericScore;
其中CCD_ 1是类型为CCD_。
Id
也可能存在相同的-我们不知道字段类型是什么。基本上,您应该尽量使参数类型与字段的类型匹配。如果您需要进行任何字符串转换(例如,解析文本框中的值),我强烈建议您在.NET代码中进行转换,而不是将其留给数据库。
(虽然您仍然可以使用AddWithValue
,但我认为最好在Add
调用中显式指定类型,然后设置值。)