我被微软忽悠了 SQLHelper

于娜 2007-02-12 01:49:33
微软的 SQLHelper 大家一定都用过吧, 下面是一种的一段。







public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
//create a command and prepare it for execution
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);

//finally, execute the command.
int retval = cmd.ExecuteNonQuery();

// detach the SqlParameters from the command object, so they can be used again.
cmd.Parameters.Clear();
return retval;
}







我要说的是这个这句中的 cmd.Parameters.Clear() .为什么要写这句,多余!,就是因为这句导致了 存储过程的输出参数 无法接收, 取掉后就好了,难道微软就没想过吗?











...全文
2411 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
wthorse 2007-02-13
  • 打赏
  • 举报
回复
以前用过sqlhelper。后来发现问题多了。还不如自己写个基本的,够用就行。
gavintolee 2007-02-13
  • 打赏
  • 举报
回复
http://blog.joycode.com/ghj/archive/2004/04/12/19015.aspx
gngnandgngn 2007-02-13
  • 打赏
  • 举报
回复
自己写的基本上都不如sqlhelper, 感慨啊
活靶子哥哥 2007-02-13
  • 打赏
  • 举报
回复
我手头没有1.1的环境 无法试验

原来用1.1的时候也确实没有用过ExecuteReader返回过程参数。

希望手上有1.1环境并且对这个问题感兴趣的朋友能够做一下试验,抓一下bug到底在那里。

当然SqlHelper只是MS提供的一个开源数据访问类库,而且属于早期版本了,虽然它用起来比目前的DAAB版本在配置和调用上都舒服的多,但还是应该结合自己的应用来使用,可以改造的适合自己的应用。
于娜 2007-02-13
  • 打赏
  • 举报
回复
xiahouwen(武眉博<活靶子.NET>)

非常感谢你的帮助,不过在在以前1.1版本的SQLHelper 确实不行,后来自己写了一个类,解决了。

不相信的话,你也可以用PETSHOP 中的SQLHelper 来访问存储过程,也同样得不到参数,这就是为什么PETSHOP不使用存储过程,而是使用SQL语句的原因吧
于娜 2007-02-13
  • 打赏
  • 举报
回复
问题已经解决了 呵呵,自己重写了一个类
活靶子哥哥 2007-02-13
  • 打赏
  • 举报
回复
试验过了
VS20005 + MS SQL Server 2005 EXPRESS + SQLHelper 2.0

ALTER PROCEDURE TestSqlHelperReturnParamter
@A INT,
@B INT,
@C INT OUTPUT,
@D INT OUTPUT
AS

-- 设置返回值
SET @C = 100
SET @D = 200

protected void Page_Load(object sender , EventArgs e)
{
string connStr = "Data Source=.\\sqlexpress;Initial Catalog=MyNorthWind;Integrated Security=True";
SqlParameter[] param = {
new SqlParameter("@A",SqlDbType.Int),
new SqlParameter("@B",SqlDbType.Int),
new SqlParameter("@C",SqlDbType.Int),
new SqlParameter("@D",SqlDbType.Int)
};
param[0].Value = 11;
param[1].Value = 22;
param[2].Direction = ParameterDirection.Output;
param[3].Direction = ParameterDirection.Output;

using ( SqlDataReader reader = SqlHelper.ExecuteReader( connStr , CommandType.StoredProcedure , "TestSqlHelperReturnParamter" , param ) )
{

}

int c = Convert.ToInt32( param[2].Value );
int d = Convert.ToInt32( param[3].Value );

}

可以得到存储过程返回参数!
Mephisto_76 2007-02-13
  • 打赏
  • 举报
回复
ExecuteNonQuery本身就不提供返回参数的功能,它只是用于更新数据库。使用ExecuteDataSet用于获取数据。
于娜 2007-02-12
  • 打赏
  • 举报
回复
wengnet(西门吹雪)
( lz还是好好读一下SqlHelper的注释吧
-----------------------------

读的够精通了
自然框架 2007-02-12
  • 打赏
  • 举报
回复
还使用自己的数据访问层的好,自己的用着方便,哈哈。

详见我的blog
wengnet 2007-02-12
  • 打赏
  • 举报
回复
lz还是好好读一下SqlHelper的注释吧
wskyo 2007-02-12
  • 打赏
  • 举报
回复
楼主去反省
xiaoqhuang 2007-02-12
  • 打赏
  • 举报
回复
终于明白,楼主的存储过程除返回2个output参数,还返回select数据集

这个没试过。ExecuteDataSet()有没有用?
于娜 2007-02-12
  • 打赏
  • 举报
回复
代码已经贴上去。请试验过的人,帮我看看,没有试验的人请先实验再说
于娜 2007-02-12
  • 打赏
  • 举报
回复
晕死,代码检查无数边了,别的地方没错误
xcode21 2007-02-12
  • 打赏
  • 举报
回复
人家都说了

// detach the SqlParameters from the command object, so they can be used again.

让这个cmd还能继续使用
再说sql是阻塞的,executenonsql之后就没用了,又不是reader

LZ还是好好检查一下别的地方吧
于娜 2007-02-12
  • 打赏
  • 举报
回复
我是这样传递参数的,应该是 SqlParameter[] 参数啊,不是object[] ,可还是接收不到值,除非把item.clear()取掉就可以了!!

返回了记录集,但是没有返回输出参数! 是微软的问题吧



SqlParameter[] param = {
new SqlParameter("@A",SqlDbType.Int),
new SqlParameter("@B",SqlDbType.Int),
new SqlParameter("@C",SqlDbType.Int),
new SqlParameter("@D",SqlDbType.Int)
};
param[0].Value = 11;
param[1].Value = 22;
param[2].Direction = ParameterDirection.Output;
param[3].Direction = ParameterDirection.Output;



// 接受用的是下面方式

using(SqlDataReader reader = SqlHelper.ExecuteReader(strConn, CommandType.StoredProcedure,"GetAll" ,param))
{
DataGrid1.DataSource = reader;
DataGrid1.DataBind();
}

int c = Convert.ToInt32(param[2].Value);
int d = Convert.ToInt32(param[3].Value);


// 存储过程如下

Create PROCEDURE GetAll
@A INT,
@B INT,
@C INT OUTPUT,
@D INT OUTPUT
AS

-- 设置返回值
SET @C = 100
SET @D = 200
trainli 2007-02-12
  • 打赏
  • 举报
回复
自己寫一個不了﹗
xk000 2007-02-12
  • 打赏
  • 举报
回复
学习中... 欢迎加入ASP.NET(C#)学习交流QQ群号:①32801051(已满) ②23222074(请不要两个群都加)
newqm 2007-02-12
  • 打赏
  • 举报
回复
确实有这个问题。
那次也是把我弄了个半死。
多谢楼主分享。
加载更多回复(25)

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