【问题标题】:Is it possible to Pass Empty Parameter to sql server from code behind?是否可以将空参数从后面的代码传递给 sql server?
【发布时间】:2014-06-06 17:31:16
【问题描述】:

我的 SQL 查询中的参数很少,它只接受 '' 值它不会接受 null,所以我想将 '' 值作为参数传递,这怎么可能,下面是我正在尝试做的代码

param = new SqlParameter("@CodeNumber", SqlDbType.VarChar);
if (!string.IsNullOrEmpty(SearchCriteria.CodeNumber))
  {
     param.Value = SearchCriteria.CodeNumber;
  }
else
  {
    param.Value = DBNull.Value;
    //param.Value = ''; I want to pass something like this
  }
cmd.Parameters.Add(param);


param = new SqlParameter("@LicenseDate", SqlDbType.DateTime);
if (SearchCriteria.LicenseDate != null && SearchCriteria.LicenseDate != default(DateTime))
  {
      param.Value = SearchCriteria.LicenseDate;
  }
else
  {
     param.Value = DBNull.Value;
     //param.Value = ''; I want to pass something like this
   }
cmd.Parameters.Add(param);

我没有收到任何错误,但在查询中它没有被视为''

【问题讨论】:

  • 传递字符串""怎么样?当然,这不适用于 DateTime 参数。
  • DBA 已经编写了我必须只通过 ' ' 的查询
  • 是的,但在 TSQL 中这是一个空字符串。您是否尝试过将 C# 中的空字符串作为参数传递?
  • 空字符串而不是char param.Value = "";
  • DateTime 会出现什么错误

标签: c# sql-server parameter-passing


【解决方案1】:

当底层字段为varchar 时,尝试将空的String 作为参数传递。例如,您可以这样做:

param = new SqlParameter("@CodeNumber", SqlDbType.VarChar);
 if (!string.IsNullOrEmpty(SearchCriteria.CodeNumber))
  {
   param.Value = SearchCriteria.CodeNumber;
  } 
 else
  {
   param.Value = String.Empty;    
  }
cmd.Parameters.Add(param);

对于DateTime,SQL Server 会将向DateTime 列插入空字符串视为插入值1/1/1900 12:00:00 AM,如here 所示。因此,您可以在 C# 中传入 DateTime 的值来代替空字符串,如下所示:

param = new SqlParameter("@LicenseDate", SqlDbType.DateTime);
 if (SearchCriteria.LicenseDate != null && SearchCriteria.LicenseDate != default(DateTime))
  {
   param.Value = SearchCriteria.LicenseDate;
  }
 else
  {
   param.Value = new DateTime(1900,1,1,0,0,0)
   }
cmd.Parameters.Add(param);

【讨论】:

    【解决方案2】:

    您可以使用如下默认值创建存储过程;

    CREATE PROCEDURE [dbo].[SP] 
        @param1 varchar(512),
        @param2 varchar(50) = NULL 
    AS
    

    然后,如果您传递该值,则将采用通过参数传递的值。它可以从应用程序(c# 代码)中跳过,如果跳过,将采用默认的 NULL 值。

    所以在这种情况下,@param2 可以在应用程序不需要时跳过。

    如果不为null,则可以传递'',而不是NULL,如下所示

    CREATE PROCEDURE [dbo].[SP] 
        @param1 varchar(512),
        @param2 varchar(50) = ''
    AS
    BEGIN
    

    【讨论】:

    • 如果不应该是NULL怎么办?
    • 默认值,可以是NULL也可以是空字符串。
    • 请忽略我的评论,因为我是在您添加非空大小写之前写的。
    【解决方案3】:

    我修改了我的查询并检查@LicenseDate 是否为空,然后在 SP 中将值设置为空,并从后面的代码中传递 DBNull.Value,这解决了我的日期参数问题

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多