插入错误,在c#中使用访问数据库

时间:2013-06-28 15:34:43

标签: c#

我的程序出了问题,我在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();

            }
提前谢谢!我真的应对快速反应:)

谢谢!史蒂夫的帮助!

2 个答案:

答案 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无法准确地将输入值转换为基础数据库类型。

这是一篇非常有趣的文章

How Data Access Code Affects Database Performance

答案 1 :(得分:0)

我怀疑这是问题所在:

cmd.Parameters.AddWithValue("@Score", score.Text);

我希望得分为数字字段,例如:

cmd.Parameters.Add("@Score", OleDbType.Integer).Value = numericScore;

...其中numericScoreint类型的变量(或任何适当的变量)。

同样的可能Id也是如此 - 我们不知道字段类型是什么。基本上,您应该尝试使参数类型与字段类型尽可能匹配。如果你需要进行任何字符串转换(例如解析文本框中的值),我强烈建议在.NET代码中执行此操作,而不是将其留在数据库中。

(虽然您仍然可以使用AddWithValue,但我认为最好在Add调用中明确指定类型,然后设置值。)