使用DB表结构创建DataTable

时间:2008-12-15 21:05:19

标签: c# sql-server

使用与SqlServer数据库中的表相同的结构创建DataTable的最佳方法是什么?目前,我正在使用SqlDataAdapter.Fill()和一个带回列但没有行的查询。这样做很好,但似乎克鲁兹。

有更好的方法吗?

5 个答案:

答案 0 :(得分:1)

好吧,如果您使用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 :(得分:1)

转换代码效果很好。它没有考虑数据库可能具有可空类型。我已经为此添加了一个检查,并将可空字段转换为不可为空。

 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);
 }

答案 2 :(得分:0)

嗯,你不知道结构吗?

“SET FMT_ONLY ON”或“WHERE 1 = 0”技巧都经过严格测试(结果不同)。

这里的查询是动态的吗?我不禁想你应该知道架构......

答案 3 :(得分:0)

查看此方法,SqlDataAdapter.FillSchema(),MSDN上的文章将告诉您如何使用它。

答案 4 :(得分:0)

是的,我知道现在的架构是什么,但它可能会改变,代码应该适应。此外,谁想要输入33个字段的规格。如果我理解正确,我的解决方案是“where 1 = 0”类型。我认为FillSchema也应该有效,但是由于它想要强制执行主键,所以存在隐藏的危险。由于我正在读取可能在验证过程中出错的数据,因此无法确定主键是否会重复。

感谢。