蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 597, 评论 - 4064, 引用 - 276

导航

关于

这里是我的技术Blog,下一代CSDN社区Blog在 http://blog.csdn.net/ghj1976/

标签

每月存档

最新留言

  • re:学习笔记:7种结构型设计模式简单对比
    <p>最新在家创业系统 ----刚从国外引进,市场巨大。 ----在家可经营所有国家生意,事业规模宏大。 ----不需求人与说服;不用放厚脸皮去推销。 ----极小投资;零风险;成...
    by jackielongteng(注册) on 2009/6/14 13:43:56
  • re:作用域
    <p>☆                    &deg;∵☆       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
    by jackielongteng(注册) on 2009/6/14 13:03:25
  • re:Html标签嵌套对展示性能的影响
    <p><strong>所有的浏览器都按照你提到的浏览器解析Html规则来解析嘛?</strong></p>
    by Cola(注册) on 2009/6/12 23:07:28
  • re:Html5
    <p>目前来说,HTML5还只是一个梦想,呵呵:)</p>
    by 开心就好(注册) on 2009/6/11 16:31:54
  • re:多线程与SqlConnection.Close
    <p>好服月租型IT服务台,与你共成长! 月租型ITSM软件,注册即可免费体验! 详情请登录官方网站:<a href="http://www.servicezon.co...
    by qzhibo(注册) on 2009/6/3 15:14:21
  • re:多线程Singleton单件模式
    <pre><span style="color: #0000ff;">//Another way public</span> <sp...
    by Yaojian(注册) on 2009/4/22 14:02:35
  • re:Thread.Sleep(0)
    <p>学习了~</p>
    by shuitong888(注册) on 2009/4/8 14:29:24
  • re:Html标签嵌套对展示性能的影响
    <p>DIV固然好 但IE6,7,8 firefox,safari ....做美工的人要累死.</p>
    by ryq1(注册) on 2009/4/3 14:16:25
  • re:用.net 编码实现朗读文本的方法
    <p>我第一次 按键时 能听到声音,但是第二次按键时,没反应。网页一直在 loading.&nbsp;是什么原因?</p>
    by tracytang949(注册) on 2009/3/27 7:01:09
  • re:information_schema.routines与sysobjects
    <p>用sys.procedures多好。</p>
    by luke(注册) on 2009/3/16 16:45:49
  • re:SQL Server 2005 配置发送邮件
    <p>&lt;A href="<a href="http://www.3rt.info">http://www.3rt.info</...
    by ives007(注册) on 2009/2/26 16:47:00
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:45:08
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:32:06
  • re:虚机搭配NLB负载平衡时碰到"没有接口可用于安装新的群集"的解决方案
    <p>google newsid</p>
    by iads(注册) on 2009/2/13 17:25:07
  • re:try catch 与线程
    <p>确实是这样的。因为异常机制本质上是堆栈操作,而各线程的堆栈是独立的。</p>
    by st_szr(注册) on 2009/1/21 9:46:05
  • re:try catch 与线程
    <p>没啥啊,线程就是新启动了一个,当然异常不会影响到原有的线程了。</p> <p>你应该在线程里面合适的位置写上自己的捕获代码就行了。</p>
    by laozizhu(注册) on 2009/1/19 16:33:21
  • re:我的2008,征服天堂
    <p>蝈蝈,可惜我帮不了你啊!</p>
    by laozizhu(注册) on 2009/1/19 16:25:45
  • re:try catch 与线程
    <p>呃&hellip;&hellip;是这样的。可怎么处理呢?</p>
    by Anders Liu(注册) on 2009/1/19 11:58:05
  • re:我的2008,征服天堂
    <p>博主是不是去了师部 做了侦查营长呢?</p>
    by huobazi(注册) on 2009/1/9 14:15:33
  • re:我的2008,征服天堂
    <p>@ghj1976:看来真的危机了</p>
    by 开心就好(注册) on 2009/1/9 10:17:37
  • re: 网络带宽的单位
    不过传输的时候,往往还有压缩。
    by luke(匿名) on 2008/12/15 11:00:21
  • re: 网络带宽的单位
    除10不仅仅是为了方便,在传输中,往往加上控制位,所以一个字节往往需要10Bit.
    by 关门放狗(匿名) on 2008/12/13 16:01:30
  • re: 多缓存并存
    对跨进程甚至跨服务器缓存的性能比较怀疑,进程通信和跨服务器通信代价不菲。即使有已有进程外数据可用,如果考虑在进程做份缓存,定期再进程间同步是否更佳?
    by jinglecat(匿名) on 2008/12/12 18:00:05
  • re: 网络带宽的单位
    好像还有一个为了方便换算,厂家使用的是 除10的处理方式的说法:于是100Mb/sec = 100M / 10 = 10M Byte/sec 所以我通常都是用除10而不是除8来做运算的。
    by kentliu(匿名) on 2008/12/11 11:38:55
  • re: 网络带宽的单位
    又不是大S小s
    by luke(匿名) on 2008/12/10 12:04:50

