繁体   English   中英

如何转义单引号或双引号的更新查询?

[英]how to escape single or double quotes for update query?

我有一个查询以错误更新状态字段

$error = "g is not a valid value for this element. An error occurred while parsing the 'SynchronizeSecurity' element at line 14, column 46 ('http://schemas.microsoft.com/analysisservices/2003/engine' namespace) under Envelope/Body/Execute/Command/Synchronize/SynchronizeSecurity."

Function Query($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet)
$SqlConnection.Close() 
$DataSet.Tables[0] }

#Updating status field
Query "UPDATE [$Table]
SET [status] = '$error'
WHERE [db_name] = '$DB' AND [server] = '$server[-1])'"

更新不起作用。 我调试并发现它与单引号有关。 如果我将错误内容直接粘贴到表中,则粘贴得很好。

我确保它不是代码问题,因此我将错误文本设置为“ Hi”和“ testing”,并且两次都使用这些文本更新表就很好了。

因此,现在我可以肯定的是,由于SET要求将字段文本用单引号引起来,并且我的错误包含单引号'SynchronizeSecurity' ,因此它在某种程度上会发生冲突,因此不会使用错误消息更新表。

我该如何规避? 也许,反引号在此查询中如何工作?

您编写的内容存在一些问题:

  • 您已经编写了用于从数据库中检索结果数据的代码,但是随后您调用了该代码并传递了一个更新查询-将两者分开; 更新查询应使用ExecuteNonQuery运行,并且不需要数据适配器

  • 您尚未正确设置查询参数,只是使用字符串串联/插值来构建查询字符串,这充满了安全风险和意外后果,例如您在此处看到的引号问题

评论中有关交换单引号和双引号等的所有建议都被误导了,仅是在大伤口上的创可贴。 使用参数,您可以插入任何喜欢的值变量内容。 https://bobby-tables.com上有一些背景信息,说明了为什么它很重要以及C#的示例-非常接近PS。 https://powershellstation.com/2009/09/15/executing-sql-the-right-way-in-powershell/有一些相关建议。 我不使用powershell,所以我不会尝试将其包装在带有参数字典/的函数中(我可能会犯很多语法错误-在没有IDE的情况下将其写在手机上)循环中填充的数组参数,因此我将其留给读者练习。 请查看2009年博客文章中的基本方法;),并在此记住此建议,您不需要sqladapter来运行更新查询等。因此,您可能需要放置两个函数(QuerySelect和QueryNonSelect),并在其中添加一些逻辑。 “如果sql字符串以SELECT开头的行,则调用QuerySelect,否则调用QueryNonSelect”,因此QueryNonSelect可以完成所有的更新/删除/合并/创建等

您的代码必须更像:

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = "update a set b=@c where d=@e"
$SqlCmd.Parameters.AddWithValue("@b", $error)
$SqlCmd.Parameters.AddWithValue("@e", $dbnameorwhatever)
$SqlCmd.ExecuteNonQuery()

最终提示:

  • 在您的sql字符串中使用@parameters。
  • 不能对列和表名进行@参数化(不能说“ update @tablename set @columnname = @ value1”-这里唯一有效的参数是@ value1。
  • 填充sqlcmd的Parameters集合。
  • 使用适当的方法运行查询-考虑将dataadapter用于返回行的任何内容。 使用ExecuteNonQuery进行任何更改

    有理由避免使用AddWithValue( https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ ),但这是首次使用时的一种有用的便捷方法也是我在手机上写代码给您的。.考虑该博客并根据需要更新您的编码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM