2012-04-29 3 views
0

を使用して、特定の配列を含むタンパク質が、私のプログラムの背景になってしまう:私はいくつかのテーブルを持っているそれぞれのタンパク質は、アミノ酸(またはAA)の配列から作られここOLEDB

を:tblProInfo(それはに関する一般的な情報が含まれていますタンパク質)、tblOrderAA(特定のタンパク質の配列(AA配列)を含む(それぞれのタンパク質には以前に設定したシリアルナンバーがある))

今、私はそのタンパク質の科学的名称を再現しようとしているユーザーがtextbox1に入れたシーケンスの一部を含んでいます。 1つ以上のタンパク質が、ユーザーがタイプした配列を含む可能性が高い。

ここに私のコードです。私は "構文エラー"を持って、私はもっと間違いがあると確信しています。助けてください!

 public void OpenDB() 
    { 
     dataConnection = new OleDbConnection(); 
     try 
     { 
      dataConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb"; 
      dataConnection.Open(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Error accessing the database: " + 
          e.Message, 
          "Errors", 
          MessageBoxButtons.OK, 
          MessageBoxIcon.Error); 
     } 
    } 

private string FromCodonsToProtein(string codons) 
    { 
     OpenDB(); 
     int sizePro=0, i,counter=0,serialPro; 
     string st="",tempst=""; 

     OleDbCommand datacommand = new OleDbCommand(); 
     datacommand.Connection = dataConnection; 
     datacommand.CommandText = "SELECT tblProInfo.proInfoAAnum, tblProInfo.proInfoSerialNum,tblProInfo.proInfoScienceName FROM tblProInfo"; 
     OleDbDataReader dataReader = datacommand.ExecuteReader(); 
     while(dataReader.Read()) 
     { 
      sizePro = dataReader.GetInt32(counter); 
      serialPro= dataReader.GetInt32(counter+1); 
      counter++; 
       OleDbCommand cmd= new OleDbCommand(); 
       cmd.Connection = dataConnection; 
       cmd.CommandText = "SELECT tblOrderAA.orderAACodon1 FROM tblOrderAA" 
           +"WHERE (((tblOrderAA.orderAASerialPro)='"+serialPro+"'))"; 

       OleDbDataReader rdr = cmd.ExecuteReader(); 
      tempst=""; 
      for (i = 0; i > sizePro; i++) 
      { 
       tempst = tempst + rdr.GetString(i); 
      } 
      if (tempst.Contains(codons)) 
      { 
       st = st + " \n" + dataReader.GetString(counter); 
      } 
     } 
      return st; 


    } 
+0

「SQLインジェクション」を確認してください – m0skit0

+0

構文エラーはどこですか? –

+0

構文エラーを修正しました。今、私はこのエラーがあります(理解できない場合は、私は英語に翻訳しました)。次の行で、 '式データ型と一致しない条件.'を実行します:' OleDbDataReader rdr = cmd.ExecuteReader(); ' – Noam650

答えて

1

あなたは可能性のあるエラーとインジェクション攻撃を避けるために(もMSACCESSで)パラメータ化クエリを使用する必要がありますしかし、このよう

cmd.CommandText = "SELECT tblOrderAA.orderAACodon1 FROM tblOrderAA" 
         +" WHERE (((tblOrderAA.orderAASerialPro)='"+serialPro+"'))"; 
         //^here 

cmd.CommandText = "SELECT tblOrderAA.orderAACodon1 FROM tblOrderAA" 
         +"WHERE (((tblOrderAA.orderAASerialPro)='"+serialPro+"'))"; 

リライトここにスペースがありません。
もう1つの問題は、グローバルなdataConnectionです。それをしないで、このように何も得られない。
接続を返し、usingステートメントでカプセル化します。例えば

:呼び出し元のコードの使用で、その後

public OleDbConnection OpenDB() 
{ 
    dataConnection = new OleDbConnection(); 
    dataConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projects_2012\\Project_Noam\\Access\\myProject.accdb"; 
    dataConnection.Open(); 
    return dataConnection; 
} 

この構文

using(OleDbConnection cnn = OpenDB()) 
{ 
    // in the rest of your code, replace dataConnection with cnn 
    // The using statement will ensure that in the case of exceptions 
    // your connection will be allways closed and properly disposed 

    ........ 

} 

EDITは:あなたは完全な作業ソリューションを与えることはできませんが、あなたの問題の非常に多くの側面がに不明ですしかし、このようにクエリを変更するのは非常に簡単です。

SELECT DISTINCT 
     tblProInfo.proInfoAAnum, 
     tblProInfo.proInfoSerialNum, 
     tblProInfo.proInfoScienceName 
FROM tblProInfo LEFT JOIN tblOrderAA 
    ON tblOrderAA.orderAASerialPro = tblProInfo.proInfoSerialNum 

WHERE tblOrderAA.orderAACodon1 = @codons 

yをクエリエディタを使用してアクセスします。期待通りに機能している場合は、コードを変更します。結果を得るために、2つのクエリーと交差ループは必要ありません。

+0

'OleDbDataReader rdr = cmd.ExecuteReader();' – Noam650

+0

はい、これは、sql文字列にWHERE句の前にスペースがないためです。 – Steve

+0

'指定されたキャストは無効です.' thats私が今取得するエラーこのコードでは、datareader.getint32の異なる列から値を取得しようとしていることがわかりました。[read-only] i]と[i + 1]との間にある。あれは正しいですか? – Noam650