在类中使用 OLEDB

本文关键字:OLEDB | 更新日期: 2023-09-27 18:32:08

我有下面的代码,我得到这个错误:

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

在类中使用 OLEDB

在这里:

+ " 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;
}

由于您正在将SQL查询构建为字符串,因此我猜您在letter中有一些无效的SQL语法。将该值追加到查询后,它会导致你看到的语法错误。

我会看看这篇关于参数化查询(OleDb)的文章。这是将参数传递给查询的正确方法,该查询将避免应用程序中的这种情况(以及其他明显的SQL注入攻击)。

可能是

您输入的 letter 值不带引号。然后,它将letter的内容视为一个函数。由于它找不到该函数,因此会引发语法错误异常。

尝试用引号("字母")结束letter