【问题标题】:SELECT DISTINCT not working in .NET application, but works in SQL Mgmt StudioSELECT DISTINCT 在 .NET 应用程序中不起作用,但在 SQL Mgmt Studio 中起作用
【发布时间】:2010-10-29 06:32:22
【问题描述】:

我有一个网络应用程序,我在其中对两个连接的表调用 SELECT DISTINCT 查询。如果我尝试从网页运行查询,我会收到以下错误:“无法将 text、ntext 或 image 数据类型选为 DISTINCT”。当我从 SQL Management Studio 中运行它时,查询运行良好 - 没有错误。更有趣的是,这两个表中都没有 text、ntext 或 image 数据类型。

应该注意的是,我正在单步执行代码,并且在执行查询之前,我正在将查询从“监视”窗口复制到 Mgmt Studio,当我单步执行并让.NET 运行它,会引发错误。我正在使用 .NET 2 和 System.Data.SqlClient 命名空间。

这是我的查询:

SELECT DISTINCT ResponseFormParent.* 
FROM ResponseFormParent 
INNER JOIN ResponseForm 
  ON ResponseFormParent.ResponseFormParentId = ResponseForm.ResponseFormParentId 
WHERE ResponseForm.RegistrationDeadline >= '5/1/2009'

ResponseFormParent 有 3 个整数、1 个日期时间和 1 个 nvarchar(50)。 ResponseForm 有 4 个整数、1 个日期时间、1 个位和 1 个 nvarchar(255)。

是什么导致了问题?这个错误没有意义。


更新:调用查询的代码

public DataSet ExecuteQuery(string sql)
{
 DataSet ds = null;
 try
 {
  using (SqlConnection dbconn = new SqlConnection(connectionString))
  using (SqlCommand dbcmd = new SqlCommand(sql, dbconn))
  {
   SqlDataAdapter dbadapter = new SqlDataAdapter(dbcmd);
   ds = new DataSet();
   dbadapter.Fill(ds);
  }
 }
 catch (Exception ex)
 {
  Utility.LogError(sql, ex);
 }
 return ds;
}

【问题讨论】:

  • 发布执行查询的 C#/VB 代码?
  • 你能添加用于运行查询的代码吗?
  • 好吧,您的 cmets 已经淘汰了服务器/数据库。猜猜唯一剩下的就是Schemas了。有没有可能在不同的模式中有另一个表? (你能改变你的查询,把 dbo. 放在每个表名的前面)
  • 添加方案后没有变化(dbo.)
  • 您查询的是哪个版本的 SQL Server?

标签: .net sql tsql sql-server-2000


【解决方案1】:

尝试指定列而不是使用 select *(无论如何都不应该在 prod 上使用)。可能是数据适配器只是假设您在使用 select * 时可能有那种类型的列(只是在这里猜测)。

【讨论】:

    【解决方案2】:

    您确定这与使用 DataAdapter 没有任何关系吗?您是否使用阅读器 ==> dbcmd.ExecuteReader() 尝试过您的代码?

    【讨论】:

      【解决方案3】:

      如果尝试一次选择一列,问题仍然存在?

      【讨论】:

      • 所有列都不应该给我带来问题 - 两个表中都没有要转换的 text、ntext 或 image 列。
      【解决方案4】:

      您是否检查了两个连接中是否使用了相同的凭据?

      【讨论】:

      • 好吧,您不能从非管理员帐户运行分析器,但除此之外,我使用与 Web 应用程序相同的凭据连接到查询分析器和管理工作室.
      【解决方案5】:

      如果您将选择代码包装到一个存储过程并从您的 C# 代码中调用它会发生什么?

      【讨论】:

      • 与上面 Andomar 的回答一样,这确实允许查询运行,所以我将其标记为有帮助,但没有将其标记为已批准的答案,因为它没有回答原始问题 - 为什么查询在一个地方工作,但不是来自代码。
      【解决方案6】:

      刚刚在包含 ntext 列的表上测试了 DISTINCT 查询。只要您避免选择 ntext 列,它就可以工作。当您包含 ntext 列时,您会收到您命名的错误。

      所以你确定你的代码在做什么:

       SELECT DISTINCT ResponseFormParent.*
      

      不是

       SELECT DISTINCT *
      

      【讨论】:

      • 我确定。无论哪种方式,这都不重要(关于我得到的错误),因为这两个表都没有 text、ntext 或 image 列。
      • 你试过用明确的列名替换 * 吗?只试验一列,看看错误是否仍然存在。
      • 用列名替换 * 后,查询能够运行。我投票赞成您的答案有帮助,但不幸的是它没有回答最初的问题 - 为什么它在一个地方而不是在另一个地方工作,所以我没有将它标记为批准的答案(还)。
      • 好的,现在更酷了。一种可能的解释是 Sql Server 缓存了一个旧的查询计划,其中 * 确实包含一个 ntext/image 列。这些查询是为特定客户端缓存的,因此您的应用程序最终可能会使用旧的缓存版本,而 Management Studio 使用新的 * 扩展。不确定。
      【解决方案7】:

      您可能正在查询两个不同的数据库。您是否在应用程序中检查过您的连接,以确保您实际上查询的数据库与您在 SQL Mgmt Studio 中查询的数据库相同?您也可能指向不同的服务器。您可能还想在您的 Connection 中进行检查。

      如果是这种情况,则很可能是您要查询的两个数据库之间的数据库架构不匹配。

      【讨论】:

      • 现在只有一个数据库,所以不,我不是在查询两个不同的数据库。
      • @Rick 你也没有多台服务器?
      • 只有 1 个 Web 服务器和 1 个数据库服务器。
      【解决方案8】:

      无需单步执行代码并将输出复制到 Management Studio 中,而是针对数据库运行 Profiler 并捕获发送到服务器的确切查询。然后复制它(包括 sp_executesql,如果它在那里)并在 Management Studio 中运行它。

      这不仅会为您提供准确的查询,还会确认它正在针对正确的数据库运行。

      【讨论】:

      • 好的,只需使用分析器运行它,查询与我在上面输入的完全一样(它还使用正确的数据库确认了所有关于我的问题 - 我就是这样)。
      • 您可以尝试将 * 替换为表中的实际列名,看看是否也会出现相同的错误?
      【解决方案9】:

      您确定网络应用正在连接到同一个数据库吗? (即开发与生产)?

      也许有人将 nvarchar(255) 更改为一个数据库中的文本列,而不是另一个...

      【讨论】:

      • 现在只有一个数据库,所以不,我不是在查询两个不同的数据库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2014-04-15
      • 2010-10-18
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多