2015-11-13 46 views
0

我正在嘗試使用SQL和C#在Access中更新數據庫記錄。使用UPDATE查詢不斷給我一個錯誤如何更新用戶輸入範圍內的數據庫記錄?

語法錯誤(缺少操作員)在查詢表達式

所有的查詢條件爲用戶輸入。我已經嘗試了很多來源來找到答案,但我相信我的SQL語句是正確的。以下是執行我需要的任務的方法。

private void btnUpdate_Click(object sender, EventArgs e) 
{ 
     int teamYear = Convert.ToInt32(this.textBoxBegYear.Text); 
     int endYear = Convert.ToInt32(this.textBoxEndYear.Text); 
     string teamName = this.textBoxTeamName.Text; 
     string league = this.textBoxLeague.Text; 
     string conference = this.textBoxConf.Text; 
     string division = this.textBoxDivision.Text; 

     try 
     { 
      dbConn = new OleDbConnection(); 
      dbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
       + ch + openFileDialog1.FileName + ch; 
      dbConn.Open(); 

      sql = "UPDATE " + this.comboBox1.SelectedItem.ToString() 
       + " SET LeagueName = @leagueName, ConferenceName = @conferenceName, 
       DivisionName = @divisionName WHERE TeamName = " + this.textBoxTeamName.Text 
       + " AND TeamYear BETWEEN " + this.textBoxBegYear.Text 
       + " AND " + this.textBoxEndYear.Text; 

      dbCmd = new OleDbCommand(sql, dbConn); 

      for (int i = teamYear; i <= endYear; i++) 
      { 
       dbCmd.Parameters.AddWithValue("@leagueName", league); 
       dbCmd.Parameters.AddWithValue("@conferenceName", conference); 
       dbCmd.Parameters.AddWithValue("@divisionName", division); 
       dbCmd.ExecuteNonQuery(); 
      } 
      dbCmd.Connection.Close(); 
      dbConn.Close(); 
     } 
     catch (Exception err) 
     { 
      MessageBox.Show("Error: " + err.Message.ToString()); 
     } 
} 

異常的WHERE條款要求丟失的運算符後,來自SQL語句的下半年。

任何人都可能碰巧看到我可能錯過了什麼嗎?任何幫助,將不勝感激。

+0

這段代碼是一個安全噩夢 - 不要接受用戶輸入並直接從中形成sql語句。你很容易受到SQL注入攻擊。 – womp

+0

你有SQL注入問題。而且我認爲你錯過了一些''圍繞this.textBoxTeamName.Text –

+1

哦可憐的小鮑比表! https://xkcd.com/327/每個人都會忘記你( – Kritner

回答

1

你爲什麼不以「試試看」的塊替換代碼這樣:

 dbConn = new OleDbConnection(); 
     dbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
      + ch + openFileDialog1.FileName + ch; 
     dbConn.Open(); 

     sql = "UPDATE " + this.comboBox1.SelectedItem.ToString() 
      + " SET LeagueName = @leagueName, ConferenceName = @conferenceName, 
      DivisionName = @divisionName WHERE TeamName = @teamName AND TeamYear BETWEEN @begYear AND @endYear"; 

     dbCmd = new OleDbCommand(sql, dbConn); 

     for (int i = teamYear; i <= endYear; i++) 
     { 
      dbCmd.Parameters.AddWithValue("@leagueName", league); 
      dbCmd.Parameters.AddWithValue("@conferenceName", conference); 
      dbCmd.Parameters.AddWithValue("@divisionName", division); 
      dbCmd.Parameters.AddWithValue("@teamName", this.textBoxTeamName.Text); 
      dbCmd.Parameters.AddWithValue("@begYear", int.Parse(this.textBoxBegYear.Text)); 
      dbCmd.Parameters.AddWithValue("@endYear", int.Parse(this.textBoxBegYear.Text)); 
      dbCmd.ExecuteNonQuery(); 
     } 
     dbCmd.Connection.Close(); 
     dbConn.Close(); 

因此,你有更好的想法的SQL查詢是什麼樣子,你參數用戶的輸入,以提高安全性(防止任何SQL注入)。

要解決您的問題,您可能需要調試到這段代碼,看看SQL查詢是什麼,並嘗試從您的SQL客戶端工具(如Sql管理工作室)執行它,您將有更好的主意出了什麼問題。

希望這會有所幫助。 Henry Liang

1

您可能忽略單引號' ...

TeamName = '" + this.textBoxTeamName.Text + "' 

另外,我假定這只是一個項目,你有和沒有,這將是可在網上玩弄?我要問的原因是SQL查詢是vulnerable to SQL injection attacks

+0

是的,這是我會亂搞個人使用,絕對不是在線。 – user2305700

1

您需要使用單引號從用戶輸入中跳過文本。

WHERE TeamName = '" + this.textBoxTeamName.Text 
       + "' AND TeamYear BETWEEN " + this.textBoxBegYear.Text 
       + " AND " + this.textBoxEndYear.Text; 

(注意單引號)。

請不要使用您發佈的代碼。請仔細閱讀SQL注入攻擊以及爲什麼您的代碼非常不安全,並將其替換爲一些正確清理的輸入處理。

+0

這是一個個人項目,我只是試圖創造一種手段,我不必做很多打字。 – user2305700

相關問題