2

我正在尝试使用来自 MySQL 网站的 .net 的 mysql 连接器从 C# 到 MySQL(版本 5.5.27)运行查询。

我正在开发的 .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 服务器版本相对应的手册,以在第 1 行的“01:20:08”附近使用正确的语法。

读入的第一个日期是 2012/08/30 01:20:08(这就是它在 MySQL 表中的显示方式,因此它是从 01:20:08 获得的)。

我试过 var sqlFormattedDate,将 ToString 重载更改为 yyyy-MM-dd(使用破折号而不是正斜杠)和 dateTime.ToString() 都无济于事。

为什么 MySQL 没有拾取整个字符串?

4

3 回答 3

5

基本上,您应该避免直接在查询中包含值。

毫无疑问,您可以在值周围加上引号……但您不应该这样做。相反,您应该使用参数化 SQL,并将值放入参数中。这样一来,您就不会进行容易出错的字符串转换,避免 SQL 注入攻击(针对字符串参数),并将代码与数据分开。

(作为一个如何巧妙地破坏它的示例,您当前的代码将使用“当前文化”的日期和时间分隔符 - 这可能不是/and :。您可以通过指定CultureInfo.InvariantCulture... 来解决这个问题,但最好不要进行转换。)

查找有关您正在使用Parameters的任何类型(例如)的属性的文档,这有望为您提供示例。在参数化 SQL 的文档中甚至可能有一个教程部分。例如,此页面可能是您所追求的。CommandMySqlCommand.Parameters

于 2012-08-30T10:49:44.903 回答
0

我想您必须将日期的整个值放在引号中。如果你真的连接你的查询,它看起来像

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。

于 2012-08-30T10:50:38.260 回答
0

将信息放入参数中允许代码根据需要进行格式化。很可能,您的原始问题可能源于在您的日期格式中使用斜杠而不是破折号。我会假设斜杠可以工作,但我见过的大多数文档都有用 MySqlDateTimes 分隔日期的破折号。

于 2017-07-10T15:44:44.030 回答