2012-04-25 51 views
0

使用OLEDB我的代碼波紋管,我得到這個錯誤:

Troubleshooting Exceptions: System.Data.OleDb.OleDbException "syntax error" 

,我不知道我做錯了什麼。它假設從表中提取信息。我用整個項目相同的方法,只是在這一點,這讓我的煩惱......

class Codons 
{ 
    private bool start, end; 
    private string codon1, codon3, triplet1, triplet2, triplet3; 
    private string triplet4, triplet5, triplet6, fullName; 
    private OleDbConnection dataconnection; 


    public Codons(string letter) 
    { 
     this.start = false; 
     this.end = false; 
     this.dataconnection = new OleDbConnection(); 
      this.dataconnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb"; 
      this.dataconnection.Open(); 


      string sql = "SELECT tblCodons.codonsCodon3, " + 
      "tblCodons.codonsTriplet1, tblCodons.codonsTriplet2, tblCodons.codonsTriplet3, " + 
      "tblCodons.codonsTriplet4, tblCodons.codonsTriplet5, tblCodons.codonsTriplet6, " + 
      "tblCodons.codonsFullName, tblCodons.codonsStart, tblCodons.codonsEnd" 
      + " FROM tblCodons" 
      + " WHERE tblCodons.codonsCodon1="+letter; 

      OleDbCommand mycomm = new OleDbCommand(sql, dataconnection); 
      OleDbDataReader dataReader = mycomm.ExecuteReader(); 
      dataReader.Read(); 
      this.codon1 = letter; 
      this.codon3 = dataReader.GetString(0); 
      this.triplet1 = dataReader.GetString(1); 

      if (dataReader.IsDBNull(2)) 
       this.triplet2 = "  "; 
      else 
       this.triplet2 = dataReader.GetString(2); 

      if (dataReader.IsDBNull(3)) 
       this.triplet3 = "  "; 
      else 
       this.triplet3 = dataReader.GetString(3); 

      if (dataReader.IsDBNull(4)) 
       this.triplet4 = "  "; 
      else 
       this.triplet4 = dataReader.GetString(4); 

      if (dataReader.IsDBNull(5)) 
       this.triplet5 = "  "; 
      else 
       this.triplet5 = dataReader.GetString(5); 

      if (dataReader.IsDBNull(6)) 
       this.triplet6 = "  "; 
      else 
       this.triplet6 = dataReader.GetString(6); 

      this.fullName = dataReader.GetString(7); 
      this.start = dataReader.GetBoolean(8); 
      this.end = dataReader.GetBoolean(9); 
      dataReader.Close(); 

    } 

回答

1

既然你建立你的SQL查詢語句的字符串,我猜你有一些無效的SQL語法在letter。將該值附加到查詢後,會導致您看到的語法錯誤。

我會看看關於Parameterized Queries (OleDb)的這篇文章。這是將參數傳遞給查詢的正確方法,可以避免在您的應用程序中出現此類(以及其他明顯的SQL注入攻擊)。

3

這裏:

+ " WHERE tblCodons.codonsCodon1="+letter 

你正在創建一個看起來像這樣的SQL子句。

...WHERE tblCodons.codonsCodon1=A 

這是無效的SQL。在SQL字符串文字必須用引號引起來屬性格式,即

...WHERE tblCodons.codonsCodon1='A' 

要做到這一點,您可以手動添加單引號確保正確逃避串字符,所有的單引號(除非你想有對付SQL injection)...

... (更好的)您使用parameterized queries

+ " WHERE tblCodons.codonsCodon1 = ?"; 

OleDbCommand mycomm = new OleDbCommand(sql, dataconnection); 
mycomm.Parameters.AddWithValue("codonsCodon1", letter); 

此外,你應該檢查的dataReader.Read()返回值,而不是僅僅調用它:

if (!dataReader.Read()) { 
    // replace this with more useful error reporting, maybe throwing an exception 
    MessageBox.Show("No codon for this letter found."); 
    return; 
} 
+0

我得到這個錯誤「的行/列不存在任何數據。」我添加了這個:'mycomm.Parameters.AddWithValue(「tblCodons.codonsCodon1」,letter);' – Noam650 2012-04-25 15:13:07

+0

我試過了,我得到這個錯誤'行/列沒有數據存在。 ' – Noam650 2012-04-25 15:16:47

+0

@ Noam650:我已經爲正確的語法添加了一個示例。 – Heinzi 2012-04-25 15:44:59

0

這可能是您輸入的letter值不帶引號。然後它將letter的內容視爲一個函數。由於找不到函數,它會引發語法錯誤異常。

嘗試在引號關閉letter(「信」)

+0

我試過了,我得到這個錯誤'沒有數據存在的行/列。 – Noam650 2012-04-25 15:17:22