我试图从运行C#到MySQL(版本5.5.27)使用从MySQL网站.NET中的MySQL连接的查询。
我开发的.dll文件的最终目标是要跟踪我读过行。
我用它来读取数据库的查询是:
string strSQL = "SELECT date,ask,bid,volume FROM gbpjpy where `read` = 0";
要在日期读,我有:
DateTime dateTime = mysqlReader.GetDateTime(0);
这工作正常。
该表有5列,最后一列被称为“读”。 选择查询和分析完成后,我执行以下查询:
string sqlFormattedDate = dateTime.ToString("yyyy/MM/dd HH:mm:ss");
string query = "UPDATE gbpjpy SET `read` = 1 WHERE `date` = " + sqlFormattedDate;
然而,当我检查我的日志,我有以下错误:
您的SQL语法错误; 检查对应于你的MySQL服务器版本近01年的使用权语法手册:在1号线08' :20。
读出第一日期是2012年8月30日1时20分08秒(这就是它是如何出现在MySQL表,因此,这就是它得到1点20分08秒)。
我试过VAR sqlFormattedDate,改变了ToString重载以YYYY-MM-DD(使用破折号,而不是正斜杠)和则DateTime.ToString()都无济于事。
为什么MySQL的不拾取整个字符串?
基本上你应该避免直接包括你的查询值。
毫无疑问,你可以把引号围绕价值......但你不应该。 相反,你应该使用paramterized SQL,并把该值的参数。 你不容易出错的字符串转换这样一来,就避免了SQL注入攻击(字符串参数),并从数据分开的代码。
(至于如何巧妙地破这可以是一个例子,当前的代码将使用“当前文化”的日期和时间分隔符-这可能不是/
和:
你可以通过指定修复此CultureInfo.InvariantCulture
...但最好不要做转换的。)
寻找一个文件的Parameters
上的任何财产Command
你使用类型(例如MySqlCommand.Parameters
),这将有望给您的例子。 甚至有可能是参数化的SQL的文档中的教程部分。 例如, 该页面 可能是你追求的。
我想你必须把整个价值引号中的日期。 如果你真的串联查询,它会是什么样子
UPDATE gbpjpy SET `read` = 1 WHERE `date` = yyyy/MM/dd HH:mm:ss
这等号将只需要值,直到第一个空间。
相反,它应该看起来像
UPDATE gbpjpy SET `read` = 1 WHERE `date` = 'yyyy/MM/dd HH:mm:ss'
这是在这种情况下,特别的原因,但是,串联这样的查询导致的现实可能性的SQL注入 。 作为一个经验法则,你不应该这样做。 您可以使用参数化查询,可能有你使用做到这一点的.NET连接器的API。
投入参数信息允许代码格式化,因为它需要。 可能的是,你原来的问题可能已经从使用斜杠,而不是破折号在你的日期格式朵朵。 我会认为斜线可以工作,但最重要的是我见过的文档中有破折号分离与MySqlDateTimes日期。