【问题标题】:using c# datetime in mysql update query在mysql更新查询中使用c#datetime
【发布时间】:2012-08-30 10:47:02
【问题描述】:

我正在尝试使用来自 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 没有提取整个字符串?

【问题讨论】:

  • 尝试在将日期附加到查询时添加引号。

标签: c# mysql dll


【解决方案1】:

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

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

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

在您使用的任何Command 类型(例如MySqlCommand.Parameters)上查找Parameters 属性的文档,这有望为您提供示例。在参数化 SQL 的文档中甚至可能有一个教程部分。例如,this page可能就是你想要的。

【讨论】:

  • 感谢您的想法。去搜索参数,发现这个页面的小宝石link。将我的代码修改为: string query = "UPDATE gbpjpy SET read = 1 WHERE date = @Date";并添加了 mysqlUpdateCmd.Parameters.Add("@Date", MySqlDbType.DateTime).Value = dateTime;而且,嘿presto。再次感谢您的想法!
【解决方案2】:

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

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 injection 的真正可能性。根据经验,您不应该这样做。您可以使用参数化查询,并且可能有一个用于执行此操作的 .NET 连接器的 API。

【讨论】:

  • 很有趣,我在上面的评论中提到的链接提出了一个类似的修复,尽管它确实解释了主要的缺点是你并没有真正构建 SQL 命令,你正在创建一个字符串,并且您添加的所有变量(如本例中的日期)都必须转换为字符串,这有其自身的一系列问题。关于 SQL 注入,我在我的局域网上运行这个数据库,它不在网站上,也不暴露给外界。我可以假设这是我不必太担心的事情吗?
  • 您对用户的信任程度如何?如果在某个时候用户的数量比您最初想象的要多并且他们想要造成伤害怎么办?这些最佳实践很有效,因为软件需求和使用往往会发生变化……很多。在你的位置,我会避免连接字符串。
  • 嗯,这实际上只是一个“单人秀”项目。这是一个个人项目。我是唯一的用户。最终,我会将数据库扩展到多台计算机,但即便如此,它也只是我自己。我实际上最终实现了Parameters.Add。不过,感谢您的评论。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多