2016-09-06 5 views
0

У меня есть класс продукта и вы пытаетесь оценить Dapper с базой данных Access. Операции Select, Delete и Insert работают нормально, но у меня проблема с операцией обновления. Она работает в одну сторону только код ниже)Dapper with Access, оператор обновления частично не работает

Когда я попытался изменить Описание основанный на ProductNumber это работает (updateStatement2) и описание обновляется, но когда я попытался изменить ProductNumber на основе Описание (updateStatement1) не работает, а ProductNumber не обновляется. Это немного странно для меня. Является ли это ошибкой или что-то мне не хватает? Моя база данных является базовой, а первичные ключи не установлены. Я приложил скриншот ниже

(Для получения дополнительной информации см мой код ниже)

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); 
    } 
} 

Я использую Dapper версии 1.50.2. Это мой скриншот базы данных

enter image description here

+0

Есть ли пробелы в сохраненном значении (описание)? – Shyju

+0

Он работает, если мы проходим как динамические параметры. Я считаю несколько проблем с Dapper. con.Execute (updateStatement2, new {ProductNumber = "P3Changed", Description = "TestProduct3"}); – RobinAtTech

ответ

1

Похоже команда ADO доступ требуют параметров должны присутствовать в том же порядке, как они появляются в запросе SQL.

В исходном коде, для запроса, который работает, параметры отображаются в строке запроса в алфавитном порядке -

Update Products Set Description = @Description Where ProductNumber = @ProductNumber 

Это работает, потому что свойства взяты из «product2» в алфавитном порядке. Это может быть не по дизайну, это может быть просто порядок, в котором отражается их список.

В запросе, который не параметры отображаются в обратном алфавитном порядке -

Update Products Set ProductNumber = @ProductNumber Where Description = @Description 

.. и это не удается, так как значения параметров получают MIS-присвоенную в Access.

Вы должны подтвердить это, изменив порядок параметров в альтернативном динамическом параметре. Я попытался использовать динамические параметры, и он работал, когда параметры были в том же порядке, в каком они появились в SQL-запросе, но не удались, если они не были. В базе данных я использую это не совсем то же самое, как у вас, но следующий должен проиллюстрировать то, что я говорю о:

// 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" } 
); 

При попытке найти более подробную информацию об этом, я наткнулся на этот ответ, который, к сожалению, кажется, для подтверждения вопроса: https://stackoverflow.com/a/11424444/3813189

Я полагаю, что возможно, для custom SQL generator вы упомянули в одном из своих других вопросов, чтобы сделать какое-то волшебство, чтобы разобрать запрос и получить параметры в том порядке, в котором они должны и затем убедитесь, что они предоставлены в правильном порядке. Если кто-то поддерживает соединитель доступа для DapperExtensions, тогда, возможно, стоит повысить i СГУП. Потому что, на данный момент, я думаю, что вы правы и что это проблема с библиотекой.