SqlCommand.ExecuteScalar返回null但原始SQL不返回null

时间:2009-06-09 01:33:53

标签: c# sqlcommand

我有以下代码,它使用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中提取后测试了管理工作室中的SQL,并按预期返回了ID。

接下来,我添加了一个额外的命令来从另一个表(Product)中检索ID 当contribId继续为null时,productId不为null。

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();
}

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

1 个答案:

答案 0 :(得分:3)

使用Profiler确认:

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

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