我有一个网络应用程序,我在两个连接表上调用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;
}
答案 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 *时可能有这种类型的列(只是在这里猜测)。