广告

 

SqlHelper使用中需要注意的一点(带输出、返回参数的存储过程):

SqlHelper中,在使用存储过程时候,如果你的存储过程参数中有输出、返回参数。有些函数是无法使用的。具体来说就是:

         SQLHelp 里面,如果传入的参数中有 params SqlParameter[] commandParameters 的那几个,是没问题的,有问题的是传入参数中有:params object[] parameterValues 的那几个:

比如:
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)  这个没有提到的问题。

这个
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
有提到的问题。

下面是有这些问题的函数列表:

public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues)
public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues)
public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues)

public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues)
public static DataSet ExecuteDataset(SqlConnection connection, string spName, params object[] parameterValues)
public static DataSet ExecuteDataset(SqlTransaction transaction, string spName, params object[] parameterValues)

public static SqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues)
public static SqlDataReader ExecuteReader(SqlConnection connection, string spName, params object[] parameterValues)
public static SqlDataReader ExecuteReader(SqlTransaction transaction, string spName, params object[] parameterValues)

public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues)
public static object ExecuteScalar(SqlConnection connection, string spName, params object[] parameterValues)
public static object ExecuteScalar(SqlTransaction transaction, string spName, params object[] parameterValues)

public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues)
public static XmlReader ExecuteXmlReader(SqlTransaction transaction, string spName, params object[] parameterValues)


public static void FillDataset(string connectionString, string spName,
   DataSet dataSet, string[] tableNames,
   params object[] parameterValues)
public static void FillDataset(SqlConnection connection, string spName,
   DataSet dataSet, string[] tableNames,
   params object[] parameterValues)
public static void FillDataset(SqlTransaction transaction, string spName,
   DataSet dataSet, string[] tableNames,
   params object[] parameterValues)

 

这里的类似函数的特征就是参数中,其中一个参数是:
params object[] parameterValues

如果你非要使用这些函数,你就会看到,你接收不到返回的存储过程输出、返回参数。

原因:
      在这些函数的内部实现中,他把object[] parameterValues 转换为 SqlParameter[] commandParameters,而commandParameters 是个局部变量,在离开这个函数后,这些就无法再访问了。返回前,SqlHelper 并没有把commandParameters 的内容转赋给parameterValues 。所以之后你无法访问返回、输出参数的值。

可以参看其中一个函数的实现:
public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues)
{
     if( connection == null ) throw new ArgumentNullException( "connection" );
     if( spName == null || spName.Length == 0 ) throw new ArgumentNullException( "spName" );
     if ((parameterValues != null) && (parameterValues.Length > 0))
    {
          SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName);
          AssignParameterValues(commandParameters, parameterValues);
          return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters);
    }
    else
    {
          return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName);
    }
}

        以前一直没有留意到这一点,前几天写的代码中,存储过程的参数老是无法返回.Debug的时候,一直没想是SqlHelper 这里的的情况,花了好长时间一直找不到问题所在,极度郁闷。太想当然了。Debug 的大部分时间都走了弯路。

打印 | 张贴于 2004-04-12 11:31:00 | Tag:.net 编程心得

留言反馈

