CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

一个简单的问题,参与有分

楼主cnming(cnming)2003-10-04 16:35:57 在 .NET技术 / C# 提问

我在调用存储过程的时候,总是遇到“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

相关问题

  • 简单问题!参与就给分!
  • 简单送分题,欢迎参与
  • 问题简单,参与有分!
  • 简单问题!参与有分。。。。。。。
  • 参与者有分,简单问题?
  • 简单问题,参与有分
  • 简单问题,参与有分
  • 简单的问题,参与者都有分
  • 简单问题高手们请进...参与者有分!
  • JSP查询的简单问题,请帮忙,给高分!参与者就有分

关键词

  • 连接
  • 存储过程
  • mycom
  • intdataid
  • intoutput
  • sqlclient
  • intdatatype
  • 打开
  • commandtype
  • iud

得分解答快速导航

  • 帖主:cnming
  • jiezhi
  • qiuji
  • LiSDN
  • skykevin
  • cellblue
  • whl9234

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo