我尝试与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无效。
Ligne 74:if(!reader.HasRows)
Ligne 75:{
Ligne 76:while(!reader.HasRows) ERROR
Ligne 77:{
Ligne 78:OleDbConnection connexion2 = new OleDbConnection(conn);
答案 0 :(得分:0)
reader = reader2;
由于该行,reader
现在在下一个循环迭代中关闭。
答案 1 :(得分:0)
您将reader
设置为reader2
,然后关闭reader2
,这意味着reader
引用的对象已关闭。因此,当循环再次启动时,while (!reader.HasRows)
将抛出异常,因为reader
已关闭。您可能希望关闭reader
,然后将reader2
设置为reader
。
reader.Close();
reader = reader2;
而不是
reader = reader2;
reader2.Close();
虽然完全诚实,整个while循环似乎没有任何用处,因为你不使用从sql查询中检索的任何数据。
答案 2 :(得分:0)
首先,参数化,参数化!不要让您的疑问开放注射。此外,尝试理解并实践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";
}
}
}