IDataReader для универсального доступа - PullRequest
1 голос
/ 29 ноября 2011

Я пытаюсь создать класс «Помощник», в котором вы просто передаете драйвер и параметры, а класс выполняет сборку соединения и строки соединения для вас.

Я использовал интерфейсы из System.Data, такие как IDataReader, IDbConnection.

Теперь после тестирования с MySQL код работает отлично, но как только я указываю и настраиваю его для SQLСервер (Microsoft) не возвращает обработанные строки.Я выполнил некоторую отладку, и информация с сервера SQL появилась в IDataReader, но, похоже, я не могу перебрать ее?

Мой текущий код:

Метод подключения в классе помощника

try
{
    factory = System.Data.Common.DbProviderFactories.GetFactory(driver);
    _con = factory.CreateConnection();
    _con.ConnectionString = buildConnectionString.ToString();
    _con.Open();
}
catch (System.Data.Common.DbException ex)
{
    _con = null;
    throw ex;
}
catch (Exception ex)
{
    _con = null;
    throw ex;
}
return _con;

В тот момент, когда я передаю свой драйвер как System.Data.SqlClient для SQL Server и MySql.Data.MySqlClient для MySQL.

System.Data.IDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
while (reader.Read())
{
    System.Data.DataRow row = table.NewRow();
    // Insert info from Reader into the Row
    table.Rows.Add(row);
}

reader.Close();

Я подозреваю, что это как-то связано с тем, как IDataReader пытается обрабатывать типы, но не может найти какую-либо документацию по этому вопросу, поскольку он отлично работает для MySQL, но не для SQL Server?Любая помощь?

1 Ответ

1 голос
/ 29 ноября 2011

Вы не даете здесь много подсказок, так как большая часть интересного кода здесь , вероятно, вокруг настройки команды.Если при выполнении он никогда не входит в блок while (reader.Read()) {...}, то он , вероятно, TSQL или связан с параметром (особенно пустые, что может легко привести к отсутствию строк).

Поскольку ваши данныеявляется DataTable -центричным, и у вас уже есть фабрика провайдеров, другая возможность здесь - использовать CreateDataAdapter() с фабрики и позволить фабрике беспокоиться о привязке TSQL к DataTable.В противном случае проверьте, что предоставляемый вами TSQL является корректным, разумным и правильно параметризованным.

В конечном счете, сам цикл Read() в порядке, и это почти то же, что и все подпрограммы материализации.Это, например, очень близко к тому, как работает dapper, и это прекрасно работает в разных базах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...