2017-10-07 278 views
0

我正在使用Oledb與Excel表連接。我的連接工作正常。插入和檢索數據也工作正常。但是,當我嘗試使用where子句更新excel表中的記錄時,我的代碼成功執行而沒有任何錯誤,但excel行不更新。如何使用C#ADO.NET更新excel行?

我的代碼是:

strQry = @"Update [Guests$] set [FirstName][email protected],[LastName][email protected],[Address][email protected], 
[EmailId][email protected],[TelNo][email protected],[MobileNo][email protected],[FaxNo][email protected] where [GuestId][email protected]"; 

using (OleDbConnection con = new OleDbConnection(clsConnection.conStr)) 
{ 
     using (OleDbCommand cmd = new OleDbCommand(strQry,con)) 
     { 
      cmd.Parameters.Add("@GuestId", OleDbType.Integer).Value = intId; 
      cmd.Parameters.Add("@FirstName", OleDbType.VarChar, 15).Value = txtFirstName.Text; 
      cmd.Parameters.Add("@LastName", OleDbType.VarChar, 15).Value = txtLastName.Text; 
      cmd.Parameters.Add("@Address", OleDbType.VarChar, 200).Value = txtAddress.Text; 
      cmd.Parameters.Add("@EmailId", OleDbType.VarChar, 50).Value = txtEmail.Text; 
      cmd.Parameters.Add("@TelNo", OleDbType.VarChar, 20).Value = txtTelNo.Text; 
      cmd.Parameters.Add("@MobileNo", OleDbType.VarChar, 15).Value = txtMobileNo.Text; 
      cmd.Parameters.Add("@FaxNo", OleDbType.VarChar, 20).Value = txtFaxNo.Text; 
      if (con.State == ConnectionState.Closed) 
      { 
        con.Open(); 
      } 
      cmd.ExecuteNonQuery(); 
      MessageBox.Show(strSuccessMsg); 
      BinddgvGuests(); 
      ClearControls(); 

     } 
} 

但是當我刪除where子句,則所有記錄將被更新。

我的where子句有什麼問題嗎?

+0

您是否檢查過int記錄中是否存在intID值? –

+0

是的,值是存在的。 –

回答

0

搜索了很多後,最後我遇到了我的錯誤。實際上,參數應該與查詢中的順序相同。所以我改變我的參數:

cmd.Parameters.Add("@FirstName", OleDbType.VarChar, 15).Value = txtFirstName.Text; 
cmd.Parameters.Add("@LastName", OleDbType.VarChar, 15).Value = txtLastName.Text; 
cmd.Parameters.Add("@Address", OleDbType.VarChar, 200).Value = txtAddress.Text; 
cmd.Parameters.Add("@EmailId", OleDbType.VarChar, 50).Value = txtEmail.Text; 
cmd.Parameters.Add("@TelNo", OleDbType.VarChar, 20).Value = txtTelNo.Text; 
cmd.Parameters.Add("@MobileNo", OleDbType.VarChar, 15).Value = txtMobileNo.Text; 
cmd.Parameters.Add("@FaxNo", OleDbType.VarChar, 20).Value = txtFaxNo.Text; 
cmd.Parameters.Add("@GuestId", OleDbType.Integer).Value = intId; 

現在這對我來說工作得很好。

+1

當CommandType設置爲Text時,OLE DB .NET Provider不支持將參數傳遞給SQL語句或由OleDbCommand調用的存儲過程的命名參數。在這種情況下,必須使用問號(?)佔位符。 所以我猜即使你剛剛使用了問號而不是命名參數,你也會完成它。如果它支持命名參數,它將不會成爲添加命令的順序問題。 –