蝈蝈俊.net

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

导航

关于

记录自己的技术心得

标签

每月存档

最新留言

  • Ixbrwhbq
    magic story very thanks <a href=" http://www.wikio.com/user/gikihyfer/bio "...
    by Ixbrwhbq(匿名) on 2010/3/20 13:47:16
  • Mtktzzls
    Best Site good looking <a href=" http://www.wikio.com/user/jufafakypokup/bio &qu...
    by Mtktzzls(匿名) on 2010/3/20 13:12:14
  • Ipjezvxt
    Jonny was here <a href=" http://www.wikio.com/user/jufafakypokup/bio "&...
    by Ipjezvxt(匿名) on 2010/3/20 12:16:42
  • Wznnsogm
    Cool site goodluck :) <a href=" http://www.wikio.com/user/iokyjyhemada/bio &quot...
    by Wznnsogm(匿名) on 2010/3/20 11:43:14
  • Gnafoxhp
    Very funny pictures <a href=" http://www.wikio.com/user/iokyjyhemada/bio "&...
    by Gnafoxhp(匿名) on 2010/3/20 10:45:39
  • Ksuzmddk
    magic story very thanks <a href=" http://www.wikio.com/user/odujeroaraqe/bio &qu...
    by Ksuzmddk(匿名) on 2010/3/20 10:11:48
  • Fojtvlsy
    magic story very thanks <a href=" http://www.wikio.com/user/odujeroaraqe/bio &qu...
    by Fojtvlsy(匿名) on 2010/3/20 9:17:16
  • Celmsmph
    very best job <a href=" http://www.wikio.com/user/eloeumo/bio ">loli...
    by Celmsmph(匿名) on 2010/3/20 8:43:16
  • Bgzgmzil
    Excellent work, Nice Design <a href=" http://www.wikio.com/user/eloeumo/bio &quo...
    by Bgzgmzil(匿名) on 2010/3/20 7:47:56
  • Rrppzzvy
    good material thanks <a href=" http://www.wikio.com/user/asusupoha/bio "&am...
    by Rrppzzvy(匿名) on 2010/3/20 7:15:06

广告

 

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.2.0