2012-05-22 17 views
7

हटाए गए हटाए गए 0 को मैं एक डाटाग्रिडव्यू से रिकॉर्ड हटाने की कोशिश कर रहा हूं, फिर इसे एक MySQL सर्वर पर अपडेट करने का प्रयास कर रहा हूं, हालांकि मुझे "Concurrency उल्लंघन: प्राप्त 1 अपडेट के हटाए गए कॉमांड प्रभावित 0 । "। मैंने कुछ हद तक इसके साथ गुस्से में गड़बड़ कर ली है और प्यार और न ही पैसे के लिए एक फिक्स नहीं समझ सकता। मुझसे कहां गलती हो रही है?Concurrency उल्लंघन: अपेक्षित 1 रिकॉर्ड्स

private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      // create a connection to the server 
      connection = new MySqlConnection("SERVER=" + Constants.SERVER + ";" + "DATABASE=" + Constants.DATABASE + ";UID=" + Constants.USERNAME + ";" + "PASSWORD=" + Constants.PASSWORD + ";"); 
      connection.Open(); 

      // create our default handler 
      adapter = new MySqlDataAdapter(); 

      // set the default commands to do 
      adapter.SelectCommand = new MySqlCommand("SELECT * FROM npc_drops", connection); 
      MySqlCommand query = new MySqlCommand("DELETE FROM npc_drops WHERE id = @id", connection); 
      query.Parameters.Add("@id", MySqlDbType.Int32, 10, "id"); 
      adapter.DeleteCommand = query; 

      // create a table to put our data in and fill it with the results 
      table = new DataTable(); 
      adapter.Fill(table); 

      // bind both the data table and the datagridview togeather 
      BindingSource source = new BindingSource(); 
      source.DataSource = table; 
      dataGridView1.DataSource = source; 
      dataGridView1.Columns["id"].Visible = false; 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      table = table.GetChanges(); 
      adapter.Update(table); 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

तालिका:

CREATE TABLE `npc_drops` (
    `id` INT(10) NULL AUTO_INCREMENT, 
    `npcs` VARCHAR(250) NULL DEFAULT NULL, 
    `rate` INT(3) NULL DEFAULT NULL, 
    `item` INT(5) NULL DEFAULT NULL, 
    `amount` INT(10) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 
+0

http द्वारा

table.AcceptChanges(); 

तो सही रीफिल आप डेटा तालिका के बाद: // stackoverflow .com/प्रश्न/6111961/mysql-limit-on-delete-statement इस – BizApps

+0

@BizApps को धन्यवाद, धन्यवाद, मैंने उस पंक्ति को अपडेट किया है, लेकिन फिर भी एक ही डरावनी त्रुटि प्राप्त है! –

+0

- आपकी तालिका INNODB या MYISAM का उपयोग कर रही है? - क्या आप ऑटोोकॉमिट्स का उपयोग कर रहे हैं? – Sebas

उत्तर

0

एक संगामिति अपवाद मतलब कम पंक्तियों में अपेक्षा से बदल दिया गया है कि, यह आमतौर पर होता है आप एक अद्यतन पर एक जहां खंड है जब/हटाने जो क्रिया निष्पादित करते से रोकता है। (यह आम तौर पर समवर्ती कार्य करता है - आप जांचते हैं कि LastUpdateDate किसी भी स्थान का उपयोग करके नहीं बदला गया है, यह सत्यापित करने के लिए कि आपके पढ़ने और लिखने के संचालन के बीच कोई भी नहीं मिला है) केवल आपके पास हटाए जाने पर "id = @id" है, इसलिए समस्या यह होनी चाहिए कि जब DeleteCommand निष्पादित किया गया हो तो आईडी डीबी में मौजूद नहीं है। परिवर्तन के लिए

  1. "तालिका" का पुन: उपयोग न करें, बल्कि एक नए DataTable का उपयोग करें:

    मैं अपने कोड के साथ दो समस्याओं देख सकते हैं।

  2. कॉल टेबल। अद्यतन के बाद AcceptChanges(), यह डेटाटेबल से हटाए गए प्रविष्टियों को हटा देगा।

समस्या हो सकती है नष्ट कर दिया पंक्ति beeng की वजह से रखा जाता है और फिर से नष्ट कर दिया, या कुछ अन्य आपरेशन प्रविष्टि को हटाने से पहले आप इसे हटा

3

(उत्तरार्द्ध मामले में, आप संगामिति अपवाद को संभालने की ज़रूरत) मुझे पता है कि यह एक पुराना धागा है, लेकिन मुझे एक ही समस्या थी और समाधान मिला। शायद कोई और इसे यहां देखेगा।

.xsd फ़ाइल में विजुअल स्टूडियो का उपयोग करके, डेटा एडाप्टर में एक DELETE कमांड है। वह आदेश SQL के रूप में है "तालिका से हटाएं जहां कॉलम 1 = @ Original_column1 और कॉलम 2 = @ Original_column2 और ..." डिफ़ॉल्ट रूप से, यह सभी स्तंभों को उनके द्वारा किए गए मानों की तुलना करता है जब आप डीबी पढ़ते हैं, और नहीं करेंगे जब तक वे सभी मेल नहीं खाते तब तक रिकॉर्ड हटाएं। जब आप रिकॉर्ड पढ़ते हैं और जब आप इसे बदलने की कोशिश कर रहे होते हैं, तो दूसरों द्वारा किए गए परिवर्तनों को ओवरराइट करने से बचने के लिए यह है।

यहां समस्या है। यदि इनमें से कोई भी कॉलम डीबी में पूर्ण है, तो यह आपके द्वारा वर्णन किए जाने पर मेल नहीं खाएगा और त्रुटिपूर्ण होगा।

पीएस: वीएस डीबी पुस्तकालयों का उपयोग करते समय मेरे पास डीबी में एनयूएलएल को अनुमति देने में परेशानी नहीं है। LINQ2SQL या जिसे भी कहा जाता है ...

3

एक समेकन अपवाद तब होता है जब आप वास्तविक डेटाबेस में कोई मिलान नहीं होने के साथ रिकॉर्ड को हटाने का प्रयास करते हैं, यह नए जोड़े गए रिकॉर्ड्स के साथ होता है जिसमें पहचान सेट होता है क्योंकि डेटा सेट पुनर्प्राप्त नहीं होगा जोड़ने के तुरंत बाद पहचान कॉलम मान। इसे ठीक करने के आप

1-के लिए एक एसक्यूएल कमांड को क्रियान्वित तो डेटा यह मान के साथ सेट में रिकॉर्ड अपडेट द्वारा डेटाबेस से पहचान स्तंभ मान प्राप्त की जरूरत है।

या
2- आपको कॉल करके डेटाबेस डेटा तालिका पर परिवर्तनों को स्वीकार कर सकते हैं: बुला

Adapter.Fill(table); 
+0

मुझे पता है कि यह पुराना है, लेकिन यह तब हो सकता है जब आपके पास लेनदेन ऑब्जेक्ट था और इससे पहले इस पर प्रतिबद्धता कहा जाता था। AcceptChanges()? (यानी प्रतिबद्धता अभिकर्मकों के बाद होना चाहिए) – Hershizer33

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