【问题标题】:How to Pass Dynamic Parameter如何传递动态参数
【发布时间】:2018-04-23 12:55:19
【问题描述】:

我在 Sql 函数中有两个参数(StartDate 和 EndDate)。我从 C# 代码传递输入参数。当我传递两个参数时,查询结果工作正常。我的问题是,如何只传递“EndDate”不“开始日期”(开始日期为空),所以查询结果应该是所有记录到“结束日期”

Sql 查询:

Select * from FnEmployeeProduction(?,?)

【问题讨论】:

  • 我认为您可能需要通过 null 并且需要在您的UDF 中进行适当的验证。
  • 如果你没有合适的值,你可能需要发送 dbnull
  • 这取决于您如何处理函数中的日期。您可以将参数声明为默认 NULL,或声明默认值(例如 '1900-01-01 00:00:00.000')...或两者的组合?
  • Select * from FnEmployeeProduction(somevalue, null)并处理函数中为null的可能性

标签: c# sql-server


【解决方案1】:

您需要将 NULL 发送到数据库,但出于某种原因,微软在 c# 中发明了DBNull.Value

这是一个在c#中调用你的函数的例子

DateTime? beginDate = null;
DateTime? endDate = DateTime.now;

using (SqlCommand command = new SqlCommand("select * from FnEmployeeProduction (@begin, @end)");
{  
    command.Parameters.Add("@begin", SqlDbType.DateTime).Value = (beginDate == null) ? (object)DBNull.Value : beginDate;
    command.Parameters.Add("@end", SqlDbType.DateTime).Value = (endDate == null) ? (object)DBNull.Value : endDate;

    // now you can use this command object to send to your DB
    using (SqlConnection connection = new SqlConnection(your conn string))
    {  
       connection.Open();
       command.Connection = connection;
       using (SqlDataAdapter adapter = new SqlDataAdapter(command))
       {
           adapter.Fill(your datatable);
       }
    }
}

在你的函数内部,你需要处理空值

create function FnEmpoyeeProduction (@begin datetime, @end datetime) as
begin
     if @begin is not null 
     begin
     end
     and so on...
end

【讨论】:

  • 这是“白痴原因”:DbNull.Valuenull 在概念上存在很大差异。关键字null 表示无效引用。 System.DbNull 类表示数据库字段中不存在的值。
  • @GuidoG '愚蠢的理由'?首先阅读此处的差异,然后您可以更正您的陈述:stackoverflow.com/questions/4958379/…
  • @WoIIe 我知道区别,但仍然没有理由在 c# 中创建 DBNull.Value,编译器可以很容易地从代码中知道区别
  • @L-Four 从您链接中的另一个anwser 很明显,我不是唯一一个认为 DBNull.Value 很烦人的人。但是好的,我在我的回答中删除了白痴这个词,没有必要讨论这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2018-08-15
  • 2013-06-04
相关资源
最近更新 更多