List 转DataTable解决system.DBNull 问题

  #region  反射List To DataTable
        ///  
        /// 将List集合类转换成DataTable 
        ///  
        /// 集合 
        ///  
        public static DataTable ListToDataTable(IList list)
        {
            DataTable result = new DataTable();
            if (list.Count > 0)
            {
                PropertyInfo[] propertys = list[0].GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    //获取类型
                    Type colType = pi.PropertyType;
                    //当类型为Nullable<>时
                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    {

                        colType = colType.GetGenericArguments()[0];

                    }
                    Attribute att = pi.GetCustomAttribute(typeof(NameAttribute), true);
                    if (att!=null)
                    {
                        NameAttribute nameAtt = (NameAttribute)att;
                        result.Columns.Add(nameAtt.title, colType);
                    }
                    else
                    {
                        result.Columns.Add(pi.Name, colType);
                    }
                    
                }

                for (int i = 0; i < list.Count; i++)
                {
                    ArrayList tempList = new ArrayList();
                    foreach (PropertyInfo pi in propertys)
                    {
                        object obj = pi.GetValue(list[i], null);
                        tempList.Add(obj);
                    }
                    object[] array = tempList.ToArray();
                    result.LoadDataRow(array, true);
                }
            }
            return result;
        }
        #endregion

这个错误通常是因为代码中使用了错误的方法或参数来调用 FillSchema 方法。FillSchema 方法是用来填充数据表的架构信息,它需要传入一个数据集或数据表参数。根据错误信息,我们可以看到代码中将 OleDbConnection 对象直接传入了 FillSchema 方法,导致参数类型不匹配,从而引发了重载决策失败的错误。 解决这个错误的方法是,确认你的代码中是否正确地调用了 FillSchema 方法,并且传入了正确的参数。如果你需要填充整个数据集的架构信息,应该使用数据适配器的 FillSchema 方法,例如: ```vb.net Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=ExcelFile.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'") Dim adapter As New OleDbDataAdapter("SELECT * FROM [Sheet1$]", connection) Dim dataSet As New DataSet() adapter.FillSchema(dataSet, SchemaType.Source) ``` 在上面的代码中,我们首先创建了一个 OleDbConnection 对象和一个 OleDbDataAdapter 对象,然后使用 FillSchema 方法将架构信息填充到数据集中。注意,我们传入的第一个参数是一个数据集对象,而不是 OleDbConnection 对象。 如果你只需要填充单个数据表的架构信息,可以使用 FillSchema 方法的另一个重载,例如: ```vb.net Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=ExcelFile.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'") Dim adapter As New OleDbDataAdapter("SELECT * FROM [Sheet1$]", connection) Dim dataTable As New DataTable() adapter.FillSchema(dataTable, SchemaType.Source) ``` 在上面的代码中,我们创建了一个 DataTable 对象,然后使用 FillSchema 方法将架构信息填充到数据表中。注意,我们传入的第一个参数是一个数据表对象,而不是 OleDbConnection 对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值