DataSet - Обеспечение данных PrimaryKey при заполнении запроса, который является внешним соединением - PullRequest
3 голосов
/ 11 июня 2010

При заполнении DataSet я использую значение «AddWithKey» для MissingSchemaAction объекта DataAdapter. По данным MSDN:

Добавление информации о схеме в DataSet перед заполнением его данными обеспечивает что ограничения первичного ключа включены в объекты DataTable в DataSet.

Но, когда я делаю следующее:

DataColumn[] foo = TheDataSet.Tables["Table1"].PrimaryKey;

Я получаю foo.Length of 0. Есть ли что-то еще, что мне нужно сделать помимо этого?:

string TheQuery = "SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.EVENT_NUM = Table2.EVENT_USER_NUM;
using (SqlDataAdapter TheDataAdapter = new SqlDataAdapter(TheQuery, TheConnection)
{
    TheDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    TheDataAdapter.Fill(TheDataSet, "Table1");
}

Обратите внимание, если мой запрос был:

string TheQuery = "SELECT * FROM Table1";

Все будет хорошо. Но я не получу PrimaryKey, если есть соединение. Это вообще возможно (чтобы получить первичный ключ)?

РЕДАКТИРОВАТЬ: Сначала я не осознавал, что это было JOIN. Хотя я протестировал ВНУТРЕННИЕ СОЕДИНЕНИЯ, которые возвращали бы PrimaryKey. Виновным кажется тот факт, что это НАРУЖНОЕ СОЕДИНЕНИЕ. Таким образом, я изменил название.

1 Ответ

2 голосов
/ 24 февраля 2011

С msdn :

Если SelectCommand возвращает результаты OUTER JOIN, DataAdapter не будет устанавливать значение PrimaryKey для результирующего DataTable.Вы должны определить PrimaryKey самостоятельно, чтобы гарантировать правильное разрешение дублирующихся строк.

...