Ich habe eine Produktklasse und versuchte, Dapper mit Access-Datenbank auszuwerten. Auswählen, Löschen und Einfügen funktionieren gut, aber ich habe ein Problem mit dem Update-Vorgang. Es funktioniert in einer Weise nur Code unten)
Als ich versuchte, die Beschreibung basierend auf ProductNumber zu ändern, funktioniert es (updateStatement2) und Beschreibung wird aktualisiert, aber als ich versuchte, die ProductNumber basierend auf Description (updateStatement1) zu ändern, funktioniert es nicht und ProductNumber wird nicht aktualisiert. Es ist mir fremd. Ist es ein Fehler oder fehlt mir etwas? Meine Datenbank ist nur eine einfache und keine Primärschlüssel festgelegt. Ich habe unten einen Screenshot beigefügt
(Für weitere Informationen siehe meinen Code unten)
public class Products
{
public string ProductNumber { get; set; }
public string Description { get; set; }
}
static void Main(string[] args)
{
using (var con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"))
{
Products product2 = new Products();
product2.ProductNumber = "P2";
product2.Description = "TestProduct2Changed";
var updateStatement2 = @"Update Products Set Description = @Description Where ProductNumber = @ProductNumber";
int outp2 = con.Execute(updateStatement2, product2);
Products product1 = new Products();
product1.ProductNumber = "P3Changed";
product1.Description = "TestProduct3";
var updateStatement1 = @"Update Products Set ProductNumber = @ProductNumber Where Description = @Description";
int outp1 = con.Execute(updateStatement1, product1);
}
}
Ich benutze Dapper Version 1.50.2. Dies ist mein Datenbank-Screenshot
Es sieht so aus, als ob ADO Access-Befehle erfordern, dass die Parameter in derselben Reihenfolge wie in der SQL-Abfrage vorhanden sind.
In Ihrem ursprünglichen Code werden die Parameter für die funktionierende Abfrage in der Abfragezeichenfolge in alphabetischer Reihenfolge angezeigt.
Update Products Set Description = @Description Where ProductNumber = @ProductNumber
Dies funktioniert, weil die Eigenschaften alphabetisch aus "product2" stammen. Dies mag nicht beabsichtigt sein, es könnte nur die Reihenfolge sein, in der die Reflektion sie auflistet.
Bei einer fehlgeschlagenen Abfrage werden die Parameter in umgekehrter alphabetischer Reihenfolge angezeigt.
Update Products Set ProductNumber = @ProductNumber Where Description = @Description
.. und das scheitert, weil die Parameterwerte in Access falsch zugewiesen werden.
Sie sollten dies bestätigen können, indem Sie die Reihenfolge der Parameter in Ihrer dynamischen Parameteralternative ändern. Ich habe versucht, dynamische Parameter zu verwenden, und es funktionierte, wenn die Parameter in der gleichen Reihenfolge wie sie in der SQL-Abfrage erschienen, aber fehlgeschlagen, wenn sie nicht waren. Die Datenbank, die ich benutze, ist nicht ganz die gleiche wie deine, aber die folgende sollte illustrieren, worüber ich rede:
// Doesn't work (parameter order is incorrect)
con.Execute(
"Update People Set PersonName = @PersonName Where Notes = @Notes",
new { Notes = "NotesChanged", PersonName = "New Name" }
);
// DOES work (parameter order is correct)
con.Execute(
"Update People Set PersonName = @PersonName Where Notes = @Notes",
new { PersonName = "New Name", Notes = "NotesChanged" }
);
Während ich versuchte, mehr Informationen darüber zu finden, stieß ich auf diese Antwort, die leider das Problem zu bestätigen scheint: https://stackoverflow.com/a/11424444/3813189
Ich denke, dass es für den benutzerdefinierten SQL-Generator , den Sie in einer Ihrer anderen Fragen erwähnt haben, möglich sein mag, die Abfrage zu analysieren und die Parameter in der Reihenfolge abzurufen, in der sie angezeigt werden müssen, und sicherzustellen, dass dies der Fall ist in der richtigen Reihenfolge bereitgestellt .. Wenn jemand einen Access-Connector für DapperExtensions verwaltet, kann es sich lohnen, ein Problem zu melden. Weil ich im Moment denke, dass Sie Recht haben und dass es ein Problem mit der Bibliothek ist.