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, но... по-видимому, нет.