2017-06-23 50 views
0

我已經從互聯網上覆制了一些代碼並對其進行了修改我瞭解它在做什麼,但是我無法將它正確地插入到數據庫中。如果我輸入「變量的名稱」,我似乎無法從字面上得到任何其他值,但這就是我從另一端得到的結果。一旦我完成這個工作,就完成了。將值插入到數據庫中會帶來錯誤的值

我得到的錯誤是數據庫打開或者/ insert insert執行命令行號上的變量有問題。

private void button9_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\temp\\names.accdb;Persist Security Info=False"); 
     using (OleDbConnection Conn = new OleDbConnection(ConnString)) 
     { 
      Conn.Close();//severl times connection has been open 
      Conn.Open(); 
      DataSet ds = new DataSet(); 
      ds.ReadXml(@"c:\\temp\\my123.xml"); 
      OleDbCommand cmd = new OleDbCommand(); 
      OleDbCommand cmd1 = new OleDbCommand(); 
      DataTable dtCSV = new DataTable(); 
      dtCSV = ds.Tables[0];    
      cmd.Connection = Conn; 
      cmd.CommandType = CommandType.Text; 
      cmd1.Connection = Conn; 
      cmd1.CommandType = CommandType.Text; 

      Conn.Open(); 

      for (int row = 0; row <= dtCSV.Rows.Count - 1; row++) 
      { 
       for (int col = 1; col <= dtCSV.Columns.Count - 1; col++) 
       { 
        cmd.CommandText= ("INSERT INTO tab1 (field1, field2) VALUES (dtCSV.Rows ,dtCSV.Columns)"); 
        cmd.ExecuteNonQuery(); 
       } 
      } 
      Conn.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     richTextBox1.Text = richTextBox1.Text + "\n Error " + ex + "\n"; ; 
    } 
} 

錯誤System.InvalidOperationException:連接不 關閉。連接的當前狀態已打開。在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的, TaskCompletionSource`1重試,DbConnectionOptions USEROPTIONS)在 System.Data.ProviderBase.DbConnectionInternal.OpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的)在 系統.Data.OleDb.OleDbConnection.Open()在 WindowsFormsApp5.Form1.button9_Click(對象發件人,EventArgs的)

+1

當您在Connection中使用using語句時,當您從using塊中退出時,該連接實例會自動關閉。你不需要關閉第二個按鈕中的任何東西點擊 – Steve

+0

@Steve即使在重新啓動後,我仍然無法理解數據庫仍然處於打開狀態@C珀金斯能幫忙 – Data

+0

你是什麼意思_database仍然是open_?你在using塊內創建一個連接。只有在您打開Open之後,該連接纔會打開。所以沒有conn.關閉作爲使用塊內的第一行,並且你不需要conn.Close在最後,因爲當達到結束大括號時,using塊關閉並處理連接。 – Steve

回答

1

那麼你兩次調用連接對象上Open()功能下面的代碼塊中看到英寸所以基本上,你試圖打開的連接而連接狀態還是Open,這就是錯誤正是

 Conn.Open();  <--- Here 
     DataSet ds = new DataSet(); 
     ds.ReadXml(@"c:\\temp\\my123.xml"); 
     OleDbCommand cmd = new OleDbCommand(); 
     OleDbCommand cmd1 = new OleDbCommand(); 
     DataTable dtCSV = new DataTable(); 
     dtCSV = ds.Tables[0];    
     cmd.Connection = Conn; 
     cmd.CommandType = CommandType.Text; 
     cmd1.Connection = Conn; 
     cmd1.CommandType = CommandType.Text; 

     Conn.Open();  <--- Here 

說什麼作爲@Steve說cmd1從未使用過,看起來像連接到相同的命令文本。

此外,您INSERT查詢從來沒有去上班所需的方式,因爲你實際上並沒有替換值

"INSERT INTO tab1 (field1, field2) VALUES (dtCSV.Rows ,dtCSV.Columns)" 

你應該意味着它是

string.Format("INSERT INTO tab1 (field1, field2) VALUES ({0} ,{1})", dtCSV.Rows[row] ,dtCSV.Columns[col]) 

(OR),如果你正在使用C#6,那麼你可以只說

$"INSERT INTO tab1 (field1, field2) VALUES ({dtCSV.Rows[row]} ,{dtCSV.Columns[col]})" 
+0

這個問題還有很多好東西,不要停在這裏;) – Icepickle

+0

@Ippickle,所有的好東西... * codereview.stackexchange.com * :) – Rahul

+0

嗯,我不知道,是不是對於[工作編碼](https://codereview.stackexchange.com/help/on-topic)應該得到審查? :) – Icepickle

0
private void button9_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\temp\\names.accdb;Persist Security Info=False"); 
     using (OleDbConnection Conn = new OleDbConnection(ConnString)) 
     { 
      //Conn.Close();//severl times connection has been open 
      Conn.Open(); 
      DataSet ds = new DataSet(); 
      ds.ReadXml(@"c:\\temp\\my123.xml"); 
      OleDbCommand cmd = new OleDbCommand(); 
      //OleDbCommand cmd1 = new OleDbCommand(); 
      DataTable dtCSV = new DataTable(); 
      dtCSV = ds.Tables[0]; 
      cmd.Connection = Conn; 
      cmd.CommandType = CommandType.Text; 
      //cmd1.Connection = Conn; 
      //cmd1.CommandType = CommandType.Text; 

      //Conn.Open(); 

      for (int row = 0; row <= dtCSV.Rows.Count - 1; row++) 
      { 
       //for (int col = 0; col < dtCSV.Columns.Count - 1; col++) 
       //{ 
       // //cmd.CommandText = ("INSERT INTO tab1 (field1, field2) VALUES (dtCSV.Rows ,dtCSV.Columns)"); 
       //} 
       cmd.Parameters.Clear(); 
       if (dtCSV.Columns.Count > 1) 
       { 
        cmd.Parameters.Add(dtCSV.Rows[row][0].ToString()); 
        cmd.Parameters.Add(dtCSV.Rows[row][1].ToString()); 

        cmd.CommandText = ("INSERT INTO tab1 (field1, field2) VALUES (? , ?)"); 
        cmd.ExecuteNonQuery(); 
       } 

      } 

      //Conn.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     richTextBox1.Text = richTextBox1.Text + "\n Error " + ex + "\n"; ; 
    } 
} 

您可以使用它。我希望它能幫助你。

+0

Error System.InvalidCastException:OleDbParameterCollection只接受行cmd.Parameters.Add(dtCSV.Rows [row] [0] .ToString())上的非null OleDbParameter類型;感謝您付出的努力,我正在尋找@Tien Nguyen – Data

+0

錯誤System.InvalidCastException:OleDbParameterCollection只接受非空的OleDbParameter類型對象,而不是String對象。 at System.Data.OleDb.OleDbParameterCollection.ValidateType(Object value) at System.Data.OleDb.OleDbParameterCollection.Add(Object value) @TienNguyen Iuse visual studio 2017 – Data