C# 环路中的OleDb多连接

C# 环路中的OleDb多连接,c#,oledb,C#,Oledb,我尝试使用Oledb进行多重连接,以减少SQL请求中的变量 这是我的密码: protected void Page_Load(object sender, EventArgs e) { int var = 0; string conn = " ... "; OleDbConnection connexion = new OleDbConnection(conn); connexion.Open(); OleDbCommand cmd = new Ole

我尝试使用Oledb进行多重连接,以减少SQL请求中的变量

这是我的密码:

protected void Page_Load(object sender, EventArgs e)
{

    int var = 0;
    string conn = " ... ";
    OleDbConnection connexion = new OleDbConnection(conn);
    connexion.Open();

    OleDbCommand cmd = new OleDbCommand("SELECT ID, DATA_1, DATA_2 from Database WHERE ID = ( SELECT MAX (ID) -" + var + " FROM Database);", connexion);
    OleDbDataReader reader = cmd.ExecuteReader();
    reader.Read();

            if (!reader.HasRows)
            {
                while (!reader.HasRows)
                {
                    OleDbConnection connexion2 = new OleDbConnection(conn);
                    connexion2.Open();

                    var++;
                    OleDbCommand cmd2 = new OleDbCommand(""SELECT ID, DATA_1, DATA_2 from Database WHERE ID = ( SELECT MAX (ID) -" + var + " FROM Database);", connexion2);
                    OleDbDataReader reader2 = cmd2.ExecuteReader();
                    reader2.Read();


                    reader = reader2;
                    reader2.Close();
                    connexion2.Close();

                }
            }
            else
            {
                Label5.Text = "Line Empty";
            }


        }




    reader.Close();
    connexion.Close();
}

我有一个错误行76:

当驱动程序关闭时,尝试调用HasRows无效

如果!reader.HasRows

Ligne 75:{

Ligne 76:while!reader.HasRows错误

Ligne 77:{

Ligne 78:oledbconnectionconnexion2=新的OleDbConnectionconn

reader = reader2;
由于该行,reader现在在下一次循环迭代中关闭。

您将reader设置为reader2,然后关闭reader2,这意味着reader引用的对象已关闭。因此,当循环再次启动时,while!reader.HasRows将抛出异常,因为读卡器已关闭。您可能希望关闭reader,然后将reader2设置为r艾德

而不是

reader = reader2;
reader2.Close();

尽管说实话,整个while循环在这里似乎没有任何作用,因为您没有使用从sql查询中检索的任何数据。

首先,参数化,参数化!不要让查询处于注入状态。另外,请尝试理解并练习使用using语句来防止随机资源被锁定。请尝试此代码,看看您是如何工作的。不确定这是否是您希望执行的操作,因为您的代码非常不清楚,您对尝试执行的操作的描述也不清楚。希望这有帮助,如果没有,请尝试加强您对需要完成的操作的解释

string conn = " ... ";
using (OleDbConnection connexion = new OleDbConnection(conn))
using (OleDbCommand cmd = new OleDbCommand("SELECT ID, DATA_1, DATA_2 from Database WHERE ID = ( SELECT MAX (ID) FROM Database WHERE DATA_1 IS NOT NULL AND DATA_2 IS NOT NULL);", connexion))
{
    connexion.Open();
    using (OleDbDataReader reader = cmd.ExecuteReader())
    {
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                Label5.Text  = reader["DATA_1"].ToString();
            }
        }
        else
        {
            Label5.Text = "Line Empty";
        }
    }
}

您先执行reader=reader2;然后执行reader2.Close;但reader现在引用与reader2相同的内容,因此reader现在已关闭。您的代码不太清楚。OleDbCommand cmd2=新建OleDbCommandSELECT ID,DATA_1,DATA_2 from Database,其中ID=SELECT MAX ID-+var+from Database;,connexion2;为什么在e也要开始…逐步检查代码Peter不要关闭while循环中的连接while!reader.HasRows同时读取错误消息会立即告诉您,当驱动程序关闭时,尝试调用HasRows无效是什么错误。@Peter我怀疑您是否真的要关闭reader2,因为这是您要使用的新读取器。您ant在将reader2设置为reader2之前关闭reader。为什么要分配reader?您明白代码的意思吗?juharr,我只想将reader2的内容传入reader,以便在!reader.HasRows时重新执行我的循环,以检查他是否在我的数据库中没有记录。我在ASP.net项目中使用C和SQL。需要SQL我选择数据库中的最后一个ID,在使用OleDbDataReader的C中,我检查每一条记录,如果他没有像我的示例中那样为null,我将递减我的ID,直到在列中有一个数据。但是,当我的记录在两条记录之间有一个跳转时,我无法检查我的记录。@Peter首先,你需要递减吗?在var++的情况下,你是递增的。所以说你是递增的从9857375开始,您的下一次迭代将是9857376,您希望它返回9857371中的记录吗?在我的SQL resquest中,我使用变量var递减。我在9857376中开始记录,我希望递减此ID,直到找到一个数据。9857370数据null 9857371 null 9857375 null 9857376 nullnull@Peter这是递增的。递减将向后进行,如9857376 9857375、9857371、9857370等。为什么不将查询更改为从数据库中选择ID、DATA_1、DATA_2,其中ID=SELECT MAX ID@Value from Database,其中DATA_1不是null volearix,在我的sql请求中,我确实选择MAX RSIM_ID-+var+,所以我在变量var之前用减号递减。
string conn = " ... ";
using (OleDbConnection connexion = new OleDbConnection(conn))
using (OleDbCommand cmd = new OleDbCommand("SELECT ID, DATA_1, DATA_2 from Database WHERE ID = ( SELECT MAX (ID) FROM Database WHERE DATA_1 IS NOT NULL AND DATA_2 IS NOT NULL);", connexion))
{
    connexion.Open();
    using (OleDbDataReader reader = cmd.ExecuteReader())
    {
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                Label5.Text  = reader["DATA_1"].ToString();
            }
        }
        else
        {
            Label5.Text = "Line Empty";
        }
    }
}