admin

MySQL Connector / NET的MySqlCommand不使用参数

sql

因此,我在使用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 Connector / NET似乎永远不会用其值替换参数。我尝试实例化一个new MySqlParameter对象,设置其Value,然后调用cmd.Parameters.Add(...),但这存在相同的问题。

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

每当我将Visual
Studio的调试器附加到该进程时,就可以看到所有参数都已添加到Parameterslist属性中。但是,在执行查询时,即时调试器会暂停执行并突出显示其上的一行cmd.executeNonQuery(),并指出'?dateTime' is not a valid value for column 'dateTime'(其中列为dateTimeSQL类型DateTime)。

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

在此先感谢您的帮助-我已经习惯了用Java进行数据库相关的工作(以及套接字逻辑等),但这是一个学校项目,需要用C#完成。


阅读 187

收藏
2021-07-01

共1个答案

admin

那些看起来不像是有效的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

2021-07-01