.Net数据库访问问题:已有打开的与此连接相关联的 DataReader,必须首先将它关闭。

当创建多个DataReader对象.时,系统将提示“已有打开的与此连接相关联的DataReader,必须首先将它关闭,并不是我想多创建几个这样的对象,只因数据是按树状结构分布的,通过递归来完成数据的访问,所以才会出现多个DataReader的情况,我把问题分析有如下几种可能性:

1.数据库本身的限制,这种情况不可能,我在ASP中采用的ODBC访问,没出现问题,转到.NET时才出现这样的情况。

2.我用的连接或相关的对象存在相应的属性设置,这种情况倒是有可能,但我无资料可查,通过属性浏览也没有看到可能的属性对象。

3..NET本身的BUG,这种可能性也是很大的,一般的对象的默认情况应该能够正常操作,通过限制来达到其他其他相关需求,如安全性等。

所以我把源码列出来,让大家帮个忙,有没有解决的办法,示例代码用的是ODBC,原先用的是SqlClient,结果都是一样的。

using System;
using System.Data ;
using System.Data .Odbc ;

namespace ConsoleApplication1
{
///

1<summary>   
2/// Class1 的摘要说明。   
3/// </summary>

class Class1
{
public OdbcConnection Conn;
///

1<summary>   
2/// 应用程序的主入口点。   
3/// </summary>

[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
new Class1 ().Do ();

}
public void Do()
{
// 在此处放置用户代码以初始化页面
//打开数据库连接
Conn = new OdbcConnection ("DSN=AMGDM3_SQL;uid=sa;pwd=;");
Conn.Open ();
if(Conn.State == ConnectionState .Closed )
{
//无法连接数据库服务器
Console.WriteLine ("数据库服务器已经关闭,暂停服务。");
return;
}
string strSQL = "SELECT * FROM FILE_DIRECTORY WHERE CLASS=0 AND PID=0";
OdbcDataAdapter adapter = new OdbcDataAdapter (strSQL , Conn);
ShowDirectory(adapter , "person" , Conn , 0);

}

public void ShowDirectory(OdbcDataAdapter adapter , string strId , OdbcConnection conn , int nType)
{
OdbcDataReader reader = adapter.SelectCommand .ExecuteReader ();
if(reader.HasRows )
{
while(reader.Read ())
{
if(ExistChildNode((string)reader["Id"].ToString () , conn , true))
{
Console.WriteLine (string.Format ("dir{0}=insFld({1},gFld("{2}","" , reader["Id"] , strId , reader["DirName"]));
}
else
{
Console.WriteLine (string.Format ("dir{0}=insDoc({1},gLnk(0,"{2}","" , reader["Id"] , strId , reader["DirName"]));
}
Console.WriteLine ("main.asp?DicType=Dir");
Console.WriteLine (string.Format ("&Id={0}"))\r\n" , reader["Id"]));
string strSQL;
strSQL = string.Format ("SELECT * FROM FILE_DIRECTORY WHERE PID={0}" , reader["Id"]);
OdbcDataAdapter adapter2 = new OdbcDataAdapter (strSQL , conn);
ShowDirectory(adapter2 , string.Format ("dir{0}" , reader["Id"]) , conn , nType);
}
}
reader.Close ();
}

private bool ExistChildNode(string strDeptId , OdbcConnection conn , bool bDept)
{
return true;
}

}
}

Published At
Categories with Web编程
Tagged with
comments powered by Disqus