C #, SQL: собирать данные DataTable Rows и PrimaryKey за один вызов? - PullRequest
0 голосов
/ 05 июля 2011

Я хочу использовать ExecuteReader с CommandBehavior для сбора данных из таблицы SQL вместе с PrimaryKey информацией для этой таблицы.

Я знаю только, как сделать одно или другое. Если я указываю CommandBehavior для сбора KeyInfo, то Данные не собираются. Если я использую данные по умолчанию и собираю данные, KeyInfo не собирается.

DataTable Collect(string tableName) {
  DataTable table = new DataTable(tableName);
  if (!String.IsNullOrEmpty(tableName)) {
    using (SqlCeCommand cmd = new SqlCeCommand("SELECT * FROM " + tableName, new SqlCeConnection(Connection))) {
      cmd.Connection.Open();
      // this line will collect the Primary Key information: (Rows.Count = 0)
      table.Load(cmd.ExecuteReader(CommandBehavior.KeyInfo));
      // this line will collect the Row Data:
      table.Load(cmd.ExecuteReader());
      // I know the using clause is supposed to do this, but it can take too long
      cmd.Connection.Close();
    }
  }
  return table;
}

Я попытался собрать оба, используя оба флага:

      CommandBehavior cb = CommandBehavior.Default | CommandBehavior.KeyInfo
      table.Load(cmd.ExecuteReader(cb));

Однако это все равно приводит к возвращению 0 DataRows.

Конечно, я мог бы сделать два (2) вызова и объединить данные - но нужно ли это? Нет ничего чище?

1 Ответ

0 голосов
/ 05 июля 2011

Целочисленное значение CommandBehavior.Default равно нулю.Вот почему CommandBehavior.Default | CommandBehavior.KeyInfo ничем не отличается от CommandBehavior.KeyInfo

. Однако при вызове CommandBehavior.KeyInfo предполагается только добавить информацию в схему и не повлиять на возвращаемые строки, как это происходит с OleDb и SqlClients.

Я предполагаю, что это специфично для объектов SqlCe.

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