Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQL连接器/NET';不使用参数的mysqls命令_Java_C#_Mysql_Sql_Datetime_Parameterization - Fatal编程技术网

Java MySQL连接器/NET';不使用参数的mysqls命令

Java MySQL连接器/NET';不使用参数的mysqls命令,java,c#,mysql,sql,datetime,parameterization,Java,C#,Mysql,Sql,Datetime,Parameterization,所以我对MySQL连接器(特别是.NET)有一些问题。通常,我不会使用参数化——尽管我意识到这样做会使我的程序容易受到SQL注入的影响 然而,不幸的是,我不能这么做;我需要将一个字节数组(这些字节来自于在程序客户端读取图像文件)存储到MySQL数据库中。显然,将字节数组放入查询字符串是行不通的;这将把“System.Byte[]”放入数组中 我以前使用过参数化查询,但仅在中使用过。下面是我的代码,包是一个我保证在所有情况下都会返回正确数据的对象(出于测试目的,我甚至添加了一个包含所有硬编码数据的

所以我对MySQL连接器(特别是.NET)有一些问题。通常,我不会使用参数化——尽管我意识到这样做会使我的程序容易受到SQL注入的影响

然而,不幸的是,我不能这么做;我需要将一个字节数组(这些字节来自于在程序客户端读取图像文件)存储到MySQL数据库中。显然,将字节数组放入查询字符串是行不通的;这将把“
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上看到了很多问题,都是使用
而不是
@
。我将编辑代码以使用
@
。再次感谢。