SELECT DISTINCT не работает в приложении .NET, но работает в SQL Mgmt Studio - PullRequest
1 голос
/ 27 мая 2009

У меня есть веб-приложение, в котором я вызываю запрос SELECT DISTINCT для двух соединенных таблиц. Если я пытаюсь выполнить запрос с веб-страницы, я получаю следующую ошибку: «Тип данных text, ntext или image не может быть выбран как DISTINCT». Когда я запускаю его из SQL Management Studio, запрос выполняется нормально - без ошибок. Еще интереснее то, что ни в одной из таблиц нет типов данных text, ntext или image.

Следует отметить, что я прошагал по коду и прямо перед выполнением запроса копирую запрос из окна «watch» в 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 ints, 1 datetime, 1 bit и 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 ]

7 голосов
/ 27 мая 2009

Возможно, вы запрашиваете две разные базы данных. Проверяли ли вы свое Соединение в своем приложении, чтобы убедиться, что вы запрашиваете ту же базу данных, к которой обращаетесь в SQL Mgmt Studio? Также возможно, что вы указываете на разные серверы. Возможно, вы захотите проверить это и в Соединении.

Если это так, то, скорее всего, это несоответствие схемы базы данных между двумя базами данных, с которыми вы запрашиваете.

1 голос
/ 27 мая 2009

Что произойдет, если вы закроете свой код выбора в хранимую процедуру и вызовете ее из своего кода C #?

1 голос
/ 27 мая 2009

Только что протестировал запрос DISTINCT для таблицы, содержащей столбец ntext. Это работает до тех пор, пока вы не выберете столбец ntext. Когда вы включаете столбец ntext, вы получаете ошибку, которую вы называете.

Итак, вы уверены, что ваш код делает:

 SELECT DISTINCT ResponseFormParent.*

а не

 SELECT DISTINCT *
0 голосов
/ 27 мая 2009

Попробуйте указать столбцы вместо использования select * (который в любом случае не должен использоваться в prod). Может быть, Адаптер данных просто предполагает, что у вас может быть столбец такого типа (только предположения здесь), когда вы используете select *.

0 голосов
/ 27 мая 2009

Вы уверены, что это не имеет никакого отношения к использованию DataAdapter? Вы пробовали свой код с помощью читателя ==> dbcmd.ExecuteReader ()?

0 голосов
/ 27 мая 2009

Вы проверили, используются ли одинаковые учетные данные в обоих соединениях?

0 голосов
/ 27 мая 2009

Если попытаться выбрать один столбец за раз, проблема все еще сохраняется?

0 голосов
/ 27 мая 2009

Вместо пошагового выполнения кода и копирования вывода в Management Studio запустите Profiler для базы данных и получите точный запрос, отправленный на сервер. Затем скопируйте его (включая sp_executesql, если он есть) и запустите его в Management Studio.

Это не только даст вам точный запрос, но и подтвердит, что он работает с правильной базой данных.

0 голосов
/ 27 мая 2009

Вы уверены, что веб-приложение подключается к той же базе данных? (т. е. dev против производства)?

Может быть, кто-то изменил этот nvarchar (255) на текстовый столбец в одной базе данных, но не другой ...

...