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 编程心得
留言反馈
鄙视
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);
}
... ... }
一定要有CommandType.StoredProcedure这个参数,要不然不行!
WIN32_FIND_DATA
我们需要使用#include <windows.h>
可是在c#中,我使用WIN32_FIND_DATA
该怎么办?
能给我回答么? 我的邮箱fumade@etang.com
Lostinet
介绍介绍你这个东东的特点吧。
懒得看代码。^&^
我为这个可是郁闷了近4天呀。
一直没想到SqlHelper 这里有这个限制,一直以为是其他地方的问题。
找问题就找偏了路。
为这个摔的跟头好大。
good luck!
这些写出来,就是为了让一些人避免象我一样,摔了跟头
才看到。
/// <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>
郁闷,自己语言表达太差,说了半天,还是很多人误解了我的意思。
SqlHelper.ExecuteNonQuery(FrameBase.Configuration.DBConnectionString, CommandType.StoredProcedure ,"Chinact_OA_insertFunction",paras);
这里你修改为:
SqlHelper.ExecuteNonQuery(FrameBase.Configuration.DBConnectionString, "Chinact_OA_insertFunction",paras);
就会有我说的问题了。
----------------
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;
}
---------------------
返回前,SqlHelper 并没有把commandParameters 的内容转赋给parameterValues 。所以之后你无法访问返回、输出参数的值。
这样说,总不会怀疑了吧。。。
你强烈怀疑啥呀??
作用域的问题有啥好怀疑的??
SqlHelper.ExecuteNonQuery(_con,"GetRoundInfobyChapterID_Round",
arParams);
你可以再试试,肯定返回值无法获得。
??????????????
强烈怀疑
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);
}
}