我在构建此查询时非常困难。错误是 - 从字符串转换日期时转换失败。 它是适用于所有表的通用查询。一切都很好,但我必须添加一个日期参数。
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());
}
答案 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;
然后,您可以将@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)
列ModifiedDate
是datetime
字段,然后您必须将值作为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);