1

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

            }

提前致谢!我真的很欣赏快速响应:)

谢谢!!史蒂夫的帮助!

4

2 回答 2

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

这是一篇非常有趣的文章

数据访问代码如何影响数据库性能

于 2013-06-28T15:37:21.727 回答
0

我怀疑这是问题所在:

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

我希望分数是一个数字字段,例如:

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

...numericScore类型变量在哪里int(或任何适当的变量)。

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

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

于 2013-06-28T15:37:11.440 回答