一个简单的问题,参与有分
我在调用存储过程的时候,总是遇到“ExecuteReader 需要打开的并且可用的连接,该连接的当前状态时Closed”的问题
string m_ConnectionString = "Data Source=DMain;Initial Catalog=RestaurantManager;User Id=sa;Password=;";
System.Data.SqlClient.SqlConnection SQL_conn = new System.Data.SqlClient.SqlConnection(m_ConnectionString);
System.Data.SqlClient.SqlCommand MyCom = new System.Data.SqlClient.SqlCommand();
MyCom.Connection = SQL_conn;
MyCom.CommandType = System.Data.CommandType.StoredProcedure;
MyCom.CommandText = "pro_AT_Base_Data_IUD";
MyCom.Parameters.Clear();
System.Data.SqlClient.SqlParameter P_intDataID = MyCom.Parameters.Add("@intDataID", System.Data.SqlDbType.Int);
System.Data.SqlClient.SqlParameter P_intDataType = MyCom.Parameters.Add("@intDataType", System.Data.SqlDbType.Int);
P_intDataID.Value = 0;
P_intDataType.Value = m_intDataType;
MyCom.ExecuteNonQuery();
问题点数:100、回复次数:12Top
1 楼cnming(cnming)回复于 2003-10-04 16:36:53 得分 0
连接可是刚打开的,怎么还说没有可用的连接?Top
2 楼jiezhi(风满袖)回复于 2003-10-04 16:42:01 得分 10
DataReader在一个连接上只能有一个是打开的。如果当前连接已经有了一个DataReader打开的话,你想新打开一个DataReader就需要新建立一个连接。
一定注意在使用完毕DataReader后关闭它。Top
3 楼qiuji(忆秋季)回复于 2003-10-04 16:53:29 得分 30
你的连接并没有打开,上面的代码中没有打开连接的代码。
你可以改成:(记住:连接打开后,要即时关闭)
SQL_conn.Open();
MyCom.ExecuteNonQuery();
SQL_conn.Close();
或者
MyCom.Connection.Open();
MyCom.ExecuteNonQuery();
MyCom.Connection.Close();Top
4 楼LiSDN(shit)回复于 2003-10-04 17:09:00 得分 10
SQL_conn.open();Top
5 楼cnming(cnming)回复于 2003-10-04 17:33:40 得分 0
谢谢,执行成功了,但是又有一个新问题
本来我里头有一个为OutPut的参数,为何不会有返回值?我的存储过程在SQL Server 查询分析器上执行都会有返回值的
谢谢Top
6 楼qiuji(忆秋季)回复于 2003-10-04 22:06:24 得分 0
你的那个OutPut参数怎么写的,要返回什么值?Top
7 楼skykevin(蓝屿)回复于 2003-10-04 22:36:16 得分 10
OutPut的参数设计时不要用缺省值,用null值或其它值.Top
8 楼cnming(cnming)回复于 2003-10-05 01:42:34 得分 0
我同学找我了,没空照顾这个帖子,不好意思
CREATE PROCEDURE [dbo].[pro_AT_Base_Data_IUD]
@intDataID int,
@intOutPut int OutPut
AS
Select @intOutPut = @intDataID
Return
string m_ConnectionString = "Data Source=DMain;Initial Catalog=RestaurantManager;User Id=sa;Password=;";
System.Data.SqlClient.SqlConnection SQL_conn = new System.Data.SqlClient.SqlConnection(m_ConnectionString);
System.Data.SqlClient.SqlCommand MyCom = new System.Data.SqlClient.SqlCommand();
MyCom.Connection = SQL_conn;
MyCom.CommandType = System.Data.CommandType.StoredProcedure;
MyCom.CommandText = "pro_AT_Base_Data_IUD";
MyCom.Parameters.Clear();
System.Data.SqlClient.SqlParameter P_intDataID = MyCom.Parameters.Add("@intDataID", System.Data.SqlDbType.Int);
System.Data.SqlClient.SqlParameter P_intOutPut = MyCom.Parameters.Add("@intOutPut", System.Data.SqlDbType.Int);
P_intDataID.Value = 10;
P_intOutPut.Value = 0;
MyCom.Connection.Open();
MyCom.ExecuteNonQuery();
MyCom.Connection.Close();
m_intDataID = Convert.ToInt32(P_intOutPut.Value.ToString());
按理会传出我传入的值 10 ,可是我真正的得到的值是 0
查询分析器调用这个存储过程的返回值是10
Top
9 楼qiuji(忆秋季)回复于 2003-10-05 02:36:31 得分 0
m_intDataID = Convert.ToInt32(P_intOutPut.Value.ToString());
这样当然返回0了,因为P_intOutPut本来的值就是0,它不是数据库返回的值。
试试:
将
MyCom.Connection.Open();
MyCom.ExecuteNonQuery();
MyCom.Connection.Close();
改成:
MyCom.Connection.Open();
System.Data.SqlClient.SqlDataReader dr=MyCom.ExecuteReader();
if(dr.Read())
{
m_intDataID = Convert.ToInt32(dr["intOutPut"].ToString());
}
MyCom.Connection.Close();
Top
10 楼cellblue(cellblue)回复于 2003-10-05 10:39:09 得分 30
把
MyCom.CommandType = System.Data.CommandType.StoredProcedure;
改成
MyCom.CommandType = System.Data.CommandType.OutPut;
即可Top
11 楼whl9234(葫芦)回复于 2003-10-05 10:57:23 得分 10
在存储过程中如果P_intOutPut是一个参数,用qiuji(忆秋季)方法就可以了
如果在存储过程中写的是return (..),那么在MyCom.ExecuteNonQuery();后
写m_intDataID=MyCom.Parameter["@RETURN_VALUE"].Value;试一试Top
12 楼cnming(cnming)回复于 2003-10-05 14:23:50 得分 0
谢谢大家Top