#关于SqlHelper.ExecuteNonQuery的返回值问题 编辑
SqlHelper.ExecuteNonQuerystring的两个构造函数在返回值方面有差异如果执行SqlHelper.ExecuteNonQuerystring(connectionString,...
2007-12-14 00:33:00 | [匿名用户:华威]
#Probe Into SQL Server Produce 编辑
2007-07-31 16:00:00 | [匿名用户:nyzfl]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
博客主人也看小气了,我说我的blog能解决此问题,把我的博客连接评论给删除了

鄙视
2007-07-23 09:27:00 | [匿名用户:nyzfl]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
1
2007-07-22 16:03:00 | [匿名用户:1]
#探讨SQL Server存储过程 编辑
2007-07-18 12:43:00 | [匿名用户:nyzfl]
#探讨SQL Server存储过程 编辑
探讨SQL Server存储过程
2007-06-28 11:27:00 | [匿名用户:nyzfl]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
楼主发现的问题,我也碰到了,那怎么得到返回的输出参数呢?
2007-05-17 22:17:00 | [匿名用户:学习中]
#DataAccess 学习(3)——不能不说的SQLHelper(第二节) 编辑
现在再来看看03版本的SqlHelper较之以前的版本,增加了不少内容.在数据操作的方法中进一步细化.在ExecuteNonQuery(),ExecuteReader(),ExecuteScalar(...
2006-08-12 13:33:00 | [匿名用户:梁广永]
#re: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
他的调用
public static SqlParameter[] GetSpParameterSet(string connectionString, string spName)
{
return GetSpParameterSet(connectionString, spName, false);
}

看到了吗???传递的返回值总是false
public static SqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
{... ...}


这里为什么他总是移除cmd参数为0的所以呀
private static SqlParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
{
... ...
if (!includeReturnValueParameter)
{
cmd.Parameters.RemoveAt(0);
}
... ... }
2005-10-27 11:24:00 | [匿名用户:123]
#re: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
这个是不是可以实现对N个参数进行封装?如果是的话那真是太方便了。
2005-02-26 00:40:00 | [匿名用户:狂闪工作室]
#re: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
我靠,太牛比了
2004-11-13 21:40:00 | [匿名用户:ysh]
#re: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
我用了大量的sqlhelper类的函数,但现在别的机器访问就出错,怎么回事啊,希望高手帮帮忙啊
2004-10-28 09:09:00 | [匿名用户:求救!!!1!!!!!!!!!!!!!!!!!!!!!!!!!!]
#re: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
asdasd
2004-10-28 09:07:00 | [匿名用户:asda]
#re: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
aaaa
2004-10-28 09:07:00 | [匿名用户:aaaaaa]
#re: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
SqlHelper.ExecuteNonQuery(connstring, CommandType.StoredProcedure, "sp",para)
一定要有CommandType.StoredProcedure这个参数,要不然不行!
2004-09-23 11:39:00 | [匿名用户:jiangshow]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
我也有遇到这样的问题,请问怎么修改。
2004-07-06 13:33:00 | [匿名用户:Kave]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
诸位大哥辛苦了,小弟谢过了!!!1
2004-07-06 11:30:00 | [匿名用户:lunker]
#各位大侠请假一个问题 编辑
在vc++中 使用一个结构提
WIN32_FIND_DATA
我们需要使用#include <windows.h>

可是在c#中,我使用WIN32_FIND_DATA
该怎么办?

能给我回答么? 我的邮箱fumade@etang.com
2004-05-06 20:40:00 | [匿名用户:海盗]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
to:
Lostinet

介绍介绍你这个东东的特点吧。

懒得看代码。^&^
2004-04-13 10:49:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
确实,以后写程序要注意了,再次谢谢蝈蝈!!
2004-04-12 23:54:00 | [匿名用户:coollzh]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
你应该补补debug的功课。:)
2004-04-12 20:06:00 | [匿名用户:JGTM'2004 [MVP]]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
55555555555555

我为这个可是郁闷了近4天呀。

一直没想到SqlHelper 这里有这个限制,一直以为是其他地方的问题。

找问题就找偏了路。

为这个摔的跟头好大。
2004-04-12 14:55:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
谢谢蝈蝈,要不是看到你的贴子,我也不会仔细的看原码,也许会因为这个郁闷很久呢:)
good luck!
2004-04-12 14:51:00 | [匿名用户:jiangyu]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
上面的注释我也是找到问题所在所在后,才看到的,也就是摔了跟头后,才看到的。以前一直没留意。

这些写出来,就是为了让一些人避免象我一样,摔了跟头
才看到。
2004-04-12 14:43:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
各位大侠,不是sqlhelper错了,人家的方法注解上都清楚的写了哪些方法不能返回output parameters 的,呵呵
2004-04-12 14:34:00 | [匿名用户:jiangyu]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
看来是我理解错了,我以为他提示的所以带参数的方法有不能返回值,我看了一下代码,发现这样一段话,呵呵。汗!!!!!!!!!

/// <remarks>
/// This method provides no access to output parameters or the stored procedure's return value parameter.
///
/// e.g.:
/// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36);
/// </remarks>
2004-04-12 14:32:00 | [匿名用户:jiangyu]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
传递object[]的确得不到返回值,不过我从不传递object[],我觉得传递SqlParameter[]会更加清晰,容易阅读也理解.
2004-04-12 14:31:00 | [匿名用户:mmkk]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
嘿嘿,没关系,反正sqlhelper的源码在,改了就是;)
2004-04-12 14:31:00 | [匿名用户:rIPPER]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
回复里面写代码的这些,都没问题,只不过你没看清楚我写的东西。我说有问题的情况不是你那种情况。

郁闷,自己语言表达太差,说了半天,还是很多人误解了我的意思。

