Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用返回值调用存储过程_C#_Sql Server_Stored Procedures_Ado.net_Return Value - Fatal编程技术网

C# 使用返回值调用存储过程

C# 使用返回值调用存储过程,c#,sql-server,stored-procedures,ado.net,return-value,C#,Sql Server,Stored Procedures,Ado.net,Return Value,我正试图从我的C#windows应用程序调用存储过程。存储过程正在SQL Server 2008的本地实例上运行。我可以调用存储过程,但无法从存储过程检索回值。这个存储过程应该返回序列中的下一个数字。我在网上做过研究,我看到的所有网站都指出这个解决方案是可行的 存储过程代码: ALTER procedure [dbo].[usp_GetNewSeqVal] @SeqName nvarchar(255) as begin declare @NewSeqVal int

我正试图从我的C#windows应用程序调用存储过程。存储过程正在SQL Server 2008的本地实例上运行。我可以调用存储过程,但无法从存储过程检索回值。这个存储过程应该返回序列中的下一个数字。我在网上做过研究,我看到的所有网站都指出这个解决方案是可行的

存储过程代码:

ALTER procedure [dbo].[usp_GetNewSeqVal]
      @SeqName nvarchar(255)
as
begin
      declare @NewSeqVal int
      set NOCOUNT ON
      update AllSequences
      set @NewSeqVal = CurrVal = CurrVal+Incr
      where SeqName = @SeqName

      if @@rowcount = 0 begin
print 'Sequence does not exist'
            return
      end

      return @NewSeqVal
end
调用存储过程的代码:

SqlConnection conn = new SqlConnection(getConnectionString());
conn.Open();

SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter param = new SqlParameter();

param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar);
param.Direction = ParameterDirection.Input;
param.Value = "SeqName";

SqlDataReader reader = cmd.ExecuteReader();
我还尝试使用
数据集
检索返回值,结果相同。我错过了什么
存储过程的返回值?如果需要更多信息,请告诉我。

您需要在命令中添加返回参数:

using (SqlConnection conn = new SqlConnection(getConnectionString()))
using (SqlCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = parameterStatement.getQuery();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("SeqName", "SeqNameValue");

    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    conn.Open();
    cmd.ExecuteNonQuery();
    var result = returnParameter.Value;
}

您可以尝试使用输出参数

ExecuteScalar()可以工作,但输出参数将是一个更好的解决方案。

或者如果您使用的是EnterpriseLibrary而不是标准的ADO.NET

Database db = DatabaseFactory.CreateDatabase();
using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal"))
{
    db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue");
    db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null);

    db.ExecuteNonQuery(cmd);

    var result = (int)cmd.Parameters["RetVal"].Value;
}

我知道这很古老,但我在谷歌上偶然发现了它

如果存储过程中有返回值,请说“return 1”-不使用输出参数

您可以执行以下操作-“@RETURN\u VALUE”将以静默方式添加到每个命令对象。无需显式添加

    cmd.ExecuteNonQuery();
    rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;

我看到另一个关了。基本上我的代码是这样的。我认为您缺少字符串cmd注释。例如,如果我的存储过程是call:DBO.Test。我需要编写cmd=“DBO.test”。然后执行与存储过程相同的命令类型,等等等等

Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;

我机器上的EnterpriseLibrary版本有其他参数。 这是有效的:

        SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int);
        retval.Direction = System.Data.ParameterDirection.ReturnValue;
        cmd.Parameters.Add(retval);
        db.ExecuteNonQuery(cmd);
        object o = cmd.Parameters["@ReturnValue"].Value;

我在SP调用返回错误时遇到了类似的问题,即未包含预期参数。我的代码如下。
存储过程:

@结果整型输出

和C#:

在故障排除中,我意识到存储过程实际上是在寻找“InputOutput”的方向,因此下面的更改修复了问题

            r
结果.Direction=参数Direction.InputOutput


这是一个从过程返回单个值的非常简短的示例:

SqlConnection conn = new SqlConnection(getConnectionString());
conn.Open();

SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter param = new SqlParameter();

param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar);
param.Direction = ParameterDirection.Input;
param.Value = "SeqName";

SqlDataReader reader = cmd.ExecuteReader();
SQL:

C#-代码:


您是否也必须将
@ReturnVal
添加到存储过程中?不,您不必添加到sp(return语句触发填充带有ReturnValue标记的参数)不管您将return val参数命名为什么,顺便说一句。非常感谢,我一直在寻找正确获取返回值的方法,这对我来说非常有用。令人惊叹的!存储过程返回值应仅用于指示成功(零)或失败/警告(非零),而不是返回数据。为此,请使用
输出
参数或结果集。您好。你有引用吗?我不相信cmd实例在SqlParameterCollection中会有一个名为RETURN_VALUE的参数,除非它是显式添加的。因此,如果您正在考虑采用Gary提出的上述方法,那么请确保您已经添加了cmd.Parameters.Add(新的SqlParameter(“@RETURN_VALUE”,SqlDbType.Int));cmd.Parameters[“@RETURN_VALUE”].Direction=ParameterDirection.ReturnValue;但是,我相信您不必将@RETURN_值添加到存储过程定义中。也许这就是Gary的意思。ExecuteScalar()不起作用,除非您“选择”返回值。“输出参数”与存储过程返回值不同,顺便说一句。
CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN 
SELECT @InpVal * 2; RETURN 0; 
END
int inpVal = 11;
string retVal = "?";
using (var sqlCon = new SqlConnection(
    "Data Source = . ; Initial Catalog = SampleDb; Integrated Security = True;"))
{
    sqlCon.Open();
    retVal = new SqlCommand("Exec dbo.MakeDouble " + inpVal + ";", 
        sqlCon).ExecuteScalar().ToString();
    sqlCon.Close();
}
Debug.Print(inpVal + " * 2 = " + retVal); 
//> 11 * 2 = 22