【问题标题】:Create SqlParameter with name and type only (no value assigned)仅使用名称和类型创建 SqlParameter(未分配值)
【发布时间】:2020-06-22 21:11:52
【问题描述】:

我在使用 SqlClient 调用一些声明但未分配参数的 sql 查询时遇到问题。我要运行的查询类似于下面

DECLARE @ID int;
SELECT @ID = OrderId
FROM Orders
ORDER BY OrderId DESC;
SELECT @ID;

但是,当我按如下方式创建 SqlParameter 时

SqlParameter parameter = new SqlParameter("ID", SqlDbType.Int);
sqlcommand.Parameters.Add(parameter);

显示“参数化查询 '(@ID int)SELECT @ID = OrderId 从订单 ORDER BY OrderId DES' 需要参数 '@ID',但未提供该参数。”

关于在这种情况下如何创建没有任何值的 SqlParameter 的任何建议?

【问题讨论】:

  • 如果您尝试使用 null,则需要添加值为 DBNull.Value 的参数。如果存储过程需要 @ID 字段的值,那么您需要提供一个值。

标签: c# sqlcommand sqlclient sqlparameter


【解决方案1】:

在您的情况下,您必须指定 @ID 是一个输出参数。

SqlParameter parameter = new SqlParameter("ID", SqlDbType.Int)
{
    Direction = ParameterDirection.Output
}

当查询将被执行时,您可以通过

检索该值
parameter.Value

它将返回一个对象类型的实例。

【讨论】:

  • 我认为参数方向只对存储过程输出参数很重要。不知道返回什么参数需要指定为Output。谢谢!
【解决方案2】:

首先,您的查询似乎不会返回单个 int,而是返回许多结果行,每个行都包含一个 OrderId。您正在从表中的每一行中选择 OrderId 并尝试将其分配给单个 int 变量 - 这不起作用。如果您只想要最大的 OrderId,您可以尝试SELECT TOP 1 @ID = OrderId,如下所示。

要回答这个问题,其他答案都是正确的,你需要指定参数方向作为输出。 Output parameters 与输入参数不同。

SELECT TOP (1)
    @id = OrderId
FROM 
    Orders
ORDER BY 
    OrderId DESC;

【讨论】:

  • 您不需要存储过程来使用输出变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2018-07-20
  • 1970-01-01
  • 2018-06-11
  • 2018-12-06
  • 2019-03-30
相关资源
最近更新 更多