【问题标题】:SqlCommand.ExecuteScalar returns null but raw SQL does notSqlCommand.ExecuteScalar 返回 null 但原始 SQL 不返回
【发布时间】:2009-06-09 01:33:52
【问题描述】:

我有以下代码,它使用 SqlClient.ExecuteScalar 方法从表中返回 ID。

using (var conn = new SqlConnection(connectionString))
using (var cmdContrib = new SqlCommand("SELECT ContributorId FROM Contributor WHERE Code='" + folderSystem.ContributorCode + "'", conn))
{
    conn.Open();
    var contribId = cmdContrib.ExecuteScalar();
}

最初它可以工作,但现在 contribId 为空。从 Profiler 中提取后,我在 Management Studio 中测试了 SQL,它按预期返回了 ID。

接下来我添加了一个额外的命令来从不同的表(产品)中检索 ID。
productId 不为空,而 contribId 继续为空。

using (var conn = new SqlConnection(connectionString))
using (var cmdContrib = new SqlCommand("SELECT ContributorId FROM Contributor WHERE Code='" + folderSystem.ContributorCode + "'", conn))
using (var cmdTest = new SqlCommand("SELECT productId FROM Product WHERE [filename] = 'bda00001.jpg'", conn))
{
    conn.Open();
    var contribId = cmdContrib.ExecuteScalar();
    var productId = cmdTest.ExecuteScalar();
}

我确信这是显而易见的事情,我会因为没有注意到它而自责,但现在我被难住了。

【问题讨论】:

  • 您对 folderSystem.ContributorCode 的调试值是多少?
  • folderSystem.ContributorCode 包含什么值?我倾向于这是一种 SQL 注入类型的错误(例如,变量值中的单引号)。
  • 使用静态 SQL 查询构造 cmdContrib,就像使用 cmdTest 一样,看看会发生什么。这个问题可能会突然出现在你身上。
  • folderSsystem.ContributorCodde 包含“PST”。
  • folderSystem.ContributorCode 的调试值为“PST”。尝试将其设为静态查询:“SELECT ContributorId FROM tblContributor WHERE Code='PST'”。仍然返回 null。

标签: c# sqlcommand


【解决方案1】:

使用 Profiler 确认:

A) 有多少行被返回(我怀疑是 0) B)它在什么数据库中 C)它的登录/用户上下文是什么。 D) 实际的整个 SQL 命令是什么。

提取此命令并在同一个数据库中重新执行它以确认它确实返回了一个值。如果成功,则将您的执行上下文更改为 Profiler 所说的连接正在运行的上下文,然后重试。如果现在失败(返回 0 行),则检查源表(Contributor)是否实际上可能是实现行级安全性的视图。

【讨论】:

  • " C) 它的登录/用户上下文" +1,应用程序很容易在不同的上下文中运行
  • 这是一个不同的数据库(尴尬)虽然这个答案可以作为这类问题的检查清单。
  • 别担心,它迟早会发生在我们所有人身上。
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2010-12-07
  • 2015-09-04
相关资源
最近更新 更多