所以我在使用 MySQL 连接器时遇到了一些问题(特别是针对 .NET)。通常,我只是不使用参数化——尽管我意识到这样做会使我的程序容易受到 SQL 注入的影响。
然而不幸的是,我不能这样做。我需要将一个字节数组(这些字节来自于在该程序的客户端读取图像文件)存储到 MySQL 数据库中。显然,将字节数组放入查询字符串是行不通的。那只会将“ System.Byte[]
”放入数组中。
我以前使用过参数化查询——但仅限于java。以下是我的代码,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# 完成。