Dapper, MS Access, целые числа и "не задано значение для одного или нескольких обязательных параметров"

Я продолжаю получать сообщение об ошибке "нет значения для одного или нескольких обязательных параметров" при третьей попытке вставить код ниже. Первые две попытки работают нормально. Я работаю в.NET 4.0, против MS Access в VS 2012. И эта проблема, кажется, непротиворечивой, использую ли я 2007 ACDB или 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; }
    }
}

Итак, это ошибка в Dapper? OleDB? Access 2013? Или что-то другое?

Любые подсказки очень ценятся.

1 ответ

Решение

Хорошо, я понял это. Воспользовавшись догадкой о другом ответе, который я нашел в другом месте и который показал, что в Dapper была ошибка, связанная с порядком столбцов / параметров, я изменил код в алфавитном порядке следующим образом:

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

И это работает. Согласно статье, которую я нашел, эта ошибка была исправлена ​​в Dapper, но... по-видимому, нет.

Другие вопросы по тегам