2011-07-26 12 views
10

अद्यतन नहीं करता है मुझे यकीन है कि यह एक बहुत ही सरल कारण है कि यह एक पंक्ति काम नहीं कर रही है, लेकिन यह पिछले हफ्ते से बच गई है, इसलिए मुझे उम्मीद है कि कोई और नोटिस करेगा मेरी गलती।DataAdapter.Update() डेटाबेस

मैं इस परियोजना पर एक महीने से कई सप्ताह तक काम कर रहा हूं। मैं पुराने डेटाबेस एडाप्टर, कमांडबुइलर इत्यादि के मिश्रण का उपयोग कर रहा हूं, कुछ लिनक्स के साथ 1 डेटाबेस पर एसक्यूएल कोडिंग के साथ, कई विंडोज़ एप्लिकेशन फॉर्मों के साथ। डाटाएडाप्टर, डेटासेट और कमांड बिल्डर का उपयोग करके डाटाबेस से यह विशेष रूप संपादन या हटाता है। यह ठीक काम कर रहा है, जब तक कि मैंने कंप्यूटर स्विच नहीं किया। अब डेटासेट अपडेट किया जा रहा है, लेकिन डेटाबेस नहीं है।

private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    if (MessageBox.Show("Exit Cook Book?", "Exit?", MessageBoxButtons.OKCancel) == DialogResult.OK) 
    { 
     Application.Exit(); 
    } 
} 

private void goBackToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    AddRecipe goBack = new AddRecipe(); 

    Close(); 
    goBack.Show(); 
} 

private void helpToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("Scan through the Cook Book to find recipes that you wish to edit or delete.", "Help!"); 
} 

SqlConnection con; 
SqlDataAdapter dataAdapt; 
DataSet dataRecipe; 
SqlCommandBuilder cb; 

int MaxRows = 0; 
int inc = 0; 


private void EditRecipe_Load(object sender, EventArgs e) 
{ 
    con = new SqlConnection(); 
    dataRecipe = new DataSet(); 

    con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Recipes.mdf;Integrated Security=True;User Instance=True"; 

     con.Open(); 

     //MessageBox.Show("Database Open"); 

     string sql = "SELECT* From CookBookRecipes"; 
     dataAdapt = new SqlDataAdapter(sql, con); 

     dataAdapt.Fill(dataRecipe, "CookBookRecipes"); 
     NavigateRecords(); 
     MaxRows = dataRecipe.Tables["CookBookRecipes"].Rows.Count; 

     con.Close(); 
} 


private void NavigateRecords() 
{ 
    DataRow dRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc]; 

    tbRName.Text = dRow.ItemArray.GetValue(0).ToString(); 
    listBox1.SelectedItem = dRow.ItemArray.GetValue(1).ToString(); 
    tbRCreate.Text = dRow.ItemArray.GetValue(2).ToString(); 
    tbRIngredient.Text = dRow.ItemArray.GetValue(3).ToString(); 
    tbRPrep.Text = dRow.ItemArray.GetValue(4).ToString(); 
    tbRCook.Text = dRow.ItemArray.GetValue(5).ToString(); 
    tbRDirections.Text = dRow.ItemArray.GetValue(6).ToString(); 
    tbRYield.Text = dRow.ItemArray.GetValue(7).ToString(); 
    textBox1.Text = dRow.ItemArray.GetValue(8).ToString(); 
} 

private void btnNext_Click(object sender, EventArgs e) 
{ 
    if (inc != MaxRows - 1) 
    { 
     inc++; 
     NavigateRecords(); 
    } 
    else 
    { 
     MessageBox.Show("That's the last recipe of your Cook Book!", "End"); 
    } 
} 

private void btnBack_Click(object sender, EventArgs e) 
{ 
    if (inc > 0) 
    { 
     inc--; 
     NavigateRecords(); 
    } 
    else 
    { 
     MessageBox.Show("This is the first recipe of your Cook Book!", "Start"); 
    } 
} 

