MySQL Connector/NET's MySqlCommand不使用参数
本文关键字:MySqlCommand 参数 Connector NET MySQL | 更新日期: 2023-09-27 18:03:33
所以我对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
列表属性中;但是,当执行查询时,Just-in-Time调试器会停止执行并突出显示包含cmd.executeNonQuery()
的行,表示'?dateTime' is not a valid value for column 'dateTime'
(其中列dateTime
属于SQL类型DateTime
)或类似的内容。
这显然意味着参数没有被它们的值所替换。?dateTime
不是DateTime
字段的有效值,因为它必须采用yyyy-MM-dd HH:mm:ss
的格式,因此连接器会抛出异常。但我做错了什么?
提前感谢任何帮助-我习惯在Java中做数据库相关的事情(以及套接字逻辑等),但这是一个学校的项目,需要在c#中完成。
这些看起来不像有效的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