因此,我在使用MySQL连接器(特别是.NET)时遇到了一些问题。通常,我只是不使用参数化-尽管我意识到这样做会使我的程序容易受到SQL注入的攻击。
不幸的是,我不能仅仅这样做。我需要将字节数组(这些字节数组是从读取此程序的客户端上的图像文件派生的)存储到MySQL数据库中。显然,将字节数组放入查询字符串中是行不通的。只需将“ System.Byte[]”放入数组中。
System.Byte[]
我以前使用过参数化查询-但仅在java中使用过。以下是我的代码,packet我保证在所有情况下都会返回正确数据的对象(出于测试目的,我什至添加了一个具有所有硬编码数据的驱动程序类),并且确保Server单例的连接是开放有效。
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 Connector / NET似乎永远不会用其值替换参数。我尝试实例化一个new MySqlParameter对象,设置其Value,然后调用cmd.Parameters.Add(...),但这存在相同的问题。
new MySqlParameter
Value
cmd.Parameters.Add(...)
我看了一下MySQL文档,并说要使用MySqlCommmand#Parameters.AddWithValue(string, object),并且没有其他步骤。
MySqlCommmand#Parameters.AddWithValue(string, object)
每当我将Visual Studio的调试器附加到该进程时,就可以看到所有参数都已添加到Parameterslist属性中。但是,在执行查询时,即时调试器会暂停执行并突出显示其上的一行cmd.executeNonQuery(),并指出'?dateTime' is not a valid value for column 'dateTime'(其中列为dateTimeSQL类型DateTime)。
Parameters
cmd.executeNonQuery()
'?dateTime' is not a valid value for column 'dateTime'
dateTime
DateTime
显然,这意味着这些参数不会被其值替换。?dateTime不是一个有效值,DateTime因为它的格式必须为yyyy-MM-dd HH:mm:ss,因此连接器会引发异常。但是我在做什么错呢?
?dateTime
yyyy-MM-dd HH:mm:ss
在此先感谢您的帮助-我已经习惯了用Java进行数据库相关的工作(以及套接字逻辑等),但这是一个学校项目,需要用C#完成。
那些看起来不像是有效的MySQL参数。如果要命名参数,请使用@yournamehere,如下所示:
@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