2011-07-06 159 views
0

我试图绑定一个DataList控件与从SQL表中选择的数据DataList绑定:“连接未关闭,连接的当前状态为打开状态。”

 private void ShowPossiblePurchases(string CategoryName) 
{ 

    string selectSQL = "SELECT TOP 2 * FROM Menu WHERE [email protected] ORDER BY NEWID()"; 
    SqlCommand cmd = new SqlCommand(selectSQL, connection); 
    cmd.Parameters.AddWithValue("@CategoryName", CategoryName); 
    SqlDataReader reader; 

    DataList DataList1 = (DataList)lgnView.FindControl("DataList1"); 

    try 
    { 

     connection.Open(); 
     reader = cmd.ExecuteReader(); 
     DataList1.DataSource = reader; 
     DataList1.DataBind(); 

     reader.Close(); 

    } 
    catch (Exception ex) 
    { 
     Label lblError = (Label)lgnView.FindControl("lblError"); 
     lblError.Text = ex.Message; 
    } 
    finally 
    { 
     connection.Close(); 
    } 

当我运行这段代码,我得到“该连接没有关闭连接的当前状态是开放的。”

我以前版本的方法是这样的:

private void ShowPossiblePurchases(string CategoryName) 

{

string selectSQL = "SELECT TOP 2 * FROM Menu WHERE [email protected] ORDER BY NEWID()"; 
SqlCommand cmd = new SqlCommand(selectSQL, connection); 
cmd.Parameters.AddWithValue("@CategoryName", CategoryName); 
SqlDataReader reader; 

DataSet myDataSet = new DataSet(); 
myDataSet.Tables.Add("Products"); 


myDataSet.Tables["Products"].Columns.Add("ProductID"); 
myDataSet.Tables["Products"].Columns.Add("CategoryID"); 
myDataSet.Tables["Products"].Columns.Add("ProductName"); 
myDataSet.Tables["Products"].Columns.Add("Price"); 

DataList DataList1 = (DataList)lgnView.FindControl("DataList1"); 

try 
{ 
    connection.Open(); 
    reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 

     DataRow rowNew = myDataSet.Tables["Products"].NewRow(); 
     rowNew["ProductID"] = reader["ProductID"]; 
     rowNew["CategoryID"] = reader["CategoryID"]; 
     rowNew["ProductName"] = reader["ProductName"]; 
     rowNew["Price"] = reader["Price"]; 
     myDataSet.Tables["Products"].Rows.Add(rowNew); 
    } 

    DataList1.DataSource = myDataSet.Tables["Products"]; 
    DataList1.DataBind(); 
} 
catch(Exception ex) 
{ 
    Label lblError = (Label)lgnView.FindControl("lblError"); 
    lblError.Text = ex.Message; 
} 
finally 
{ 
    connection.Close(); 
} 

}

+0

我不认为你可以绑定到读者直接这样,您可能需要将结果复制到另一个集合中,并将其用作数据源 – w69rdy

+0

我会在您的连接上放置一个断点。打开然后逐步浏览并查看发生错误的位置。 – esastincy

+0

@ w69rdy:我编辑了我的第一篇文章(现在您也可以阅读我使用DataSet绑定DataList控件的方法的先前版本)。即使是那个版本,也产生了上述错误。 – Adriano

回答

0

首先尝试关闭比阅读器的连接

+0

工作正常!谢谢! – Adriano

+0

但是,我不知道为什么当我定期关闭“finally”块中的连接时,为什么需要对close()方法进行补充调用。 – Adriano

+0

其实你的“终于”运行在函数的结尾,所以你可以在连接关闭后最后写入你的阅读器。 – SMK

0

你可以检查连接首先关闭:

If ((cmd.Connection.State And System.Data.ConnectionState.Open) _ 
     <> System.Data.ConnectionState.Open) Then 
    cmd.Connection.Open() 
End If 

C#:

if (((cmd.Connection.State & System.Data.ConnectionState.Open) != System.Data.ConnectionState.Open)) { 
    cmd.Connection.Open(); 
} 
+0

这就是我现在正在做的事情。谢谢! – Adriano

0

你在哪里声明连接?

看起来好像你是在提供的代码之外声明它,然后在别的地方打开连接。

为了避免试图打开它两次,你可以把一个简单的检查,看看是否连接打开...

if (conn == null || conn.State == ConnectionState.Closed) 
       OpenDBConnection(); 
+0

连接对象在SuperClass中声明,从中可以继承子类,就像包含上述方法的子类一样。 – Adriano

相关问题