一个通用的数据库相关操作类:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;namespace WareFieldWeb
{
/// <summary>
/// DataBase 的摘要说明。
/// </summary>
public class DataBase:IDisposable
{
public SqlConnection con;
public int RunProc(string procName)
{
int result;
SqlCommand cmd = CreateCommand(procName, null);
try
{
result=cmd.ExecuteNonQuery();
}
catch (SqlException eeee)
{
string strE="";
for (int i=0; i < eeee.Errors.Count; i++)
{
strE += "Index #" + i + "\n" +
"Message: " + eeee.Errors[i].Message + "\n" +
"LineNumber: " + eeee.Errors[i].LineNumber + "\n" +
"Source: " + eeee.Errors[i].Source + "\n" +
"Procedure: " + eeee.Errors[i].Procedure + "\n";
} OaError.Log(strE);
result=-1;
}
finally
{
this.Close();
}
return result;
}
public int RunProc(string procName, SqlParameter[] prams)
{
int result;
SqlCommand cmd = CreateCommand(procName, prams);
try
{
Open();
result=cmd.ExecuteNonQuery();
}
catch (SqlException eeee)
{
string strE="";
for (int i=0; i < eeee.Errors.Count; i++)
{
strE += "Index #" + i + "\n" +
"Message: " + eeee.Errors[i].Message + "\n" +
"LineNumber: " + eeee.Errors[i].LineNumber + "\n" +
"Source: " + eeee.Errors[i].Source + "\n" +
"Procedure: " + eeee.Errors[i].Procedure + "\n";
} OaError.Log(strE);
result=-1;
}
finally
{
this.Close();
}
return result;
} public void RunProc(string procName, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateCommand(procName, null);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
this.Close();
}
public DataSet RunProcDataSet(string procName, string tableName)
{
SqlCommand cmd = CreateCommand(procName, null);
SqlDataAdapter myAdapter = new SqlDataAdapter();
myAdapter.SelectCommand =cmd;
DataSet myDataSet=new DataSet();
myAdapter.Fill(myDataSet,tableName);
this.Close();
return myDataSet;
}
public DataSet RunProcDataSet(string procName, SqlParameter[] prams,string tableName)
{
SqlCommand cmd = CreateCommand(procName, prams);
SqlDataAdapter myAdapter = new SqlDataAdapter();
myAdapter.SelectCommand =cmd;
DataSet myDataSet=new DataSet();
myAdapter.Fill(myDataSet,tableName);
this.Close();
return myDataSet;
}
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateCommand(procName, prams);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
this.Close();
}
private SqlCommand CreateCommand(string procName, SqlParameter[] prams)
{
Open();
SqlCommand cmd = new SqlCommand(procName, con);
cmd.CommandType = CommandType.StoredProcedure;
if (prams != null)
{
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
}
cmd.Parameters.Add(
new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null));
return cmd;
}
public void Open()
{
if (con == null)
{
con = new SqlConnection(ConfigurationSettings.AppSettings["DataConn"]);
try
{
con.Open();
}
catch (Exception ex)
{
OaError.Log(ex.ToString());
}
}
} public void Close()
{
if (con != null)
con.Close();
} public void Dispose()
{
if (con != null)
{
con.Dispose();
con = null;
}
}
public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
} public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);
} public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
{
SqlParameter param; if(Size > 0)
param = new SqlParameter(ParamName, DbType, Size);
else
param = new SqlParameter(ParamName, DbType); param.Direction = Direction;
if (!(Direction == ParameterDirection.Output && Value == null))
param.Value = Value; return param;
}
}
}当执行RunProc(string procName, SqlParameter[] prams) 这个方法的result=cmd.ExecuteNonQuery();时,为什么会给我这样的错误提示:ExecuteReader 需要打开的并且可用的连接。该连接的当前状态是 Closed。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: ExecuteReader 需要打开的并且可用的连接。该连接的当前状态是 Closed。
求高手解答!
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;namespace WareFieldWeb
{
/// <summary>
/// DataBase 的摘要说明。
/// </summary>
public class DataBase:IDisposable
{
public SqlConnection con;
public int RunProc(string procName)
{
int result;
SqlCommand cmd = CreateCommand(procName, null);
try
{
result=cmd.ExecuteNonQuery();
}
catch (SqlException eeee)
{
string strE="";
for (int i=0; i < eeee.Errors.Count; i++)
{
strE += "Index #" + i + "\n" +
"Message: " + eeee.Errors[i].Message + "\n" +
"LineNumber: " + eeee.Errors[i].LineNumber + "\n" +
"Source: " + eeee.Errors[i].Source + "\n" +
"Procedure: " + eeee.Errors[i].Procedure + "\n";
} OaError.Log(strE);
result=-1;
}
finally
{
this.Close();
}
return result;
}
public int RunProc(string procName, SqlParameter[] prams)
{
int result;
SqlCommand cmd = CreateCommand(procName, prams);
try
{
Open();
result=cmd.ExecuteNonQuery();
}
catch (SqlException eeee)
{
string strE="";
for (int i=0; i < eeee.Errors.Count; i++)
{
strE += "Index #" + i + "\n" +
"Message: " + eeee.Errors[i].Message + "\n" +
"LineNumber: " + eeee.Errors[i].LineNumber + "\n" +
"Source: " + eeee.Errors[i].Source + "\n" +
"Procedure: " + eeee.Errors[i].Procedure + "\n";
} OaError.Log(strE);
result=-1;
}
finally
{
this.Close();
}
return result;
} public void RunProc(string procName, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateCommand(procName, null);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
this.Close();
}
public DataSet RunProcDataSet(string procName, string tableName)
{
SqlCommand cmd = CreateCommand(procName, null);
SqlDataAdapter myAdapter = new SqlDataAdapter();
myAdapter.SelectCommand =cmd;
DataSet myDataSet=new DataSet();
myAdapter.Fill(myDataSet,tableName);
this.Close();
return myDataSet;
}
public DataSet RunProcDataSet(string procName, SqlParameter[] prams,string tableName)
{
SqlCommand cmd = CreateCommand(procName, prams);
SqlDataAdapter myAdapter = new SqlDataAdapter();
myAdapter.SelectCommand =cmd;
DataSet myDataSet=new DataSet();
myAdapter.Fill(myDataSet,tableName);
this.Close();
return myDataSet;
}
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateCommand(procName, prams);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
this.Close();
}
private SqlCommand CreateCommand(string procName, SqlParameter[] prams)
{
Open();
SqlCommand cmd = new SqlCommand(procName, con);
cmd.CommandType = CommandType.StoredProcedure;
if (prams != null)
{
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
}
cmd.Parameters.Add(
new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null));
return cmd;
}
public void Open()
{
if (con == null)
{
con = new SqlConnection(ConfigurationSettings.AppSettings["DataConn"]);
try
{
con.Open();
}
catch (Exception ex)
{
OaError.Log(ex.ToString());
}
}
} public void Close()
{
if (con != null)
con.Close();
} public void Dispose()
{
if (con != null)
{
con.Dispose();
con = null;
}
}
public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
} public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);
} public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
{
SqlParameter param; if(Size > 0)
param = new SqlParameter(ParamName, DbType, Size);
else
param = new SqlParameter(ParamName, DbType); param.Direction = Direction;
if (!(Direction == ParameterDirection.Output && Value == null))
param.Value = Value; return param;
}
}
}当执行RunProc(string procName, SqlParameter[] prams) 这个方法的result=cmd.ExecuteNonQuery();时,为什么会给我这样的错误提示:ExecuteReader 需要打开的并且可用的连接。该连接的当前状态是 Closed。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: ExecuteReader 需要打开的并且可用的连接。该连接的当前状态是 Closed。
求高手解答!
解决方案 »
- 关于随机抽签程序的问题!
- js控制Iframe打开指定窗口
- 请教做动态图表的思路
- 为什么客户端调不出服务器的网络打印机
- 第一次打开showModalDialog时可以执行if (!ispostback)的内容,第二次打开showModalDialog就不能执行了。请问怎么解决这个问题?
- 高手帮我看看为什么静态页面的打开速度会慢
- DataList问题求教……
- 同一个用户控件能否可以根据不同的要求显示不同的内容?
- 问一个有关使用masterpage+css在不同情况下浏览结果的不致问题。
- .aspx页面如何调用Global.asax.cs设置的变量呢?
- 请问asp.net如何显式调用程序集
- =============帮我看一下这个配置怎么样!======还想压缩下,把价格控制在3K以内。求意见。
{
Open();
SqlCommand cmd = CreateCommand(procName, prams);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
this.Close();
}
而且SqlCommand cmd = CreateCommand(procName, con);需要关联连接
out SqlDataReader 是把DATAREADER出参,那么你就不能在方法里面关闭连接,而应该在外面关闭连接。public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader)
{
Open();
SqlCommand cmd = CreateCommand(procName, prams);
dataReader = cmd.ExecuteReader(); }