2011-12-12 13 views
12

इस सवाल का उपयोग कर MSSQL यहाँ के लिए कवर किया गया है:अमान्य कलाकार जब mysql LAST_INSERT_ID लौटने() dapper.net

How do I perform an insert and return inserted identity with Dapper?

लेकिन इस समाधान mysql के साथ काम नहीं करता।

LAST_INSERT_ID() mysql के साथ पूर्णांक कास्ट करने के लिए आप यह करने के लिए है:

SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);

स्टैक ट्रेस है:

Dapper.<QueryInternal>d__13`1.MoveNext() in sqlMapper.cs:607 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +159 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +36 
    Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in sqlMapper.cs:535 

किसी MySQL में यह समस्या हल हो गया है?

संपादित करें:

मैं निम्नलिखित के साथ इस काम करने के लिए प्रबंधित किया है:

var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single(); 

शायद आदर्श नहीं है, लेकिन यह काम करता है।

उत्तर

14

मैं इसे किसी और के उत्तर के रूप में छोड़ दूंगा जो इस समस्या को खोज सकता है।

मैं निम्नलिखित के साथ इस काम करने के लिए प्रबंधित किया है:

var id = connection.Query<ulong>("SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);").Single(); 

शायद आदर्श नहीं है, लेकिन यह काम करता है।

+0

एक ही समस्या हो रही थी। किसी कारण से यह डैपर का उपयोग करके एक int में नहीं डालेगा। । आप लंबे समय तक उपयोग करने के लिए, .net में :(को पूर्णांक में हल की तुलना में यह डाउनग्रेड अगर यह कनेक्टर के साथ एक बग है पता नहीं है है, MySQL, या साफ-सुथरी – Sam

+0

बस एक ही मुद्दा हो गया और पता चला कि यह Ulong भी लौटे:) –

+1

आप उलझन के बजाय लंबे समय तक कास्ट कर सकते हैं और फिर int। मुझे पता चला कि एक और अजीबता यह है कि बिट (1) कॉलम UInt64 (ulong) के रूप में भी पास किए जाते हैं। मेरा संदेह ड्राइवर है। –

7

मैं वास्तव में इस पर कुछ अतिरिक्त प्रकाश डाल सकता हूं क्योंकि मैंने अभी आखिरी घंटा बिताया है कि क्यों मेरी SELECT LAST_INSERT_ID() क्वेरी एक MySQL सर्वर पर काम करती है लेकिन दूसरी नहीं। एक सर्वर MySQL 5.5.11 (उत्पादन) और अन्य 5.5.31 (स्थानीय देव) चला रहा है।

संस्करणों से पहले 5.1.67, 5.5.2 9 और 5.6.9 (प्रत्येक संबंधित रिलीज में) LAST_INSERT_ID() एक हस्ताक्षरित पूर्णांक वापस करने के लिए उपयोग किया जाता था।

अब LAST_INSERT_ID() रिटर्न एक अहस्ताक्षरित BIGINT जो इस कोड है जो मेरे 5.5.31 सर्वर पर काम का मतलब है काम:

var id = cn.Query<ulong>("SELECT LAST_INSERT_ID();").First(); 

... लेकिन जब बड़े 5.5.11 सर्वर के विरुद्ध निष्पादित टूटी हुई है।

यह यहाँ दस्तावेज़ीकरण किया गया है:

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id

मूल्य MySQL 5.5.29, BIGINT (हस्ताक्षरित) उससे पहले के रूप में BIGINT UNSIGNED का एक प्रकार है।

मेरे प्रारंभिक समाधान एक अहस्ताक्षरित BIGINT को LAST_INSERT_ID() का परिणाम कास्ट करने के लिए कोड पोर्टेबल बनाने के लिए भर में इन दोनों सर्वर संस्करणों लेकिन (आश्चर्य, आश्चर्य) MySQL टीम रोडब्लॉक जोड़ा था।

आप CAST() function का उपयोग कर सीधे एक अहस्ताक्षरित (या यहां तक ​​हस्ताक्षर किए) को BIGINTLAST_INSERT_ID() डाली नहीं कर सकते क्योंकि यह समर्थित नहीं है। केवल पूर्णांक प्रकार आप पर कास्ट कर सकते SIGNED INTEGER और UNSIGNED INTEGER हैं। यह एक दर्द है, तो जो भी कारण के लिए आप वास्तव में एक ऑटो BIGINT आईडी जो वृद्धि कर देता है अतीत 4294967295 बढ़ाने की जरूरत है तो एक अहस्ताक्षरित पूर्णांक एक बड़ा पर्याप्त प्रकार के कास्ट करने के लिए नहीं किया जाएगा वजह से है।

Convert.ToInt64(value) की
1

उपयोग मेरे लिए इसे हल।

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