C# 如何执行在WHERE子句中包含varchar和datetime字段的delete查询

C# 如何执行在WHERE子句中包含varchar和datetime字段的delete查询,c#,sql-server,C#,Sql Server,您好,我尝试从需要访问varchar note字段和datetimefield的表中删除 代码如下: DateTime test = (DateTime)powerPlant.timestamp; string DateUS = test.ToString("s"); string deletePowerPlant = String.Format( "DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp] = CONVERT(

您好,我尝试从需要访问varchar note字段和datetimefield的表中删除

代码如下:

DateTime test = (DateTime)powerPlant.timestamp;
string DateUS = test.ToString("s");

string deletePowerPlant = 
  String.Format(
    "DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp] = CONVERT(datetime,"+ DateUS +",111) AND [note] = {0};",
    note);

SqlCommand sqlDelete = new SqlCommand(deleteComponents, sqlConnection);
sqlDeletePowerPlant.CommandType = CommandType.Text;
sqlDeletePowerPlant.CommandText = deleteComponents;
sqlDeletePowerPlant.ExecuteNonQuery();
是的,通常我会使用sql参数,但我想知道如果没有参数,它将如何工作,只是为了测试它,因为它一定是可能的。我试着用谷歌搜索它和其他一些论坛和博客,但没有成功

谢谢你的帮助,对不起我的英语

编辑

字段时间戳是表中的日期时间。
注释是表中的nvarchar。我只想使用它一次,这样我就可以说我知道如何在没有参数的情况下使用它。我知道它不好……

在那里放一些字符串限定符

DateTime测试=(DateTime)powerPlant.timestamp; 字符串DateUS=test.ToString(“s”)


但是真的。使用参数化查询

您需要确保不依赖于服务器操作系统区域设置。因此,如果在SQL查询中使用某种格式(本例中为111),则应使用.NET等效格式将日期转换为字符串:

string DateUS = test.ToString("yyyy/MM/dd");
有关
CONVERT
函数支持的格式的详细信息,请参见此处:

正如您在问题中所述,使用(强类型)SqlParameter是首选方法。否则可能会导致sql注入漏洞

鉴于
注释
是一个文本列,需要单引号和转义:

String.Format(
    "DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp]=CONVERT(datetime,'{0}',111) AND [note]='{1}'",
    DateUS
    note.Replace("'","''").Replace(@"\",@"\\")
);

如果您也存储了一天中的时间,那么与
=
的比较将不会影响非零时间成分的记录。

您需要在
{0}
周围放置
,但除此之外,您的格式说明符111是日语
jjj/mm/tt
,根据。您的意思是101吗?另一个可能的错误来源可能是您比较了datetime对象。这将导致日期和时间的比较,因此您可以使用sql实例的date()函数只比较日期,而不是时间。您确定“timestamp”的类型是
DateTime
,而不是实际用于行版本控制的类型
timestamp
?看<代码>通常我会使用sql参数,但我想知道如果没有参数它将如何工作-为什么??那有什么目的?如果要测试查询,请在Sql Server Management Studio中运行查询,但应始终使用参数编码。您设置了一个字符串变量
deletePowerPlant
,但随后为命令文本分配了一个不同的变量
deleteComponents
。。。。您需要的样式是126,它是ISO格式yyyy-MM-ddThh:MM:ss,您缺少单引号。最后,这是浪费每个人的时间,你知道正确的做法。你可以用数百种不同的方式来进行无效、错误和危险的操作,为什么你只想掌握这种不好的做法呢?有趣的是,我刚刚在sql server上试用了它,它就可以工作了。真的很奇怪…有了GarethD和你的tipp,它可以为你提供thx帮助
String.Format(
    "DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp]=CONVERT(datetime,'{0}',111) AND [note]='{1}'",
    DateUS
    note.Replace("'","''").Replace(@"\",@"\\")
);