我的程序出了问题,我在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();
}
提前谢谢!我真的应对快速反应:)
谢谢!史蒂夫的帮助!
答案 0 :(得分:2)
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无法准确地将输入值转换为基础数据库类型。
这是一篇非常有趣的文章
答案 1 :(得分:0)
我怀疑这是问题所在:
cmd.Parameters.AddWithValue("@Score", score.Text);
我希望得分为数字字段,例如:
cmd.Parameters.Add("@Score", OleDbType.Integer).Value = numericScore;
...其中numericScore
是int
类型的变量(或任何适当的变量)。
同样的可能对Id
也是如此 - 我们不知道字段类型是什么。基本上,您应该尝试使参数类型与字段类型尽可能匹配。如果你需要进行任何字符串转换(例如解析文本框中的值),我强烈建议在.NET代码中执行此操作,而不是将其留在数据库中。
(虽然您仍然可以使用AddWithValue
,但我认为最好在Add
调用中明确指定类型,然后设置值。)