将日期参数传递给动态sql

时间:2014-02-27 13:10:32

标签: sql

我在构建此查询时非常困难。错误是 - 从字符串转换日期时转换失败。 它是适用于所有表的通用查询。一切都很好,但我必须添加一个日期参数。

SQL:

DECLARE @qryUpd nvarchar(MAX), @params nvarchar(MAX), @TableName nvarchar(50),
        @ColName nvarchar(50),@Id nvarchar(50),@ModifiedBy nvarchar(50),
        @ModifiedDate datetime


set @qry = 'update '+@TableName+' set Deleted=1, ModifiedBy='+''''+@Id+''',
            ModifiedDate='+''''+@ModifiedDate+''''+' where '+@Colname+'='+''''+
            @Id+''''

execute sp_executesql @qry

C#:

public void test(int id, int userid)
{
  sqlCommand cmd = new sqlcommand("TestFunc",con);
  cmd.commandtype = commandtype.storedprocedure;
  cmd.parameters.addwithvalue("@TableName","tblArea");
  cmd.parameters.addwithvalue("@ColName","AreaId");
  cmd.parameters.addwithvalue("@Id",id);
  cmd.parameters.addwithvalue("@ModifiedBy",userid);
  cmd.parameters.addwithvalue("@ModifiedDate",system.datetime.now.tostring());
}

4 个答案:

答案 0 :(得分:5)

除了动态表名和列之外,您至少可以部分地parameterize查询,这将消除转义引号的麻烦,并且还提供一些针对Sql注入的保护(因为表格和列仍然容易受到攻击,需要进行验证):

DECLARE @qry AS NVARCHAR(MAX);
set @qry = N'update '+@TableName + 
            ' set Deleted=1, ModifiedBy=@ModifiedBy, ModifiedDate=@ModifiedDate
            where ' + @Colname + ' = @Id';
exec sp_executesql @qry, 
        N'@Id nvarchar(50), @ModifiedBy nvarchar(50), @ModifiedDate datetime', 
        @Id  = @Id,
        @ModifiedBy = @ModifiedBy,
        @ModifiedDate = @ModifiedDate;

SqlFiddle here

然后,您可以将@Id, @ModifiedBy and @ModifiedDate的.Net参数直接与本机类型

绑定

答案 1 :(得分:2)

您正以错误的方式传递参数。使用此:

DECLARE @ParmDefinition nvarchar(500);

set @ParmDefinition = '@Id int, @ModifiedDate datetime'

set @qry = 'update '+@TableName+' set Deleted=1, ModifiedBy=@Id, ModifiedDate=@ModifiedDate where ' + @Colname + '=@Id'

execute sp_executesql @qry, @ParmDefinition, @ModifiedDate, @Id

通过删除DateTime

,还可以将参数作为string而不是ToString传递

答案 2 :(得分:1)

ModifiedDatedatetime字段,然后您必须将值作为datetime传递而不是字符串

cmd.parameters.addwithvalue("@ModifiedDate",DateTime.Now);

答案 3 :(得分:1)

尝试更改上一个C#行:

cmd.parameters.addwithvalue("@ModifiedDate",system.datetime.now.tostring());

用这个:

cmd.Parameters.AddWithValue("@ModifiedDate",System.Datetime.Now.ToString("yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);