2010-01-07 4 views
0

Когда я запускаю этот SQl в своем мобильном приложении, я получаю нулевые строки.Непонятные результаты SqlCe почему? - Тот же 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: Ради попыток я использовал код найденный в одном из ответов нашли here и он работает как ожидается. Таким образом, мой код выглядит так:

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.

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

ответ

1

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

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

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

+0

Это имело бы смысл с результатами, которые я получал ... Или скорее не получал. Я дам это, чтобы посмотреть, что произойдет. – NitroxDM

+0

Вот и все. Благодаря! – NitroxDM

0

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

if (tmpRdr.Read()) 

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

if (tmpRdr.HasRows) 
Смежные вопросы