2011-12-15 12 views
8

मैं MySQL कनेक्टर .NET का उपयोग कर रहा हूं, और मुझे अंतिम क्वेरी द्वारा उत्पन्न सम्मिलित आईडी प्राप्त करने की आवश्यकता है। अब, मुझे लगता है MySqlHelper.ExecuteNonQuery के रिटर्न मान पिछले डालने आईडी होना चाहिए, लेकिन यह सिर्फ रिटर्न 1.MySQL अंतिम सम्मिलित आईडी, कनेक्टर .net

कोड मैं का उपयोग कर रहा है:

int insertID = MySqlHelper.ExecuteNonQuery(Global.ConnectionString, 
"INSERT INTO test SET var = @var", paramArray); 

हालांकि insertID हमेशा 1. मैं बनाने की कोशिश की है ने MySQL कनेक्शन और खोलने/बंद करने के लिए मैन्युअल रूप है जो एक ही व्यवहार में हुई

+0

1 का मतलब है 1 रिकॉर्ड डाला गया है। InsertID वापस पाने के लिए, आपको एक क्वेरी की आवश्यकता है। – chance

+0

"SET" UPDATES पर उपयोग नहीं किया गया है और सम्मिलित नहीं है? – jason

+0

आप इसे दोनों के लिए उपयोग कर सकते हैं: http://dev.mysql.com/doc/refman/5.5/en/insert.html – Splatbang

उत्तर

1

1 है क्वेरी यहां केवल एक पंक्ति तो डाला जाता है से प्रभावित अभिलेखों का कोई 1 रिटर्न

डाला पंक्ति की आईडी प्राप्त करने के लिए आप इस क्वेरी का उपयोग करने के लिए पिछले डाला आईडी मिल लिए MySQL

में
3

कोशिश sqlserver में scope_identity() और LAST_INSERT_ID() का उपयोग करना चाहिए - तो फिर

SELECT LAST_INSERT_ID(); 

, IDataReader पाने के लिए DbCommand.ExecuteReader विधि चलाने -

command.CommandText = "SELECT LAST_INSERT_ID()"; 
IDataReader reader = command.ExecuteReader(); 

। ..और पाठक से जानकारी प्राप्त -

if (reader != null && reader.Read()) 
    long id = reader.GetInt64(0); 

... मत भूलना पाठक ;-)

+0

धन्यवाद! लेनदेन का उपयोग करते समय काम करने का यह एकमात्र तरीका है;) –

72

बस का उपयोग LastInsertedId क्षेत्र

MySqlCommand dbcmd = _conn.CreateCommand(); 
dbcmd.CommandText = sqlCommandString; 
dbcmd.ExecuteNonQuery(); 
long imageId = dbcmd.LastInsertedId; 
+2

यह सही उत्तर है। [MySQL/कनेक्टर] (http://dev.mysql.com/downloads/connector/net/) के साथ परीक्षण किया गया 6.3.8 – caligari

+0

आसान तरीका, यहां तक ​​कि मेरे द्वारा परीक्षण किया गया। यह सही है ! – Hatem

+0

यह यह करने के लिए एक तरीका है, ** नहीं बल्कि आप सख्ती से ** MySqlHelper.ExecuteNonQuery उपयोग करने की आवश्यकता है। //dev.mysql: के रूप में [डॉक्स] (https में कहा गया है कारणों MySqlHelper उपयोग करने के लिए में से एक है जब आप कनेक्टर कनेक्शन पूल प्रबंधित करना चाहते हैं, और,।कॉम/डॉक्टर/कनेक्टर-नेट/एन/कनेक्टर-नेट-प्रोग्रामिंग-कनेक्शन-पूलिंग.html), एक दृष्टिकोण एपीआई ओवरलोड का उपयोग करना है जो पैरामीटर के रूप में एक नया MySqlConnection ऑब्जेक्ट नहीं लेता है, बल्कि कनेक्टर को इसका प्रबंधन करने दें सृजन स्वयं तो यह ऐसे मामलों (मेरा) का समाधान नहीं है। – Veverke

2

मैं एक ही समस्या थी बंद करने के लिए, और कुछ परीक्षण के बाद, मुझे पता चला है कि समस्या होने लगते हैं कनेक्शन विधि; आप एक कनेक्शन स्ट्रिंग का उपयोग कर रहे हैं।

यह स्वचालित कनेक्शन पूल पुन: उपयोग का उपयोग करने के लिए निश्चित रूप से है, लेकिन इस मामले में उसने मुझे परेशानी दी।

मेरे लिए अंतिम समाधान एक नया कनेक्शन बनाना, सम्मिलित क्वेरी निष्पादित करना है, और फिर last_insert_id() निष्पादित करना है। पर कनेक्शन पर।

इसी कनेक्शन के बिना, last_insert_id() कुछ भी वापस हो सकता है, मैं पता नहीं क्यों, लेकिन यह बातें का ट्रैक खो देता है के रूप में यह अलग अलग कनेक्शन हो सकता है लगता है।

उदाहरण:

MySqlConnection connection = new MySqlConnection(ConnectionString); 
connection.Open(); 

int res = MySqlHelper.ExecuteNonQuery(
    connection, 
    "INSERT INTO games (col1,col2) VALUES (1,2);"); 

object ores = MySqlHelper.ExecuteScalar(
connection, 
"SELECT LAST_INSERT_ID();"); 

if (ores != null) 
{ 
    // Odd, I got ulong here. 
    ulong qkwl = (ulong)ores; 
    int Id = (int)qkwl; 
} 

मुझे आशा है कि यह किसी को मदद करता है!

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