private void btnSave_Click(object sender, EventArgs e) 
{ 
    cb = new SqlCommandBuilder(dataAdapt); 

    DataRow daRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc]; 

    daRow[0] = tbRName.Text; 
    daRow[1] = listBox1.SelectedItem.ToString(); 
    daRow[2] = tbRCreate.Text; 
    daRow[3] = tbRIngredient.Text; 
    daRow[4] = tbRPrep.Text; 
    daRow[5] = tbRCook.Text; 
    daRow[6] = tbRDirections.Text; 
    daRow[7] = tbRYield.Text; 
    daRow[8] = textBox1.Text; 

    if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK) 
    { 

     dataAdapt.Update(dataRecipe, "CookBookRecipes"); 

     MessageBox.Show("Recipe Updated", "Update"); 
    } 
} 

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    SqlCommandBuilder cb; 
    cb = new SqlCommandBuilder(dataAdapt); 

    if (MessageBox.Show("You wish to DELETE this recipe?", "Delete?", MessageBoxButtons.OKCancel) == DialogResult.OK) 
    { 
     dataRecipe.Tables["CookBookRecipes"].Rows[inc].Delete(); 
     MaxRows--; 
     inc = 0; 
     NavigateRecords(); 

     dataAdapt.Update(dataRecipe, "CookBookRecipes"); 

     MessageBox.Show("Your Recipe has been Deleted", "Delete"); 
    } 
} 

इस तालिका में अद्यतन करने के लिए माना जाता है:

यहाँ इस फार्म का पूरा कोड है

dataAdapt.Update(dataRecipe, "CookBookRecipes"); 

मैं किसी भी त्रुटि नहीं मिल रहा है, लेकिन डेटा तालिका सिर्फ जीता ' टी अपडेट करें।

आपकी मदद के लिए अग्रिम धन्यवाद, और अगर आपको अधिक जानकारी चाहिए तो बस मुझे बताएं।

+0

क्या आपको कभी इस पर कोई जवाब मिला? मुझे अपने डीबी अपडेट को संभालने के लिए बनाई गई एक परियोजना के साथ एक ही समस्या है। इसे एक प्रोजेक्ट से उपयोग करना, जैसा कि आप नोट करते हैं, यह विफल रहता है। इसे दूसरे से प्रयोग करना, यह ठीक काम करता है। तो मैं वास्तव में स्टंप हो गया हूँ। मैंने SqlAdapter.GetUpdateCommand() की तुलना भी की है। दोनों से कमांडटेक्स्ट और वे वही हैं जैसे आइटमअरे डेटा तत्व हैं। हालांकि, मैं स्वतः उत्पन्न जेनरेट आईएनएसईआरटी कमांड में सभी पैरामीटर को वास्तव में समझ नहीं पा रहा हूं। रोस्टस्टेट भी वही हैं। निराशा होती। –

उत्तर

2

अद्यतन के लिए SqlCommand क्या लगता है? मैं आदेश देखता हूं लेकिन मुझे कोई एसक्लटेक्स्ट नहीं दिखता है, यही वह है जो आप गायब हैं।

आप SqlDataAdapter

यह लिंक कैसे इसके बारे में जाने के लिए पर एक बहुत अच्छी टूटने देता है पर .UpdateCommand संपत्ति की स्थापना द्वारा परिभाषित करने के लिए क्या .Update करता है की जरूरत है: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.updatecommand.aspx

+0

एसक्लटेक्स्ट? मैं कहां रखूँगा? – Miffed

+0

धन्यवाद। लेकिन मैं अपने कोड में इसका उपयोग कैसे करूं? – Miffed

11

पर डेटा अपडेट करने के लिए डेटाबेस आपके SqlDataAdapter को इसके InsertCommand, UpdateCommand, DeleteCommand गुण सेट करने की आवश्यकता है। आपके द्वारा बनाए गए SqlCommandBuilder उदाहरण में इन आदेश हैं लेकिन आपको उन्हें अपने SqlDataAdapter पर सेट करने की आवश्यकता है।

दूसरी दुनिया में:

SqlCommandBuilder cb; 
cb = new SqlCommandBuilder(dataAdapt); 

और

dataAdapt.Update(dataRecipe, "CookBookRecipes"); 

के बीच कहीं न कहीं आप

dataAdapt.DeleteCommand = cb.GetDeleteCommand(true); 
dataAdapt.UpdateCommand = cb.GetUpdateCommand(true); 
dataAdapt.InsertCommand = cb.GetInsertCommand(true); 
+2

सभी की खोज की गई, और कोई भी कमांड निर्माता डेटा एडाप्टर को उत्पन्न करने वाले प्रश्नों को बाध्य करने का उल्लेख नहीं करता है। इसके लिए धन्यवाद। – Ajibola

+1

