2

所以我在使用 MySQL 连接器时遇到了一些问题(特别是针对 .NET)。通常,我只是不使用参数化——尽管我意识到这样做会使我的程序容易受到 SQL 注入的影响。

然而不幸的是,我不能这样做。我需要将一个字节数组(这些字节来自于在该程序的客户端读取图像文件)存储到 MySQL 数据库中。显然,将字节数组放入查询字符串是行不通的。那只会将“ System.Byte[]”放入数组中。

我以前使用过参数化查询——但仅限于。以下是我的代码,packet我保证在所有情况下都会返回正确数据的对象在哪里(出于测试目的,我什至添加了一个包含所有硬编码数据的驱动程序类),并且Server保证单例的连接是公开有效。

MySqlCommand cmd = new MySqlCommand("insert into `screenshots` (`playerId`, `serverId`, `data`, `uploadDate`, `uploadingUserId`) values(?playerId, ?serverId, \"?attachmentData\", \"?dateTime\", ?userId,)", Server.getSingleton().getDbManager().getConnection());
cmd.Parameters.AddWithValue("?playerId", packet.getPlayerId()); //string of an integer
cmd.Parameters.AddWithValue("?serverId", packet.getServerId()); //string of an integer
cmd.Parameters.AddWithValue("?attachmentData", packet.getAttachmentData()); //byte[]
cmd.Parameters.AddWithValue("?dateTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
cmd.Parameters.AddWithValue("?userId", packet.getUserId()); //string of an integer
cmd.executeNonQuery();

我遇到的问题是 MySql 连接器/NET 似乎永远不会用它们的值替换参数。我试过实例化一个new MySqlParameter对象,设置它Value,然后调用cmd.Parameters.Add(...),但这提出了同样的问题。

我查看了 MySQL 文档,它说要使用MySqlCommmand#Parameters.AddWithValue(string, object),并且没有其他我遗漏的步骤。

每当我将 Visual Studio 的调试器附加到进程时,可以看到参数已全部添加到Parameters列表属性中;但是,当查询执行时,即时调试器会停止执行并突出显示上面的行cmd.executeNonQuery(),说'?dateTime' is not a valid value for column 'dateTime'(其中列dateTime是 SQL 类型DateTime)或某种程度的东西。

这显然意味着参数没有被它们的值替换。?dateTime不是字段的有效值,DateTime因为它的格式必须为yyyy-MM-dd HH:mm:ss,因此连接器会引发异常。但是我做错了什么?

在此先感谢您的帮助——我习惯于用 Java 做与数据库相关的事情(以及套接字逻辑等),但这是一个学校项目,需要用 C# 完成。

4

1 回答 1

3

这些看起来不像是有效的 MySQL 参数;如果您想要命名参数,请使用@yournamehere,如下所示:

MySqlCommand cmd = new MySqlCommand("insert into `screenshots` (`playerId`, `serverId`, `data`, `uploadDate`, `uploadingUserId`) values(@playerId, @serverId, @attachmentData, @dateTime, @userId)", Server.getSingleton().getDbManager().getConnection());
cmd.Parameters.AddWithValue("@playerId", packet.getPlayerId());

您也不应该引用参数;ADO.NET 将根据目标列的数据类型在必要时执行此操作。

来源:http ://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-parameters.html

于 2014-05-16T04:13:32.040 回答