使用 OLEDB 获取包含特定序列的蛋白质

本文关键字:蛋白质 OLEDB 获取 包含特 使用 | 更新日期: 2023-09-27 18:32:32

这是我程序的背景:每种蛋白质都由一系列氨基酸(或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;

    }

使用 OLEDB 获取包含特定序列的蛋白质

这里缺少一个空格

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

以这种方式重写

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

但是,您应该使用参数化查询(也使用 msaccess)来避免可能的错误和注入攻击。
另一个问题是全局数据连接。不要那样做,这样一无所获。
返回连接并使用 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

使用其查询编辑器直接在 Access 中尝试它,如果它按预期工作,请更改您的代码。不需要两个查询和交叉循环即可获取结果。