【问题标题】:Retrieving output from stored procedure in c#从 C# 中的存储过程中检索输出
【发布时间】:2013-12-01 17:06:11
【问题描述】:

我在我的 c# 服务中调用一个用 sql server 编写的存储过程。但我一次又一次面临异常:

用户代码未处理 InvalidCastException:指定的强制转换无效

代码:

public function(Data dt)
{
    con = new SqlConnection(constring);
    string brand = dt.brand;
    cmd = new SqlCommand("execute pro100 @brand, @check", con);

    SqlParameter param = new SqlParameter("@check", SqlDbType.Int);
    param.Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@brand", brand);
    cmd.Parameters.Add(param);
    con.Open();
    cmd.ExecuteNonQuery();

    int result = (int)cmd.Parameters["@check"].Value; // Exception is here
    con.Close();
    return result;
}

我的存储过程如下 这是存储过程

ALTER PROCEDURE [dbo].[pro100]
@brand varchar(20), 
@check int output
as
update carlog set minex=1000 where brand=@brand;
select @check=id from carlog where brand=@brand;
return @check

有人可以提出可能的解决方案吗?

【问题讨论】:

  • 忽略可悲的语法意义。
  • 当强制转换无效时,请查看您尝试强制转换的值的类型以确保它是预期的。这基本上适用于所有无效的演员表。
  • @NikunjVats 下次请发布您的代码而不是图片,因为随着时间的推移,图片通常会变得不可用
  • 会照顾好@lazyberezovsky
  • @NikunjVats 你能说明参数check 在你的存储过程中是如何定义的吗?

标签: c# sql-server stored-procedures output-parameter


【解决方案1】:

这里是一个忽略异常处理的解决方案:

public function(Data dt)
{
    con = new SqlConnection(constring);

    cmd = new SqlCommand("pro100", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@brand", dt.brand);
    cmd.Parameters.Add("@check", SqlDbType.Int).Direction = ParameterDirection.Output;

    con.Open();
    cmd.ExecuteNonQuery();   
    int result = Convert.ToInt32(cmd.Parameters["@check"].Value);
    con.Close();
    return result;
}

【讨论】:

【解决方案2】:

我总是重复使用保存output参数的变量,像这样:-

public function(Data dt)
{
    con = new SqlConnection(constring);
    string brand = dt.brand;
    cmd = new SqlCommand("execute pro100", con);

    SqlParameter param = new SqlParameter("@check", SqlDbType.Int);
    param.Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@brand", brand);
    cmd.Parameters.Add(param);
    con.Open();
    cmd.ExecuteNonQuery();

    int? result = (int?)param.Value; // Exception was here
    con.Close();
    return result;
}

但您可能还需要处理从您的存储过程返回的null 值——从不返回null——或者在C# 中强制转换为可以保存空值的类型(正如我上面所说的)。我还从命令文本中删除了参数列表 - 因为参数正在代码中添加到参数集合中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2020-08-29
    • 2013-11-24
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多