我试图使用MySQL网站上的MySQL connector for.net来运行从C#到MySQL(版本5.5.27)的查询。
我正在开发的.dll的最终目标是跟踪我所读的行。
我用来读取数据库的查询是:
string strSQL = "SELECT date,ask,bid,volume FROM gbpjpy where `read` = 0";
在日期里,我有:
DateTime dateTime = mysqlReader.GetDateTime(0);
那很好。
该表有5列,最后一列称为“read”。在完成select查询和解析之后,我立即执行以下查询:
string sqlFormattedDate = dateTime.ToString("yyyy/MM/dd HH:mm:ss");
string query = "UPDATE gbpjpy SET `read` = 1 WHERE `date` = " + sqlFormattedDate;
但是,当我检查日志时,出现以下错误:
您的SQL语法有错误;请查看对应于MySQL服务器版本的手册,在第1行的“01:20:08”附近找到正确的语法。
读入的第一个日期是2012/08/30 01:20:08(这就是它在MySQL表中的显示方式,所以这就是它获取01:20:08的地方)。
我尝试过var sqlFormattedDate,将ToString重载改为yyyy-MM-dd(使用破折号而不是正斜杠)和dateTime.ToString()都没有用。
为什么MySQL不接收整个字符串?
最佳答案
基本上,应该避免在查询中直接包含值。
毫无疑问,你可以在价值上加引号。。。但你不应该这样做。相反,你应该使用参数化的SQL,并将值放入参数中。这样就不会出现易出错的字符串转换,避免了SQL注入攻击(针对字符串参数),并将代码与数据分离。
(例如,当前代码将使用“current culture”的日期和时间分隔符,这可能不是/
和:
,以说明这一点有多微妙。你可以通过指定CultureInfo.InvariantCulture
来解决这个问题。。。但最好不要进行转换。)
查找您正在使用的任何类型(例如Parameters
)上的Command
属性的文档,希望这些文档将为您提供示例。文档中甚至可能有参数化SQL的教程部分。例如,this page可能是你想要的。