SqlCe странные результаты, почему? - Тот же SQL, разные результаты в разных приложениях. Проблема с - PullRequest
0 голосов
/ 07 января 2010

Когда я запускаю этот SQl в своем мобильном приложении, я получаю ноль строк.

select * from inventory WHERE [ITEMNUM] LIKE 'PUMP%' AND [LOCATION] = 'GARAGE'

Когда я запускаю тот же SQL в Query Analyzer 3.5, используя ту же базу данных, я получаю ожидаемую одну строку.

Почему разница?

Вот код, который я использую в мобильном приложении:

SqlCeCommand cmd = new SqlCeCommand(Query);
cmd.Connection = new SqlCeConnection("Data Source="+filePath+";Persist Security Info=False;");
DataTable tmpTable = new DataTable();
cmd.Connection.Open();
SqlCeDataReader tmpRdr = cmd.ExecuteReader();
if (tmpRdr.Read())
   tmpTable.Load(tmpRdr);
tmpRdr.Close();
cmd.Connection.Close();
return tmpTable;

UPDATE: Ради попытки я использовал код, найденный в одном из найденных ответов здесь , и он работает как положено. Итак, мой код выглядит так:

SqlCeConnection conn = new SqlCeConnection("Data Source=" + filePath + ";Persist Security Info=False;");
DataTable tmpTable = new DataTable();
SqlCeDataAdapter AD = new SqlCeDataAdapter(Query, conn);
AD.Fill(tmpTable);

Похоже, проблема связана с SqlCeDataReader.

Надеюсь, это поможет кому-то еще!

Ответы [ 2 ]

1 голос
/ 07 января 2010

Может ли это быть проверка, которую вы используете, чтобы увидеть, есть ли строки в вашем наборе результатов?

Метод tmpRdr.Read() будет перемещать курсор на первую строку в наборе результатов, если есть какие-либо строки. Затем, когда вы делаете tmpTable.Load, возможно, таблица данных загружается из этого места и далее, что приводит к пропуску первой (и только?) Строки.

Вы можете легко проверить это, удалив строку if (tmpRdr.Read()), поскольку в этом нет необходимости. Метод Load не завершится ошибкой, даже если набор результатов пуст, и в обоих случаях вы получите пустую таблицу данных. Единственное отличие будет в том, что вы настроите столбцы, если удалите оператор if.

0 голосов
/ 07 января 2010

Я согласен с Руной - вы должны опустить

if (tmpRdr.Read())

Если вы абсолютно хотите проверить, получается ли строка в результате выполнения, вам лучше использовать этот код:

if (tmpRdr.HasRows)
...