回答

收藏

MySQL Connector / NET的MySqlCommand不使用参数

技术问答 技术问答 254 人阅读 | 0 人回复 | 2023-09-12

所以,我在用MySQL连接器(尤其是.NET)我遇到了一些问题。通常,我只是不使用参数化。-虽然我意识到这样做会让我的程序容易受到影响SQL注射攻击。
2 @$ y) t! n+ K1 ]不幸的是,我不能只这样做。我需要存储字节数组(这些字节数组是从读取此程序的客户端上的图像文件衍生出来的)MySQL数据库。显然,将字节数组放入查询字符串是不可行的。
/ y7 l6 Z  h1 s. g0 V& O1 {) S. bSystem.Byte放入数组。
" X  l* j" }0 @$ n3 s6 g# ^我以前用过参数化查询-但仅在java使用过。以下是我的代码,packet我保证在所有情况下都会返回正确数据的对象(出于测试目的,我甚至添加了一个具有所有硬编码数据的驱动程序),并确保Server单例连接开放有效。7 L# M, y+ i8 y/ }0 H5 R
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 integercmd.Parameters.AddWithValue("?serverId",packet.getServerId()string of an integercmd.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 integercmd.executeNonQuery();我遇到的问题是MySql Connector / NET似乎永远不会用其值替换参数。我尝试实例化一个newMySqlParameter设置对象Value,然后调用cmd.Parameters.Add(...),但也有同样的问题。/ L) C4 K8 I" k2 B3 [) |$ H
我看了一下MySQL并说要用文档MySqlCommmand#Parameters.AddWithValue(string,object),没有其他步骤。
  ?: j+ R" u8 }3 e% D8 b/ T每当我将Visual  `/ r2 p( X# ~6 @
Studio当调试器附加到此过程中时,可以看到所有参数都添加到了Parameterslist属性中。然而,在执行查询时,即时调试器将暂停执行并突出显示其上的一行cmd.executeNonQuery()并指出dateTime'is not a valid value for column 'dateTime其中列为dateTimeSQL类型DateTime)。0 E+ ?% g# Y& D9 S
显然,这意味着这些参数不会被其价值所取代。dateTime不是有效值,DateTime因为它的格式必须为yyyy-MM-ddHH:mm:ss,所以连接器会引起异常。但是我在做什么呢?
2 x5 L& L+ t4 M+ E1 O  q3 y  u感谢您的帮助-我惯了用Java数据库相关工作(以及套接字逻辑等。),但这是一个需要使用的学校项目C#完成。5 m) b6 K, E6 y$ k! H
                                                               
( E; s/ z$ H: Q: g$ h    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则