Mysql 使用IN(p1、p2、p3)参数数量可变的动态查询

Mysql 使用IN(p1、p2、p3)参数数量可变的动态查询,mysql,vb.net,Mysql,Vb.net,我有以下资料: Dim strdepToDelete As String Dim strOtherToDelete As String strdepToDelete = String.Join(",", depToDelete) strOtherToDelete = String.Join(",", otherToDelete) strdepToDelete = strdepToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77) strOtherT

我有以下资料:

Dim strdepToDelete As String
Dim strOtherToDelete As String
strdepToDelete = String.Join(",", depToDelete)
strOtherToDelete = String.Join(",", otherToDelete)
strdepToDelete = strdepToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77)
strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77)

cmd.CommandText = "delete from database.tableA where guid in(@strdepToDelete, @strOtherToDelete);"
cmd.Parameters.Add("@strdepToDelete", MySql.Data.MySqlClient.MySqlDbType.String)
cmd.Parameters("@strdepToDelete").Value = strdepToDelete
cmd.Parameters.Add("@strOtherToDelete", MySql.Data.MySqlClient.MySqlDbType.String)
cmd.Parameters("@strOtherToDelete").Value = strOtherToDelete
Dim answer = MsgBox("Data will be deleted if you continue", MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Are You Sure")
If answer = vbYes Then
    Try
        cmd.ExecuteNonQuery()
        success = True
    Catch ex As Exception

    End Try
    Return success
End If
我在上空盘旋

cmd.Parameters("@strdepToDelete").Value = strdepToDelete 

并且有一个MySql正在寻找的格式的字符串值。为什么不从表中删除记录?

来自注释:

depToDelete和otherToDelete是从函数调用传递的(字符串)列表。这些包含我希望删除的1个或多个guid

因此,您的代码没有为SQL正确设置格式。对于包含2个Guid字符串的列表,在联接后,您将获得以下结果:

"af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"
然后,
strOtherToDelete=strOtherToDelete.Replace(Chr(34),Chr(39))。子字符串(1,77)
显然想要删除引号并用勾号替换。问题是字符串本身不包含引号。您可以在IDE中看到它,因为这是VS告诉您它是字符串的方式

子字符串
步骤将从结果中删除有效的Guid字符(并且当不存在正确数量的Guid字符时,
77的幻数允许其崩溃):

之前:
“9b842f14-7932-4e3d-8483-07790CC674C,…

&之后:
“b842f14-7932-4e3d-8483-07790CC674C,…

这不起作用,因为内容不是一个很长的Guid。
列表中的每个元素都需要勾选。要勾选列表中的每个元素,需要循环并构建一个字符串,或者使用linq

但这也行不通。MySQL就是不喜欢从网络提供者那里得到的字符串,它不做参数数组,所以

因此,让我们构建一个参数引擎: 使用两组guid是没有意义的,所以对它们进行处理(这是一个实际的
列表(字符串)
,包含guid,而不是其他东西,不是json):

Dim depVals=depToDelete.Concat(otherToDelete.ToList)
'您的sql在这里
Dim sql=“从GuidString所在的演示中删除(@magic)”
'参数存储
Dim gValue作为新列表(字符串)
'创建“@g”参数占位符列表
尺寸ndx为Int32=0
对于ndx=0到devals.Count-1
'将“@gN”值添加到列表中
添加(String.Format(“@g{0}”,(ndx+1.ToString))
下一个
'将它们插入SQL字符串中
sql=sql.Replace(“@magic”,String.Join(“,”,gvalues))
“@magic”替换为“@g1、@g2、@g3…”
使用cmd作为新的MySqlCommand(sql、dbcon)
dbcon.Open()
'创建相等数量的参数,设置每个参数的值
对于n,作为Int32=0到gValue。计数-1
'添加参数'@gN',从'depVals'赋值`
cmd.Parameters.Add(gvalues(n),MySqlDbType.String)。Value=depVals(n)
下一个
'调试:
Dim fullSQL=GetFullCommandSQL(cmd)
Console.WriteLine(fullSQL)
Dim rows=cmd.ExecuteNonQuery()
终端使用
调试输出语法正确:

从演示中删除指南字符串('2abfa4c4-36e2-47ea-8218-6f568a31fa88','fd02865e-5da2-4d4e-ba4b-84bf5b5f1444','7376d9a3-35c9-4b44-8b85-4cd663b31d5e')

…而带有这些GUID的3行将被删除

此外:

  • 空的Catch块是不好的,因为它们对唯一能修复它的人(您)隐藏问题
  • 你应该让我们选择严格的选项,以避免VB猜测某些事情的含义

cmd在此之前设置了连接?请不要使用空的捕捉块。如果出现问题(例如没有连接),当我将鼠标悬停在cmd.ExecuteNonQuery()上时,您将永远不会知道命令文本是delete from database.tableA,其中guid位于(@strdepToDelete,@strOtherToDelete);不是变量的值在此之前设置了连接。您能告诉我们什么是
deptodele
,另一个是有效的吗?有些起始代码看起来是无关的。此外,还应该启用Option Strict(这里可能不是问题所在,但这将有助于生成更好的代码)。连接只是一回事——任何异常都会被吞没,所以你甚至不知道问题出在哪里。另外,
Dim rows=cmd.ExecuteNonQuery()
将告诉您MySql认为有多少行受到影响。非常感谢。谁知道呢。我将字符串分成子字符串,每个子字符串36个,并将它们放在查询工作中的各个参数中,就像做梦一样。祝你有美好的一天
"af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"