SELECT DISTINCT不在.NET应用程序中工作,但在SQL Mgmt Studio中工作

时间:2009-05-27 13:05:24

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

我有一个网络应用程序,我在两个连接表上调用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;
}

9 个答案:

答案 0 :(得分:7)

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

如果是这种情况,那么很可能是您要查询的两个数据库之间的数据库模式不匹配。

答案 1 :(得分:1)

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

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

 SELECT DISTINCT ResponseFormParent.*

而不是

 SELECT DISTINCT *

答案 2 :(得分:1)

如果将选择代码包装到存储过程&从你的C#代码中调用它?

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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