【问题标题】:SQL UPDATE Query is failing silently, I suspect an enemy doublequoteSQL UPDATE Query 静默失败,我怀疑是敌人的双引号
【发布时间】:2012-08-24 18:22:36
【问题描述】:

我有一个带有 C# 的 ASP.NET 应用程序。应用程序从 WebServices 获取数据,然后它应该执行以下更新。

sqlQueryString2 = "
UPDATE CI
SET
 platform =@platform ,
 wstart = @wstart,
 wend = @wend,
 model = @model,
 productDescription = @productDescription,
 scanflag = @scanflag     
WHERE  serial = @serial ";

我意识到当从 Web 服务返回某些值时,我的应用程序似乎在循环。 UPDATE 被发送,不提交,然后在需要更新的下一个循环中再次拾取。

我在 SQL(Server 2005) 中进行了跟踪,这就是服务器受到的影响:

exec sp_executesql N'
UPDATE CI 
SET 
 platform =@platform ,
 wstart = @wstart,
 wend = @wend,
 model = @model,
 productDescription = @productDescription,
 scanflag = @scanflag 
WHERE
 serial = @serial ',N'
 @serial nvarchar(11),
 @platform nvarchar(23),
 @wstart varchar(10),
 @wend nvarchar(10),
 @model nvarchar(24),
 @productDescription nvarchar(35),
 @scanflag nvarchar(1)',
 @serial=N'H01170RAHS6',
 @platform=N'Client Computer - Apple',
 @wstart=N'05/09/2011',
 @wend=N'05/09/2012',
 @model=N'iMac (20-inch, Mid 2009)',
 @productDescription=N'IMAC 20"/2.26/2X1GB/160GB/SD/MSE/KB',
 @scanflag=N'Y'

我怀疑 productDescription 中的单个双引号可能会抛出它,但我有一段时间试图将其剥离或替换为 (in.)。 我认为我在这方面的部分问题是当它被 WebServices 服务器填充时存储的值被转义,因为我可以在手表中将其视为“IMAC 20\”/2.26/2X1GB/160GB/SD/MSE/KB”列表。 我尝试用 String.Replace 以及 RegEx 语句替换转义和非转义引号。 TBH 我什至不确定我的报价是否正确。我只是在看它,因为并非所有返回都包含一个,而且它们也不都是循环的。

【问题讨论】:

  • 你能显示更多的代码吗,例如循环是如何构造的?您使用什么标准来确定要更新哪些 @serial 值?
  • 你是如何进行这个数据库调用的?参数中的双引号会抛出更新语句,只会尖叫Sql Injection Vulnerability...
  • 我过去做过这样的更新,其中包含双引号并且没有问题,所以我不确定这是问题所在(但我可能是错的)。 SQL Profiler 是否显示对该语句的任何写入?
  • @Aron Bertrand- 循环是根据此查询的返回构建的:字符串 countQuery = "SELECT TOP 1 * FROM CI WHERE ([wend] IS NULL AND [scanflag] = 'N')" ;我对其进行 COUNT 以确定我需要填充多少条目,然后我在没有 COUNT 的情况下运行它,而不是列表中的每个条目。基本上,我在 SQL 中有一个序列号列表,我检查了 wend 和 scanflag 值的 2 个条件。当我从 Web 服务返回所有数据时,我将其写出并将扫描标志从“N”设置为“Y”
  • @user1431356 好的...但是如果 Apple 将他们的下一台 Macbook 命名为'; Drop Table CI;--,请不要来找我哭...

标签: c# asp.net sql-server web-services


【解决方案1】:

双引号应该不是问题:在字符串内部,它们只是另一个字符。 (它们在字符串常量之外具有 的含义,但这不是这里发生的事情。)

我强烈怀疑您的问题不是 SQL 语法错误。如果是,您会看到它出现在多个地方。

例如,您会在 SQL Profiler 中看到它们(如果您在跟踪中包含错误和异常)。您还可以运行刚刚粘贴到 SSMS 中的确切 SQL 查询,并查看它是否有效。更重要的是,如果查询返回错误,您将在 C# 端收到 SQL 异常。如果这些事情都没有发生,那么您的查询似乎正在工作。

更有可能的是,查询正在运行,但没有做任何事情,因此您会一遍又一遍地获取相同的记录,因为需要更新。同样,在 SSMS 中运行会为您提供“1 行已更新”消息,这将帮助您跟踪此问题。

【讨论】:

  • 刚刚想通了。在尝试手动添加相同的数据后,我发现序列以某种方式以“H01170RAHS6W”开头,然后在代码中被截断为“H01170RAHS6”。所以 UPDATE 试图更新一个不在数据库中的值。查询结构是有效的,这就是它没有向应用程序抛出异常的原因。
猜你喜欢
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多