为什么数据库连接关闭后,其返回的sqldatareader也无法读取了呢?
代码如下:
Public Function get_site(ByVal power As Integer, ByVal dic As String) As SqlDataReader
'得到权限值小于参数POWER,目录名为dic,并且state值为1的页面
Dim conn As SqlConnection
Dim comm As SqlCommand
Dim dr As SqlDataReader
conn = New SqlConnection(SqlHelper.DBconnectionstring)
comm = New SqlCommand("Pr_getsite", conn)
comm.CommandType = CommandType.StoredProcedure
comm.Parameters.Add(New SqlParameter("@power", SqlDbType.Int))
comm.Parameters("@power").Value = power
comm.Parameters.Add(New SqlParameter("@dic", SqlDbType.NVarChar, 50))
comm.Parameters("@dic").Value = dic
Try
conn.Open()
dr = comm.ExecuteReader
Return dr
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
conn.Dispose()
End If
End Try
End Function
如果我不加try.........finally.......end try ,其返回的dr就可以正常使用,但是这样无法保证关闭数据库连接,经常使整个程序出现链接池慢的现象,因为获得页面是一个要执行得很多得动作;
但是如果加了try.........finally.......end try ,返回的dr总是提示阅读器关闭时,read的尝试无效
这里该怎么解决呢?
问题点数:100、回复次数:9Top
1 楼napsoft(乡下人)回复于 2006-03-01 08:50:35 得分 10
用SqlDataReader有是对数据库操作并不是很好,见意用SqlAdapter.
Top
2 楼wxl_pilot(空军飞行员)回复于 2006-03-01 08:54:00 得分 10
DataReader 和CONN是紧密相关的,当数据库连接关闭后dr自然也关闭了
建议你填充DataSet后返回DataTable
Top
3 楼napsoft(乡下人)回复于 2006-03-01 08:54:16 得分 10
Public Function get_site(ByVal power As Integer, ByVal dic As String) As SqlDataReader
'得到权限值小于参数POWER,目录名为dic,并且state值为1的页面
Dim conn As SqlConnection
Dim comm As SqlCommand
Dim ds as DataSet
Dim SqlAd as new Sqladapter
conn = New SqlConnection(SqlHelper.DBconnectionstring)
comm = New SqlCommand("Pr_getsite", conn)
comm.CommandType = CommandType.StoredProcedure
comm.Parameters.Add(New SqlParameter("@power", SqlDbType.Int))
comm.Parameters("@power").Value = power
comm.Parameters.Add(New SqlParameter("@dic", SqlDbType.NVarChar, 50))
comm.Parameters("@dic").Value = dic
SqlAd.selectcommand = comm
Try
conn.Open()
SqlAd.fill(ds)
Return ds
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
conn.Dispose()
End If
End Try
End Function
Top
4 楼lidong6(立冬)回复于 2006-03-01 08:56:44 得分 30
comm.ExecuteReader改为:
comm.ExecuteReader(CommandBehavior.CloseConnection)Top
5 楼lidong6(立冬)回复于 2006-03-01 08:57:31 得分 30
CommandBehavior.CloseConnection在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。Top
6 楼wxl_pilot(空军飞行员)回复于 2006-03-01 09:03:16 得分 5
方法如下:
Public Function get_site(ByVal power As Integer, ByVal dic As String) As SqlDataReader
'得到权限值小于参数POWER,目录名为dic,并且state值为1的页面
Dim conn As SqlConnection
Dim comm As SqlCommand
Dim da As SqlDataAdapter
Dim ds As DataSet
conn = New SqlConnection(SqlHelper.DBconnectionstring)
comm = New SqlCommand("Pr_getsite", conn)
comm.CommandType = CommandType.StoredProcedure
comm.Parameters.Add(New SqlParameter("@power", SqlDbType.Int))
comm.Parameters("@power").Value = power
comm.Parameters.Add(New SqlParameter("@dic", SqlDbType.NVarChar, 50))
comm.Parameters("@dic").Value = dic
Try
conn.Open()
da.SelectCommand = comm
da.FillDataSet(ds,"myTable")
Return ds.Table["myTable"] //返回DataTable
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
conn.Dispose()
End If
End Try
End Function
Top
7 楼luck0235(风平浪静时人人都能掌舵)回复于 2006-03-01 09:13:43 得分 5
//关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭
Try
conn.Open()
Return comm.ExecuteReader(CommandBehavior.CloseConnection);
......Top
8 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-03-01 09:18:04 得分 0
像你这种情况,应该控制DataReader的生存期。
其实很好理解,如果数据库连接关了,当然是不能到数据库中去读取数据了。
利用SqlCommand.ExecuteReader( CommandBehavior.CloseConnection )创建的SqlDataReader在关闭时会将数据库连接一起关闭。
然后,你可以using这个SqlDataReader或者try...finallyTop
9 楼nosuchtracter(极品拖拉机)回复于 2006-03-01 09:24:56 得分 0
public string ProExecNonQuery(string ProcedureName,ref string[] InputArray)
{
string strconn=ConfigurationSettings.AppSettings["localhost"];
SqlConnection sqlconn=new SqlConnection(strconn);
SqlCommand sqlcmd=new SqlCommand(ProcedureName,sqlconn);
sqlcmd.CommandType=CommandType.StoredProcedure;
sqlcmd.Connection.Open();
SqlCommandBuilder.DeriveParameters(sqlcmd);
int Len=0;
int I=0;
Len=InputArray.Length;
for(I=0;I<Len;I++)
{
try
{
sqlcmd.Parameters[I].Value=InputArray[I];
}
catch(Exception e)
{
}
}
sqlda=sqlcmd.ExecuteReader();
sqlcmd.Connection.Close();
return sqlcmd.Parameters["@strMessage"].Value.ToString();;
}Top




