2016-01-25 2 views
3

Мне нужно получить информацию, хранящуюся в базе данных из тысячи элементов. Если я один за другим таким образом, это занимает большое количество времени (ТАС является 8-символьная строка):Не удается получить данные с помощью ExecuteReader() при группировке запросов

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=DataBase\IMEIDB.accdb"; 
using (OleDbConnection connection = new OleDbConnection(connectionString)) 
{ 
    connection.Open(); 
    using (OleDbCommand command = connection.CreateCommand()) 
    { 
     OleDbDataReader reader; 
     command.CommandText = "SELECT TAC, Name, Model, Year, Manufacturer, LTE FROM Terminales WHERE TAC = @tac"; 
     command.Parameters.AddWithValue("@tac", tac); 
     reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      ulong tac = Convert.ToUInt64(reader.GetString(0)); 
      if (this.DiccionarioTerminales.ContainsKey(tac)) 
      { 
       DiccionarioTerminales[tac].inDB = true; 
       DiccionarioTerminales[tac].Name = reader.GetValue(1).ToString(); 
       DiccionarioTerminales[tac].Manufacturer = reader.GetValue(2).ToString(); 
       DiccionarioTerminales[tac].Model = reader.GetValue(3).ToString(); 
       DiccionarioTerminales[tac].Year = reader.GetValue(4).ToString(); 
       DiccionarioTerminales[tac].LTE = reader.GetValue(5).ToString(); 
      } 
     } 
     command.Dispose(); 
    } 
    connection.Dispose(); 
} 

Он хорошо работает (я знаю, что я должен использовать ExecuteNonQuery() если это только одна запись, но этот пример только тест), но если я пытаюсь группы ТАС 10 по 10 (в настоящее время нолики является строкой, как 'xxxxxxxx','xxxxxxxx','xxxxxxxx','xxxxxxxx'...) со следующими изменениями в моем коде ...

OleDbDataReader reader; 
command.CommandText = "SELECT TAC, Name, Model, Year, Manufacturer, LTE FROM Terminales WHERE TAC IN (@tac)"; 
command.Parameters.AddWithValue("@tac", tac); 

это не входит в цикле while, и я не знаю, почему ...

Есть ли что-то что мне не хватает или, возможно, мне нужно использовать другой метод для извлечения этих данных?

EDIT: Изменение формата благодаря Soner Gönül ответа

+2

Я думаю, что вы имеете в виду '' ExecuteScalar' не ExecuteNonQuery' :) –

+0

Каких данных нолики? Integer? Строка? – PeterRing

+0

Какое значение передается в параметре 'tac'? Кстати - как это должно сгруппировать что-нибудь? Он используется только в состоянии 'where' вашего запроса. –

ответ

5

Потому что, когда вы используете эту строку в IN предложении, то это будет похоже,;

IN (xxxxxxxx,xxxxxxxx,xxxxxxxx,xxxxxxxx) 

но синтаксис правый должен быть

IN ('xxxxxxxx','xxxxxxxx','xxxxxxxx','xxxxxxxx') 

Вот почему он не работает. Одним из решений может быть, вы можете разделить свою строку на ,, форматировать их с помощью одинарных кавычек и снова присоединить их к ,.

var str = "xxxxxxxx,xxxxxxxx,xxxxxxxx,xxxxxxxx"; 
var result = string.Join(",", str.Split(',').Select(s => string.Format("'{0}'", s))); 

result будет 'xxxxxxxx','xxxxxxxx','xxxxxxxx','xxxxxxxx' и вы можете использовать его в своей статье IN как;

...TAC IN (@tac) 

и

command.Parameters.AddWithValue("@tac", result); 

Также не используйте AddWithValue столько, сколько вы можете. It may generate unexpected and surprising results sometimes. Используйте метод Add, чтобы указать свой тип параметра и его размер.

Похожие: Parameterize an SQL IN clause

+0

@ FernandoGallegoFernández Только 'Add (String, Object)' перегрузка устарела. Вы можете использовать _other_ перегрузки, такие как 'Add (String, SqlDbType, Int32)'. –

+0

Если я есть 'command.Parameters.AddWithValue ("@ tac", result); 'содержимое строки результата:' ''35582006', '35152207', '01383700', '35291306', '86794902', '35590206', '35925406', '35300107 ',' 35595206 ',' 35663305 '"' (в качестве примера), но все же не входят в цикл while –

+0

@ FernandoGallegoFernández Является ли запрос возвращает какие-либо данные в вашем менеджере баз данных? Вы уверены, что ваш столбец 'TAC' имеет одно из значений _those_? –

Смежные вопросы