0

我有以下代码使用 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();
}

我确信这是显而易见的事情,我会因为没有注意到它而踢自己,但现在我很难过。

4

1 回答 1

3

使用 Profiler 确认:

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

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

于 2009-06-09T01:47:38.060 回答