2012-01-20 75 views
1

我一直在從昨天開始工作,我只是無法更新我的數據庫。 有3張桌子。這是WinForms之一的一段代碼。它加載數據和顯示,但手動更改網格後,我通過調用更新或任何事情發生任何錯誤。OleDbDataAdapter:無法更新數據庫

請幫忙,因爲我瘋了。

public partial class Form3 : Form 
    { 
    //instance fields 
    private export2Excel export2XLS; 
    private DataSet _dataSet; 
    private BindingSource _bsrc; 
    private OleDbDataAdapter _dAdapter; 
    private OleDbCommandBuilder _cBuilder; 
    private DataTable _dTable; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //create the connection string 
     string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data  
     Source='C:\\Documents and Settings\\dorota\\Moje dokumenty\\Visual Studio 
     2010\\Projects\\WindowsFormsApplication1\\WindowsFormsApplication1\\artb.mdb'"; 

     //create the database query 
     string query = "SELECT * FROM Samochody"; 
     System.Data.DataSet DtSet = new System.Data.DataSet(); 
     _dataSet = DtSet; 
     //create an OleDbDataAdapter to execute the query 
     OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString); 
     dAdapter.FillSchema(_dataSet, SchemaType.Source); 

     _dAdapter = dAdapter; 
     //create a command builder 
     OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(_dAdapter); 
     _cBuilder = cBuilder; 
     //create a DataTable to hold the query results 
     DataTable dTable = new DataTable(); 
     _dTable = dTable; 
     //fill the DataTable 
     _dAdapter.Fill(_dTable); 
     //_dAdapter.TableMappings.Add("Samochody", "Table"); 

     _dAdapter.Fill(_dataSet); 

     // --------------------- to datagridview ! 

     //BindingSource to sync DataTable and DataGridView 
     BindingSource _bsrc = new BindingSource(); 

     //set the BindingSource DataSource 
     //bSource.DataSource = _dTable; 
     _bsrc.DataSource = _dTable; 
     //_bsrc = bSource; 
     //set the DataGridView DataSource 
     dataGridView1.DataSource = _bsrc; 
    } 
    } 

這裏...:

private void sqlsave_Click(object sender, EventArgs e) 
    { 

     //int i=_dAdapter.Update(_dTable); 
     _dAdapter.Update(_dataSet.Tables["Samochody"]); 
     //_dAdapter.Update(_dataSet,"Samochody"); 
    } 

// ---------------------------- -------------------------------------------------- ---

好的。我已經改變sqlsave方法本

private void sqlsave_Click(object sender, EventArgs e) 
    { 

    try 
    { 
     //_dAdapter.Update(_dataSet.Tables["Samochody"]); 
     OleDbCommand oldb= _cBuilder.GetUpdateCommand(); 
     int i=oldb.ExecuteNonQuery(); 
     System.Windows.Forms.MessageBox.Show(i+" rows affected."); 
     //_dAdapter.Update(_dataSet,"Samochody"); 
    }catch(OleDbException oldbex){ 
     System.Windows.Forms.MessageBox.Show(oldbex.ToString()); 
    } 

,現在我終於得到「在錯誤」

折騰不止翔實的「System.InvalidOperationException」類型 發生在System.Data未處理的異常。 dll附加信息:ExecuteNonQuery 需要一個開放且可用的Connection。連接的當前狀態 已關閉。

所以讓我改變一下,我會讓你知道如果這是它!

// --------------------------------

no。沒有。太快,不能持續。現在試圖挽救我又得到了例外, connectin被打開,但(我不能發佈圖片)當我調試這個我看到我的OleDbCommand類型的對象_commandText具有

「UPDATE Samochody SET Item =?,Data dyspozycji autem od =?,...「

等等。 我認爲這是原因。我對嗎?該怎麼辦?

+0

您正在混合並匹配不同的方法。 ExecuteNonQuery需要一個開放的連接 - CommandBuilder不會爲你提供。您需要將Update命令放入DataAdapter並運行更新。您可能需要提供自己的更新方法。確保你的表有一個PrimaryKey索引。 – LarsTech

+0

@LarsTech你說「把你的更新命令放入你的DataAdapter」。如果我更新我的_cBuilder,這是該類中的專用字段,並且在button1_Click命令中由_dAdapter初始化,是不是可以?連接打開。並在sqlsave_Click()我有: – 4pie0

回答

0

我已經找到了答案:

但是更好的方法是使用拖放操作並從代碼中學習。

Select Data|View Datasources. Your dataset should be visible in the DataSources Window. 
Drag a table to a (new) form. VS2005 will add a load of components and a few lines of code. 

窗體現在將有數據集的實例和對Adapter.Fill和.Update方法的參考點。

簡單和偉大的作品!:D
我在這裏找到它:https://stackoverflow.com/a/548124/1141471

0

您沒有爲您的OleDbDataAdapter提供連接。試試吧是這樣的:

的例子是從您的代碼不同,但它顯示了新連接的聲明,並把它傳遞給OleDbDataAdapter的

 string connetionString = null; 
     OleDbConnection connection ; 
     OleDbDataAdapter oledbAdapter ; 
     OleDbCommandBuilder oledbCmdBuilder ; 
     DataSet ds = new DataSet(); 
     int i = 0; 
     string sql = null; 
     connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your mdb filename;"; 
     connection = new OleDbConnection(connetionString); 
     sql = "select * from tblUsers"; 
     try 
     { 
      connection.Open(); // your code must have like this 
      oledbAdapter = new OleDbDataAdapter(sql, connection); 
      oledbCmdBuilder = new OleDbCommandBuilder(oledbAdapter); 
      oledbAdapter.Fill(ds); 
      for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) 
      { 
       ds.Tables[0].Rows[i].ItemArray[2] = "[email protected]"; 
      } 
      oledbAdapter.Update(ds.Tables[0]); 
      connection.Close(); 
      MessageBox.Show ("Email address updates !"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
+0

我有一個連接' OleDbCommand oldb = _cBuilder.GetUpdateCommand(); oldb.Connection.Open(); int i = oldb.ExecuteNonQuery(); System.Windows.Forms.MessageBox.Show(i +「rows affected。」); //_dAdapter.Update(_dataSet,"Samochody「); oldb.Connection.Close(); (OldBex.ToString()); {0} {0} {0} {0}} catch(OleDbException oldbex){ } }' – 4pie0

+0

_cBuilder作爲Ole對象的其餘部分存儲在此類的專用字段中,請查看主代碼的頂部。我希望如果我存儲在其他單擊方法(?)中初始化的這個對象也沒關係,我不必每次都創建新的aDapter,BindingSource等,如果我想從同一個Windows窗體的不同函數中影響相同的數據 - 我呢? – 4pie0

+0

請在這裏看到錯誤:http://aspspider.info/piotrgregor/ – 4pie0