बस एक नोट है कि यदि आप SqlCommandBuilder बनाते समय डेटा एडाप्टर निर्दिष्ट करते हैं तो आपको कमांड सेट करने की आवश्यकता नहीं है, SqlCommandBuilder स्वयं को श्रोता के रूप में पंजीकृत करता है। [प्रलेखन] (https://msdn.microsoft.com/en-us/library/w0154tsb (v = vs.110) .aspx) – nicV

0

करने की जरूरत है आप की आवश्यकता हो सकती

DataAdapeter.AcceptChanges() 
0

मेरे पास एक ही समस्या थी: कुछ नई पंक्तियों के साथ एक नया डेटासेट भर दिया, लेकिन अपडेट पर कुछ भी नहीं हुआ। मैंने MySQLDataAdapter का उपयोग किया है जो समान काम करता है।

यह पता चला है कि जब आपको MySQLCommandBuilder से InsertCommand की आवश्यकता होती है तो आपको पंक्ति के रूप में पंक्ति को निर्दिष्ट करना होगा। यह भी देखें: MSDN

0
//change this line 

DataRow daRow = dataRecipe.Tables["CookBookRecipes"].NewRow(); 

daRow[0] = tbRName.Text; 
daRow[1] = listBox1.SelectedItem.ToString(); 
daRow[2] = tbRCreate.Text; 
daRow[3] = tbRIngredient.Text; 
daRow[4] = tbRPrep.Text; 
daRow[5] = tbRCook.Text; 
daRow[6] = tbRDirections.Text; 
daRow[7] = tbRYield.Text; 
daRow[8] = textBox1.Text; 

if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK) 
{ 
//add & change this too 
dataRecipe.Tables["CookBookRecipes"].Rows.Add(daRow); 
    dataAdapt.Update(dataRecipe, "CookBookRecipes"); 

    MessageBox.Show("Recipe Updated", "Update"); 
} 

}

0

नीचे स्रोत की कोशिश करो।

private void btnSave_Click(object sender, EventArgs e) 
{ 
    cb = new SqlCommandBuilder(dataAdapt); 

    //Old source: DataRow daRow = dataRecipe.Tables["CookBookRecipes"].Rows[inc]; 

    //Added source code 
    DataRow daRow = dataRecipe.Tables["CookBookRecipes"].NewRow(); 

    //Added source code 
    dataRecipe.Tables["CookBookRecipes"].AddRow(daRow); 

    daRow.BeginEdit(); 
    daRow[0] = tbRName.Text; 
    daRow[1] = listBox1.SelectedItem.ToString(); 
    daRow[2] = tbRCreate.Text; 
    daRow[3] = tbRIngredient.Text; 
    daRow[4] = tbRPrep.Text; 
    daRow[5] = tbRCook.Text; 
    daRow[6] = tbRDirections.Text; 
    daRow[7] = tbRYield.Text; 
    daRow[8] = textBox1.Text; 
    daRow.EndEdit(); 

    //Reset state of rows to unchanged 
    dataRecipe.Tables["CookBookRecipes"].AcceptChanges(); 
    //Set modified. The dataAdapt will call update stored procedured 
    //for the row that has Modifed row state. 
    //You can also try SetAdded() method for new row you want to insert 
    daRow.SetModified(); 

    if (MessageBox.Show("You wish to save your updates?", "Save Updates?", MessageBoxButtons.OKCancel) == DialogResult.OK) 
    { 

     dataAdapt.Update(dataRecipe, "CookBookRecipes"); 

     MessageBox.Show("Recipe Updated", "Update"); 
    } 
} 
0

अद्यतन से पहले AcceptChangesDuringUpdate जोड़ा जा रहा है मेरे लिए काम करता है, उदाहरण के:

foreach (string tableName in tableNames) 
     {    
      da = new SqlDataAdapter("SELECT * FROM " + tableName, cn); 
      cb = new SqlCommandBuilder(da); //initialise the update, insert and delete commands of da 
      da.AcceptChangesDuringUpdate = true; 
      da.Update(myDataSet, tableName);    
     } 
0

मैं एक ही समस्या का सामना करना पड़ा। मेरा dataadapter.fill काम करता है लेकिन dataadapter.update काम नहीं करता है। मुझे एहसास हुआ कि समस्या यह थी कि मेरी डेटाबेस तालिका में प्राथमिक कुंजी नहीं है। प्राथमिक कुंजी के साथ कॉलम शामिल करने के लिए मैंने अपनी तालिका को संशोधित करने के बाद, dataadapter.fill काम करता है। उम्मीद है कि यह किसी की मदद करेगा।