Java MySQL连接器/NET';不使用参数的mysqls命令
所以我对MySQL连接器(特别是.NET)有一些问题。通常,我不会使用参数化——尽管我意识到这样做会使我的程序容易受到SQL注入的影响 然而,不幸的是,我不能这么做;我需要将一个字节数组(这些字节来自于在程序客户端读取图像文件)存储到MySQL数据库中。显然,将字节数组放入查询字符串是行不通的;这将把“Java MySQL连接器/NET';不使用参数的mysqls命令,java,c#,mysql,sql,datetime,parameterization,Java,C#,Mysql,Sql,Datetime,Parameterization,所以我对MySQL连接器(特别是.NET)有一些问题。通常,我不会使用参数化——尽管我意识到这样做会使我的程序容易受到SQL注入的影响 然而,不幸的是,我不能这么做;我需要将一个字节数组(这些字节来自于在程序客户端读取图像文件)存储到MySQL数据库中。显然,将字节数组放入查询字符串是行不通的;这将把“System.Byte[]”放入数组中 我以前使用过参数化查询,但仅在中使用过。下面是我的代码,包是一个我保证在所有情况下都会返回正确数据的对象(出于测试目的,我甚至添加了一个包含所有硬编码数据的
System.Byte[]
”放入数组中
我以前使用过参数化查询,但仅在中使用过。下面是我的代码,包
是一个我保证在所有情况下都会返回正确数据的对象(出于测试目的,我甚至添加了一个包含所有硬编码数据的驱动程序类),并且服务器
singleton的连接保证是开放和有效的
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似乎永远不会用参数值替换参数。我尝试实例化一个新的MySqlParameter对象,设置它的值,然后调用cmd.Parameters.Add(…)
我看了一下MySQL文档,它说要使用MySqlCommmand#Parameters.AddWithValue(string,object)
,我没有遗漏任何其他步骤
每当我将VisualStudio的调试器附加到进程时,都可以看到参数已全部添加到parameters
列表属性中;但是,当查询执行时,即时调试器会停止执行,并突出显示带有cmd.executeNonQuery()
的行,表示“?dateTime”不是列“dateTime”的有效值(其中列dateTime
为SQL类型dateTime
)或类似内容
这显然意味着参数不会被其值替换?dateTime
不是dateTime
字段的有效值,因为它的格式必须为yyyy-MM-dd HH:MM:ss
,因此连接器会引发异常。但我做错了什么
提前感谢您的帮助——我习惯于用Java做与数据库相关的事情(以及socket逻辑等),但这是一个学校项目,需要用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将根据需要执行此操作
来源:根据您对MySQL的引用,它似乎已经过时了——实际上我自己也读过了那个页面;然而,我也遇到了MySQL Connector/NET的某个版本的发行说明,其中指出,@
已更改为?
,以支持用户(例如,user@localhost
将无效,因为它将尝试查找参数)。当然,有一种方法可以通过使用连接字符串选项将参数更改回@
。不过,我会研究引用参数。呃,我觉得自己太愚蠢了,因为我没有尝试删除引用——我以为C对我不会那么好。删除这些参数是可行的,但是参数是通过?
转义的。谢谢@DanJesensky嗯。文档上说“这个选项在Connector/Net 5.2.2中被弃用。现在所有代码都应该使用“@”符号作为参数标记来编写。”-你使用的是什么版本的连接器?我不确定我在哪里读到了它,但我记得在StackOverflow上看到了很多问题,都是使用?
而不是@
。我将编辑代码以使用@
。再次感谢。