Создать DataTable со структурой таблицы БД - PullRequest
2 голосов
/ 16 декабря 2008

Каков наилучший способ создания DataTable с такой же структурой, как у таблицы в моей базе данных SqlServer? В настоящее время я использую SqlDataAdapter.Fill () с запросом, который возвращает столбцы, но без строк. Это прекрасно работает, но, кажется, Klutzy.

Есть ли лучший способ?

Ответы [ 5 ]

1 голос
/ 06 января 2011

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

 Type type = typeof(Product); //or whatever the type is
 DataTable table = new DataTable();
 foreach(var prop in type.GetProperties())
 {
     Type colType = prop.PropertyType;
     if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>))
     {
         System.ComponentModel.NullableConverter nc = new System.ComponentModel.NullableConverter(colType);
         colType = nc.UnderlyingType;
     }
     table.Columns.Add(prop.Name, colType);
 }
1 голос
/ 16 декабря 2008

Что ж, если вы используете Linq2Sql, вы можете отразить класс сущностей и создать таблицу данных на основе имени свойства и типа данных.

            Type type = typeof(Product); //or whatever the type is
            DataTable table = new DataTable();
            foreach(var prop in type.GetProperties())
            {
                table.Columns.Add(prop.Name, prop.PropertyType);
            }
0 голосов
/ 16 декабря 2008

Да, я знаю, какая схема сейчас, но она может измениться, и код должен адаптироваться. Кроме того, кто хочет ввести спецификации для 33 полей. Если я правильно понимаю, мое решение было типа "где 1 = 0". Я думаю, что FillSchema также должна работать, но есть скрытые опасности, поскольку она хочет применить первичный ключ. Так как я читаю данные, которые могут содержать ошибки в процессе проверки, я не могу быть уверен, что первичный ключ не будет дублирован.

Спасибо.

0 голосов
/ 16 декабря 2008

Проверьте этот метод, SqlDataAdapter.FillSchema (), статья MSDN расскажет вам, как его использовать.

0 голосов
/ 16 декабря 2008

Ну, разве вы уже не знаете структуру?

Трюки "SET FMT_ONLY ON" или "WHERE 1 = 0" очень проверены (с разными результатами).

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

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