Создать DataTable со структурой таблицы БД

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

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

15.12.2008 21:05:19
5 ОТВЕТОВ

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

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

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

0
15.12.2008 21:07:30

Хорошо, если вы используете 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);
            }
1
15.12.2008 21:09:16

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

0
15.12.2008 21:29:49

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

Спасибо.

0
16.12.2008 19:34:53

Код преобразования отлично работает. При этом не учитывается, что базы данных могут иметь типы, допускающие значения 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
6.01.2011 09:51:49