0

私は以下のコードを持っています、そして私はこのエラーを受け取ります:

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();

    }
4

3 に答える 3

3

ここ:

+ " WHERE tblCodons.codonsCodon1="+letter

次のような SQL 句を作成しています。

...WHERE tblCodons.codonsCodon1=A

これは無効な SQL です。SQL の文字列リテラルは、適切に引用符で囲む必要があります。つまり、

...WHERE tblCodons.codonsCodon1='A'

これを行うには、一重引用符を手動で追加し、文字列内のすべての一重引用符を適切にエスケープすることを確認します ( SQL インジェクションに対処する必要がない場合)...

...または(はるかに良い)パラメータ化されたクエリを使用します:

+ " 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;
}
于 2012-04-25T14:51:18.330 に答える
1

SQL クエリを文字列として作成しているため、 に無効な SQL 構文があると思いますletter。その値をクエリに追加すると、表示されている構文エラーが発生します。

Parameterized Queries (OleDb)に関するこの投稿を見てみましょう。これは、アプリケーションでこれ (およびその他の明らかな SQL インジェクション攻撃) を回避するクエリにパラメーターを渡す正しい方法です。

于 2012-04-25T14:45:11.340 に答える
0

引用符なしで の値を入力する可能性がありletterます。次に、の内容をletter関数として扱います。関数が見つからないため、構文エラーの例外がスローされます。

letter引用符 (「文字」) で閉じてみてください

于 2012-04-25T14:51:44.777 に答える