0

これが私のプログラムの背景です:各タンパク質はアミノ酸(またはAA)のシーケンスから作られています

私はいくつかのテーブルを持っています:tblProInfo(タンパク質に関する一般的な情報を含む)、tblOrderAA(特定のタンパク質のシーケンス(AAシーケンス)を含む(各タンパク質には以前に設定したシリアル番号があります))

今、私はユーザーがtextbox1に入れた配列の一部を含むタンパク質の科学名を復活させようとしています。ユーザーが入力した配列が複数のタンパク質に含まれている可能性があります。

これが私のコードです。「構文エラー」が発生しましたが、間違いが多いと思います。助けてください!

        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;


    }
4

1 に答える 1

1

ここにスペースがありません

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

このように書き直します

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

ただし、エラーやインジェクション攻撃の可能性を回避するために、パラメーター化されたクエリ(msaccessも使用)を使用する必要があります。
もう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

    ........

}

編集:完全に機能する解決策を提供することはできません。問題の多くの側面が私にはわかりませんが、この方法でクエリを変更することで、大幅に簡素化できます。

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

WHERE  tblOrderAA.orderAACodon1 = @codons

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

于 2012-04-29T16:09:34.383 に答える