2013-04-08 2 views
1
public void ExecuteAction(MySqlCommand query, Action<MySqlDataReader> action) 
    { 
     _connection.Open(); 
     query.Connection = _connection; 
     using(var reader = query.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       action(reader); 
      } 
      reader.Close(); 
     } 
     _connection.Close(); 
    } 

Можно ли сделать что-то подобное? Я получаю всегда ошибку «Неверная попытка чтения, когда читатель закрыт».Неверная попытка прочитать - возможно ли действие?

Это кусок кода, который я использую:

private void UpdateRecords() 
    { 
     var query = String.Format("SELECT * FROM {0}", _table); 
     var cmd = new MySqlCommand(query); 
     _db.ExecuteAction(cmd, reader => 
            { 
             var rows = new List<object>(); 
             for (var i = 0; i < reader.FieldCount; i++) 
             { 
              if (reader.IsDBNull(i)) continue; 
              var name = reader.GetName(i); 
              if (!_fields.Contains(name)) _fields.Add(name); 
              rows.Add(reader.GetValue(i)); 
             } 
             _records.Add(new Record(_fields, rows)); 
            }); 
    } 

Я пытаюсь хранить все записи таблиц баз данных по в динамические классы внутри программы. Когда я пытаюсь добавить динамические данные mysql в эти классы, я получаю эту ошибку.

Другой вопрос, который связан: есть ли библиотека, которая может сделать это для меня? Это много кода, который мне не нужно было бы записывать, но это мой первый подход к MySQL и C#, поэтому у меня нет каких-либо знаний. Спасибо за помощь.

UPDATE: теперь я получаю ошибку, что соединение уже открыт, MySQL делает меня проклятье (я привык к MongoDB ...)

+0

Вместо того, чтобы положить «раскрываемость» сообщение в верхней части вашего вопроса, пожалуйста, добавьте свое решение в качестве ответа, который может быть принят и ставится на голосование. –

ответ

1

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

MySQL - Multiple result sets

0

ExecuteAction ли работа? Вы даже используете этот код? UpdateRecords имеет очевидные проблемы. Если вы посмотрите на ExecuteAction, он откроет соединение, затем объявит читателя в заявлении using. После этого он закрывает соединение. В UpdateRecords у вас нет кода для открытия/закрытия соединения, и вам также не хватает кода, чтобы избавиться от чтения. В результате ваш код может работать иногда (например, если соединение уже открыто в другом месте) и не будет работать в другое время (в случае, если соединение еще не было выполнено).

+0

Так что, может быть, я что-то пропустил, но не могу ли я использовать «стандартное» соединение по всем классам для выполнения разных запросов? У меня есть класс ServerConnection, который при инициализации подключается к базе данных, и это соединение должно быть одинаковым каждый раз, когда мне нужно его использовать. Поэтому я открываю и закрываю это соединение, создавая каждый раз новый читатель и закрывая его, когда закончил. Теперь я получаю ошибку «команды не синхронизированы». Я действительно не знаю, что я не так, и я не могу найти какой-либо документации. –

+0

И да, ExecuteAction работает только для первого вызова, затем я получаю сообщение об ошибке (в зависимости от того, что я не знаю) –

+0

Я решил, спасибо! –

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