2012-09-07 14 views
8

चलिए इसे इस तरह से प्राप्त करके शुरू करते हैं: मैं एक एमएस एक्सेस डीबी का उपयोग कर फंस गया हूं और मैं इसे बदल नहीं सकता।डैपर और एमएस एक्सेस - काम पढ़ें, लिखें

यह ठीक काम करता है:

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    conn.Open(); 
    var results = conn.Query<string>(
    "select FirstName from Students where LastName = @lastName", 
    new { lastName= "Smith" } 
); 
    conn.Close(); 
} 

यह ठीक काम करता है:

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    OleDbCommand cmd = new OleDbCommand(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    conn 
); 
    cmd.Parameters.AddWithValue("firstName", "John"); 
    cmd.Parameters.AddWithValue("city", "SomeCity"); 
    cmd.Parameters.AddWithValue("lastName", "Smith"); 

    conn.Open(); 
    var result = cmd.ExecuteNonQuery(); 
    conn.Close(); 
} 

यह नहीं करता है ... यह त्रुटि के बिना निष्पादित करता है, लेकिन यह "SomeCity" DB में के रूप में प्रथम सेट करता है और शहर "जॉन" के रूप में:

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    conn.Open(); 
    var results = conn.Query<string>(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    new { firstName = "John", city = "SomeCity", lastName = "Smith" } 
); 
    conn.Close(); 
} 

कोई विचार? अगर मैं DynamicParameters का उपयोग

संपादित नीचे

डैप्पर काम करता है:

नीचे व्यवसायिक के SqlMapper से CreateParamInfoGenerator प्रतिनिधि है:

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    DynamicParameters parameters = new DynamicParameters(); 
    parameters.Add("firstName", "John"); 
    parameters.Add("city", "SomeCity"); 
    parameters.Add("lastName", "Smith"); 

    conn.Open(); 
    var result = conn.Query<string>(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    parameters 
); 
    conn.Close(); 
} 
+0

कि अजीब है .. मैं repro करने के लिए ... –

+0

नोट की कोशिश करने की आवश्यकता होगी: बस एसक्यूएल के साथ पुन: पेश करने की कोशिश की 2008 एक्सप्रेस और यह ठीक काम करता है ... –

+0

मेरे द्वारा की गई यह एसक्यूएल सर्वर के साथ सफलतापूर्वक ... इसलिए मुझे लगता है कि यह केवल एमएस एक्सेस के साथ है – Trev

उत्तर

8

कुछ खुदाई के बाद, मैं एक कारणों का पता लगाने में सक्षम था:

public static Action<IDbCommand, object> CreateParamInfoGenerator(Identity identity) 
    { 

     // code above here 
     IEnumerable<PropertyInfo> props = type.GetProperties().OrderBy(p => p.Name); 

प्रोपस आपके सर्वसम्मति सेम हैं जो ऑर्डरबी (पी => पी। नाम) द्वारा पुनः ऑर्डर किया जाता है, जो शहर को आगे बढ़ता है।

new { firstName = "John", city = "SomeCity", lastName = "Smith" } 

प्रॉप्स को आईडीबीकॉमैंड पैरामीटर्स में जोड़ा जा रहा है जहां ऑर्डर महत्वपूर्ण है।

अगर मैं ऑर्डरबी() क्लॉज पर टिप्पणी करता हूं, तो सबकुछ काम करता है।

मैं भी परीक्षण किया DynamicParameters और जानबूझकर गुण पुन: क्रम में शहर अग्रिम स्थानांतरित करने के लिए:

 var parameters = new DynamicParameters(); 
     parameters.Add("city", "SomeCity"); 
     parameters.Add("firstName", "John"); 
     parameters.Add("lastName", "Smith"); 

     var result = dbConnection.Query<string>(
      "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
      parameters 
     ); 

ऊपर के रूप में अच्छी तरह से काम नहीं किया, इसलिए विशेषताओं का आदेश कारण है!

मुझे लगता है कि आप के लिए अब) SqlMapper की अपनी स्थानीय प्रतिलिपि को संशोधित करने और हटाने OrderBy (और मार्क से एक अधिकारी के फैसले के लिए इंतजार कर सकते हैं ...

आशा इस मदद करता है।

+1

यह पता चला है कि एमएस एक्सेस [पैरामीटर के क्रम के बारे में उग्र है] (http://stackoverflow.com/a/1476818/47121)। मैंने SqlMapper से 'OrderBy (p => p.Name)' कोड को हटाने का प्रयास किया और यह अब काम करता है। मैं मार्क या सैम से भी जानना चाहूंगा कि इस कोड को हटाने से कहीं और कोई प्रभाव पड़ता है। – Trev

+0

मुझे यह भी पता नहीं था; जानकार अच्छा लगा! और मैं ऑर्डरबी() खंड के उद्देश्य के बारे में भी उत्सुक हूं। –

+0

उत्तर [टिप्पणी] (http://stackoverflow.com/a/19481354/2144390) पर टिप्पणी के अनुसार, यह अब डैपर के वर्तमान संस्करण के साथ कोई समस्या नहीं है। –

4

मेरे पास एक समान समस्या थी, मैंने @को @ name, @ id, @ कीमत के बजाय किया था ताकि ऑर्डर SQLMapper.cs फ़ाइल को संशोधित किए बिना ही रहता है।

तरह

public void Update(Movie movie) 
{ 
    var sql = "UPDATE myDB.movies set [email protected], [email protected] where [email protected]"; 
    db.Execute(sql, new { param1 = movie.Title, param2 = movie.Genre, param3 = movie.ID }); 
} 
+0

में रखना है क्योंकि आपने आखिरी बार डैपर के साथ काम किया था। जवाब [यहां] (http://stackoverflow.com/a/19481354/2144390) पर एक टिप्पणी के अनुसार, यह अब वर्तमान संस्करण के साथ कोई मुद्दा नहीं है। –

+1

@GordThompson लिंक के लिए धन्यवाद। मुझे NuGet के माध्यम से संस्करण 1.13 के साथ एक ही समस्या है। –

+0

मुझे 1.50.2 में एक ही समस्या है – RobinAtTech

संबंधित मुद्दे