2004-04-12 14:23:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
俺的代码肯定是没问题的,俺们这里n个小弟用了都说好,刮刮叫。
2004-04-12 14:21:00 | [匿名用户:rIPPER]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
倒,你没看到我写的,要注意的不是你的范例代码中用的那个函数,那个函数没问题,有问题的是我上面提到的那几个函数。


SqlHelper.ExecuteNonQuery(FrameBase.Configuration.DBConnectionString, CommandType.StoredProcedure ,"Chinact_OA_insertFunction",paras);

这里你修改为:

SqlHelper.ExecuteNonQuery(FrameBase.Configuration.DBConnectionString, "Chinact_OA_insertFunction",paras);

就会有我说的问题了。
2004-04-12 14:12:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
我都是这么做的,没有用自带的SqlParameter。而且觉得他用了SqlCommandBuilder.DeriveParameters 这个方法并没有体限出什么优点啊,呵呵。
----------------
public int Insert(FunctionData functionData)
{
int result;
SqlParameter[] paras =
{
DbParam.MakeOutParam("@FunctionID",SqlDbType.Int,4),
DbParam.MakeInParam("@FunctionName",SqlDbType.VarChar,50,functionData.FunctionName),
DbParam.MakeInParam("@PageName",SqlDbType.VarChar,255,functionData.PageName),
DbParam.MakeInParam("@RootID",SqlDbType.Int,4,functionData.RootID),
DbParam.MakeInParam("@Indent",SqlDbType.Int,4,functionData.Indent),
DbParam.MakeInParam("@Icon",SqlDbType.VarChar,255,functionData.Icon),
DbParam.MakeInParam("@Description",SqlDbType.VarChar,255,functionData.Description),
DbParam.MakeInParam("@Remark",SqlDbType.VarChar,255,functionData.Remark),
};

result = SqlHelper.ExecuteNonQuery(FrameBase.Configuration.DBConnectionString, CommandType.StoredProcedure ,"Chinact_OA_insertFunction",paras);

if (result == 1)

return ((int)paras[0].Value);

else

return -1;
}

---------------------
2004-04-12 13:49:00 | [匿名用户:jiangyu]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
原因就是在这些函数的内部实现中,他把object[] parameterValues 转换为 SqlParameter[] commandParameters,而commandParameters 是个局部变量,在离开这个函数后,这些就无法再访问了。
返回前,SqlHelper 并没有把commandParameters 的内容转赋给parameterValues 。所以之后你无法访问返回、输出参数的值。

这样说,总不会怀疑了吧。。。
2004-04-12 13:44:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
强烈怀疑 ,

你强烈怀疑啥呀??

作用域的问题有啥好怀疑的??
2004-04-12 13:07:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
就上面的代码:

SqlHelper.ExecuteNonQuery(_con,"GetRoundInfobyChapterID_Round",
arParams);

你可以再试试,肯定返回值无法获得。
2004-04-12 13:01:00 | [匿名用户:ghj1976]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
"他把object[] parameterValues 转换为 SqlParameter[] commandParameters,而commandParameters 是个局部变量,在离开这个函数后,这些就无法再访问了。"
??????????????
强烈怀疑
2004-04-12 12:36:00 | [匿名用户:重粒子]
#回复: SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程): 编辑
代码写得比较丑,献代码了;)

public static void GetRoundInfobyChapterID_Round(
int chapterid,
int round,
out string proofreadername,
out string proofreaderalias,
out DateTime roundtime)
{

SqlParameter[] arParams = new SqlParameter[5];
arParams[0] = new SqlParameter("@chapterid", chapterid);
arParams[1] = new SqlParameter("@round",round);


arParams[2] = new SqlParameter("@proofreadername", SqlDbType.NVarChar,100);
arParams[2].Direction=ParameterDirection.Output;

arParams[3] = new SqlParameter("@proofreaderalias", SqlDbType.NVarChar,100);
arParams[3].Direction=ParameterDirection.Output;

arParams[4] = new SqlParameter("@roundtime", SqlDbType.DateTime,8);
arParams[4].Direction=ParameterDirection.Output;

try
{
SqlHelper.ExecuteNonQuery(_con,CommandType.StoredProcedure,
"GetRoundInfobyChapterID_Round",
arParams);
proofreadername=arParams[2].Value.ToString();
proofreaderalias=arParams[3].Value.ToString();
if (arParams[4].Value!=DBNull.Value)
roundtime=(DateTime)arParams[4].Value;
else
roundtime=new DateTime(2000,1,1);

}
catch (Exception ex)
{
throw new Exception("DB Access Error.",ex);
}
}
2004-04-12 12:09:00 | [匿名用户:rIPPER]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.0