C#:调用ExecuteOnQuery后不返回输出参数

C#:调用ExecuteOnQuery后不返回输出参数,c#,sql-server-2008,stored-procedures,.net-3.5,executenonquery,C#,Sql Server 2008,Stored Procedures,.net 3.5,Executenonquery,从C#我做了以下工作: SqlParameter[]Params=新的SqlParameter[3]; Params[0]=新的SqlParameter(“SearchCode”,strSearchCode);//strSearchCode是一个字符串 Params[1]=新的SqlParameter(“@Error”,0); Params[1]。方向=ParameterDirection.Output; Params[2]=新的SqlParameter(“@OutputCode”,即“”);

从C#我做了以下工作:

SqlParameter[]Params=新的SqlParameter[3];
Params[0]=新的SqlParameter(“SearchCode”,strSearchCode);//strSearchCode是一个字符串
Params[1]=新的SqlParameter(“@Error”,0);
Params[1]。方向=ParameterDirection.Output;
Params[2]=新的SqlParameter(“@OutputCode”,即“”);
Params[2].Direction=ParameterDirection.Output;
int i=SqlHelper.ExecuteNonQuery(connectionString,CommandType.StoredProcedure,“MySP”,Params);
int interor=Convert.ToInt32(参数[1].Value);
字符串strOutputCode=Convert.ToString(参数[2].Value);
SqlHelper
是一个包含数据库查询方法的helper类,我只在这里发布调用中使用的方法:

public static int ExecuteNonQuery(字符串连接字符串、CommandType CommandType、字符串commandText、参数SqlParameter[]commandParameters)
{
如果(connectionString==null | | connectionString.Length==0)抛出新的ArgumentNullException(“connectionString”);
//创建并打开一个SqlConnection,并在完成后处理它
使用(SqlConnection连接=新的SqlConnection(connectionString))
{
connection.Open();
//调用以连接代替连接字符串的重载
返回ExecuteOnQuery(连接、commandType、commandText、commandParameters);
}
}
公共静态int ExecuteOnQuery(SqlConnection连接、CommandType CommandType、string commandText、params SqlParameter[]commandParameters)
{   
如果(connection==null)抛出新的ArgumentNullException(“connection”);
//创建命令并准备执行
SqlCommand cmd=新的SqlCommand();
bool mustCloseConnection=false;
PrepareCommand(cmd,connection,(SqlTransaction)null,commandType,commandText,commandParameters,out mustCloseConnection);
//最后,执行命令
int retval=cmd.ExecuteNonQuery();
//从命令对象分离SqlParameters,以便可以再次使用它们
cmd.Parameters.Clear();
如果(必须关闭连接)
connection.Close();
返回返回;
}
私有静态void PrepareCommand(SqlCommand命令、SqlConnection连接、SqlTransaction事务、CommandType CommandType、string commandText、SqlParameter[]commandParameters、out bool mustCloseConnection)
{
如果(command==null)抛出新的ArgumentNullException(“command”);
如果(commandText==null | | commandText.Length==0)抛出新的ArgumentNullException(“commandText”);
//如果提供的连接未打开,我们将打开它
if(connection.State!=ConnectionState.Open)
{
mustCloseConnection=true;
connection.Open();
}
其他的
{
mustCloseConnection=false;
}
//将连接与命令关联
command.Connection=连接;
int timeOut=new System.Data.SqlClient.SqlConnectionStringBuilder(connection.ConnectionString).ConnectTimeout;
command.CommandTimeout=timeOut;//connection.ConnectionTimeout*2;
//设置命令文本(存储过程名称或SQL语句)
command.CommandText=CommandText;
//如果向我们提供了交易,请将其分配
if(事务!=null)
{
如果(transaction.Connection==null)抛出新的ArgumentException(“事务已回滚或提交,请提供一个打开的事务。”,“事务”);
command.Transaction=事务;
}
//设置命令类型
command.CommandType=CommandType;
//附加命令参数(如果提供)
if(commandParameters!=null)
{
附件参数(命令、命令参数);
}
返回;
}
私有静态void AttachParameters(SqlCommand命令,SqlParameter[]commandParameters)
{
如果(command==null)抛出新的ArgumentNullException(“command”);
if(commandParameters!=null)
{
foreach(commandParameters中的sqlp参数)
{
如果(p!=null)
{
//检查未指定值的派生输出值
如果((p.方向==参数方向.输入输出| |
p、 方向==参数方向输入)和
(p.Value==null))
{
p、 Value=DBNull.Value;
}
命令.Parameters.Add(p);
}
}
}
}
我的存储过程如下所示:

创建过程[dbo].[MySP]
@搜索码字符(10),
@错误int输出,
@OutputCode字符(50)输出
作为
声明@Flag1位
宣布日期
在FDate日期声明
声明@TypeM tinyint
从SearchTable中选择@OutputCode=SomeField,其中FieldToSearch=@SearchCode
如果@@ROWCOUNT=0
开始
设置@Error=1
返回
结束
从条件1=@OutputCode的另一个表中选择@Flag1=Flag_1,@TypeM=MyType
如果@@ROWCOUNT=0
开始
设置@Error=2
返回
结束
从另一个表2中选择@IDate=InitDate、@FDate=FinalDate,其中条件1=@OutputCode
如果@@ROWCOUNT=0
开始
设置@Error=3
返回
结束
从另一个表3中选择SomeField,其中Condition1=SomeCondition
如果@@ROWCOUNT=0
开始
设置@Error=4
返回
结束
从另一个表4中选择SomeField,其中Condition1=SomeCondition2
如果@@ROWCOUNT=0
开始
设置@Error=5
返回
结束
设置@Error=0
我遇到的问题是,当我执行以下操作时,输出参数
@OutputCode
没有从C#code读取:

string strOutputCode=Convert.ToString(参数[2].Value);
strOutputCode
包含
“0”

对于另一个输出参数:

int interor=Convert.ToInt32(参数[1].Value);
它返回ok,值为
0
,因为执行了存储过程
Params[2] = new SqlParameter();
Params[2].SqlDbType = System.Data.SqlDbType.NVarChar;
Params[2].ParameterName = "@OutputCode";
Params[2].Direction = System.Data.ParameterDirection.Output;
Params[2].Size = 50;  // should be >=50
Params[2].Value = string.Empty;