插入错误,使用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();
            }

提前感谢!我真的很欣赏快速反应:)

谢谢!!史蒂夫的帮助!

插入错误,使用c#中的access数据库

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调用中显式指定类型,然后设置值。)