【问题标题】:How can a SqlParameter value be set to the result of a SQL function?如何将 SqlParameter 值设置为 SQL 函数的结果?
【发布时间】:2012-05-02 11:43:16
【问题描述】:

(与this post相关,但不一样。)

有没有办法使用SqlParameter 来指定一个值应该通过在服务器调用一个函数来获得?例如

private void Test()
{
    var cmd = new SqlCommand("update Table set ADateField = @p1 where Id = @id");
    cmd.Parameters.AddWithValue("@id", 42);
    cmd.Parameters.AddWithValue("@p1", "sysutcdatetime()");  // WRONG!!
    cmd.ExecuteNonQuery();
}

我可以将调用嵌入到 CommandText 字符串中,但有时我想设置一个显式值而不是调用该函数,所以它会有点混乱。

我不想在客户端计算机上获取日期,因为由于时区差异,这可能与服务器上的日期不同。

来自docs,我看不出它是如何做到的,但我想我会在放弃之前与你们核实一下。谢谢!

【问题讨论】:

  • 你试过了吗 var cmd = new SqlCommand("update Table set ADateField = sysutcdatetime() where Id = @id");而不是将@p1 作为参数之一发送。
  • @Shailesh:是的,这就是我上面所说的“嵌入 CommandText”的意思。它只是有点混乱,因为它导致显式值和默认值(当前日期)的不同代码路径。

标签: c# ado.net


【解决方案1】:

您不能将函数名作为参数传递并让它执行。

如果你知道函数名,为什么不直接使用:

var cmd = 
 new SqlCommand("update Table set ADateField = sysutcdatetime() where Id = @id");

【讨论】:

    【解决方案2】:

    我不相信这是可以做到的。两种选择是根据您是否要传递确切的日期来重写您的 SQL 语句,或者将 SQL 嵌入到存储过程中,然后可以检查传入的参数以查看它是否为空或其他东西并替换正确的函数调用:

    var cmd = new SqlCommand("update Table set ADateField = @p1 where Id = @id");
    cmd.Parameters.AddWithValue("@id", 42);
    if( useFunction )
    {
      cmd.CommandText = cmd.CommandText.Replace("@p1", "sysutcdatetime()");
    }
    else
    {
      cmd.Parameters.AddWithValue("@p1", exactDate);  
    }
    cmd.ExecuteNonQuery();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-02
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多