C# 简洁、MS Access、整数和;没有给出一个或多个所需参数的值“;

C# 简洁、MS Access、整数和;没有给出一个或多个所需参数的值“;,c#,ms-access,visual-studio-2012,oledb,dapper,C#,Ms Access,Visual Studio 2012,Oledb,Dapper,在第三次尝试在下面的代码中插入时,我不断收到错误“一个或多个必需参数没有给定值”。前两次尝试效果良好。我现在运行的是.NET4.0,而不是VS2012中的MS Access。无论我使用的是2007年的accdb还是2000-2003年的mdb,这个问题似乎都是一致的。我正在使用以下代码进行测试: using Dapper; using System.Data.OleDb; namespace DapperTest { class Program { static st

在第三次尝试在下面的代码中插入时,我不断收到错误“一个或多个必需参数没有给定值”。前两次尝试效果良好。我现在运行的是.NET4.0,而不是VS2012中的MS Access。无论我使用的是2007年的accdb还是2000-2003年的mdb,这个问题似乎都是一致的。我正在使用以下代码进行测试:

using Dapper;

using System.Data.OleDb;

namespace DapperTest {
    class Program {
        static string accdb = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=W:\Projects\CSharp\DapperTest\DuhData.accdb;";
        static string mdb = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=W:\Projects\CSharp\DapperTest\DuhData.mdb";

        static void Main(string[] args) {
            var dis = new DisMember { FName = "Heza", LName = "Dufus", Initials = "", HighestGrade = 1 };

            using (OleDbConnection conn = new OleDbConnection(mdb)) {
                try {
                    conn.Execute("DROP TABLE DisMember;");
                }
                catch (System.Exception) { }

                conn.Execute("CREATE TABLE DisMember ( "
                            +     "FName CHAR, "
                            +     "Initials CHAR, "
                            +     "LName CHAR, "
                            +     "HighestGrade Number "
                            + "); "
                );

                // First attempt: This works in Dapper but does not include HighestGrade
                conn.Execute( "INSERT INTO DisMember(FName, Initials, LName) "
                            + "VALUES (@FName, @Initials, @LName);", dis
                            );

                // Second attempt: This works without Dapper and includes HighestGrade
                using (OleDbCommand cmd = conn.CreateCommand()) {
                    conn.Open();
                    cmd.CommandText = "INSERT INTO DisMember(FName, Initials, LName, HighestGrade) VALUES (?, ?, ?, ?); ";
                    cmd.Parameters.AddWithValue("FName", dis.FName);
                    cmd.Parameters.AddWithValue("Initials", dis.Initials);
                    cmd.Parameters.AddWithValue("LName", dis.LName);
                    cmd.Parameters.AddWithValue("HighestGrade", 1);
                    cmd.ExecuteNonQuery();
                }

                // Third attempt: This does not work with Dapper because of HighestGrade
                conn.Execute("INSERT INTO DisMember(FName, Initials, LName, HighestGrade) "
                            + "VALUES (@FName, @Initials, @LName, @HighestGrade);", dis
                            );
            }
        }
    }

    public class DisMember {
        public DisMember( ) { }
        public string FName { get; set; }
        public string LName { get; set; }
        public string Initials { get; set; }
        public int HighestGrade { get; set; }
    }
}
那么,这是一个衣冠楚楚的错误吗?OleDB?访问2013?还是别的什么


非常感谢您提供的所有线索。

好吧,我想出来了。我预感到我在别处找到的另一个答案表明Dapper中存在与列/参数顺序有关的bug,我按字母顺序修改代码如下:

conn.Execute( "INSERT INTO DisMember(FName, HighestGrade, Initials, LName) "
            + "VALUES (@FName, @HighestGrade, @Initials, @LName);", dis
            );

它是有效的。根据我找到的文章,这个错误已经被巧妙地修复了,但是。。。显然不是。

好吧,我想出来了。我预感到我在别处找到的另一个答案表明Dapper中存在与列/参数顺序有关的bug,我按字母顺序修改代码如下:

conn.Execute( "INSERT INTO DisMember(FName, HighestGrade, Initials, LName) "
            + "VALUES (@FName, @HighestGrade, @Initials, @LName);", dis
            );

它是有效的。根据我找到的文章,这个错误已经被巧妙地修复了,但是。。。显然不是。

将数据库中的HighestGrade设置为整数?这是一个好建议,但这(最终)是针对现有数据的。我必须像现在这样处理它。:)然后在您的类定义中使用最高级的浮点!!!或者进行一些转换。另一件值得尝试的事情,但是。。。它会导致完全相同的错误…:(这个问题只是SQL中的一个错误吗?它是否与?在数据库中设置HighestGrade为整数相同?这是一个很好的建议,但这(最终)是针对现有数据的。我必须按当前的方式处理它。:)然后在类定义中设置HighestGrade为浮点!!!或者进行一些转换。另一件值得尝试的事情,但是。。。它会导致完全相同的错误…:(问题是否只是SQL中的错误?是否与相同?不幸的是,我错误地认为它是Dapper中的错误。这是MS Access的问题。不幸的是,我错误地认为它是Dapper中的错误。这是MS Access的问题。