2012-09-12 45 views
1

我有一個程序檢查Access數據庫中的表格,以查看2行,並允許用戶通過文本框更改ComplexityFactor列。如果在應用程序加載2行時創建的行不存在(除了OHorUG字段,所有字段都是相同的)。根據用戶選擇的行,用戶可以更改所選行的ComplexityFactor字段。我已經能夠成功地創建和讀取行,但我無法更新1字段。使用C更新Access錶行#

這裏是更新代碼:

private void button1_Click(object sender, EventArgs e) 
    { 
     if (listView1.SelectedItems.Count != 0) 
     { 
      ListViewItem selected = listView1.SelectedItems[0]; 
      OleDbCommand updateCmd = new OleDbCommand(); 
      myConnection.Open(); 

      updateCmd.CommandType = CommandType.Text; 
      updateCmd.CommandText = "UPDATE Contractors SET ComplexityFactor = @ComplexityFactor" + 
       " WHERE Division = @Division AND ComplexityFactorCode = @ComplexityFactorCode AND ContractNumber = @ContractNumber AND ContractorCode = @ContractorCode AND ContractorName = @ContractorName AND OHorUG = @OHorUG)"; 

      updateCmd.Parameters.AddWithValue("@ComplexityFactor", textBox1.Text.ToString());//FYI this field is a Number in Access 
      updateCmd.Parameters.AddWithValue("@Division", "SV"); 
      updateCmd.Parameters.AddWithValue("@ComplexityFactorCode", "X01"); 
      updateCmd.Parameters.AddWithValue("@ContractNumber", "0"); 
      updateCmd.Parameters.AddWithValue("@ContractorCode", "SSI"); 
      updateCmd.Parameters.AddWithValue("@ContractorName", "SunStream Inc"); 
      updateCmd.Parameters.AddWithValue("@OHorUG", selected.SubItems[6].Text.ToString()); 
      updateCmd.Connection = myConnection; 
      updateCmd.ExecuteNonQuery(); 
      myConnection.Close(); 
     } 
     else 
     { 
      MessageBox.Show("Please select a row to update..."); 


     } 

我忘了添加例外:

System.Data.OleDb.OleDbException was unhandled 
    Message=Extra) in query expression 'Division = @Division AND ComplexityFactorCode = @ComplexityFactorCode AND ContractNumber = @ContractNumber AND ContractorCode = @ContractorCode AND ContractorName = @ContractorName AND OHorUG = @OHorUG)'. 
    Source=Microsoft JET Database Engine 
    ErrorCode=-2147217900 
    StackTrace: 
     at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
     at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
     at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
     at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) 
     at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
     at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() 
     at WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in c:\Users\s153720\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs:line 199 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at WindowsFormsApplication1.Program.Main() in c:\Users\s153720\AppData\Local\Temporary Projects\WindowsFormsApplication1\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException:  

回答

1

嘗試,並在更新語句

updateCmd.CommandText = "UPDATE Contractors SET ComplexityFactor = @ComplexityFactor" + 
" WHERE Division = @Division AND ComplexityFactorCode = @ComplexityFactorCode AND ContractNumber = @ContractNumber AND ContractorCode = @ContractorCode AND ContractorName = @ContractorName AND OHorUG = @OHorUG"; 
的最後刪除右括號 )
+0

Holy CRAP!就是這樣!聲明結尾處的「)」。我盯着這幾個小時,嘗試了一些完全混淆不清的東西,爲什麼它不起作用! – lentz

+0

謝謝@ JLC007 – lentz

+0

不客氣! –

0

您可能想嘗試:

  1. 將字符串轉換爲數字cint或cdec
  2. 只要您阻止SQL注入攻擊,就可以直接將數字傳遞到SQL中。