【问题标题】:Using Default Parameter in Stored Procedure call在存储过程调用中使用默认参数
【发布时间】:2013-10-03 03:11:22
【问题描述】:

我有以下存储过程

CREATE PROCEDURE [dbo].[usp_GetData]
@foo VARCHAR (20), @bar bit = 1
AS ...

这会在 SSMS 中调用时提供正确的结果。

EXEC dbo.usp_GetData @foo = 'Hellow World', @bar = 0

虽然在 C# 应用程序中调用时如下所示

cmd.Parameters.Add(new SqlParameter("@foo", foo)); 
cmd.Parameters.Add(new SqlParameter("@bar", 0));

& 由分析器捕获,如下所示。

exec dbo.usp_GetData @foo=N'Hello World',@bar=default

是否必须以不同的方式传递覆盖默认值的参数?

【问题讨论】:

  • 一个位是一个布尔值,如果你传递 false 而不是零会发生什么?
  • 他试图为 bit 传递 'false' 而不是默认值。如果您尝试传递 'false' 而不是 '0' 会发生什么?
  • 我想在上面的代码中提供一个参数 & am 但是当 SQL 被传递到数据库时它有 default 而不是 0 这是我为 @bar 参数添加的@gunr2171
  • 让我试试@jcwrequests

标签: c# sql sql-server tsql stored-procedures


【解决方案1】:

使用

cmd.Parameters.AddWithValue("@bar", 0)

这样你就知道你实际上传递了值。

【讨论】:

    【解决方案2】:

    new SqlParameter("@bar", 0) 触发错误的重载 - string parameterName, SqlDbType dbType。该值最终未被设置。

    你想要设置值的那个,所以它应该是new SqlParameter("@bar", (object)0)

    这就是引入AddWithValue 的原因。

    【讨论】:

    • 0 如何映射到SqlDbType
    • @gunr2171 很好。它映射到SqlDbType BigInt,就编译器而言,它比object 更匹配。
    • 我认为我说的不正确。 0,一个int,如何使用带有SqlDbType 的构造函数形式?是否有允许这样做的隐式强制转换?
    • 这很好,但通过false 也是如此。使用 false 是否有任何缺点,因为它看起来更干净。 @GSerg
    • @ojhawkins,你的参数是bit,所以提供正确的数据类型总是一个好主意,而不是希望sql能正确转换整数。
    【解决方案3】:

    更好更安全:

    cmd.Parameters.Add("@bar", SqlDbType.NVarChar, 16, "bar");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2016-11-04
      • 2016-08-31
      • 1970-01-01
      相关资源
      最近更新 更多