C# 缺少GetSchemaTable列?

C# 缺少GetSchemaTable列?,c#,idatareader,getschematable,C#,Idatareader,Getschematable,我使用此代码将数据从dataReader获取到一个DataTable中,然后可以序列化该DataTable 但是,看起来任何具有空值的列都没有写入xml 我看不出这个问题 这是我的整个类,我调用这个方法 Process(IDataReader data, string filePath) 我确信这是可行的,因为我以前用过它来序列化数据表 Process(DataTable table, string filePath) 所以我认为它一定在GetDataTableFromSqlDataRead

我使用此代码将数据从dataReader获取到一个DataTable中,然后可以序列化该DataTable

但是,看起来任何具有空值的列都没有写入xml

我看不出这个问题

这是我的整个类,我调用这个方法

Process(IDataReader data, string filePath)
我确信这是可行的,因为我以前用过它来序列化数据表

Process(DataTable table, string filePath)
所以我认为它一定在GetDataTableFromSqlDataReader方法中

public class DataSerialisation
{
    public static DataRow GetFirstDataRow(string xmlFilePath)
    {
        return GetDataTable(xmlFilePath).Rows[0];
    }

    public static DataTable GetDataTable(string xmlFilePath)
    {
        DataSet ds = new DataSet();
        ds.ReadXml(xmlFilePath);
        return ds.Tables[0];
    }

    private static DataTable GetDataTableFromSqlDataReader(IDataReader dr)
    {

        DataTable dtSchema = dr.GetSchemaTable();
        DataTable dt = new DataTable();
        ArrayList listCols = new ArrayList();
        if (dtSchema != null)
        {
            foreach (DataRow drow in dtSchema.Rows)
            {
                string columnName = Convert.ToString(drow["columnName"]); //drow["columnName"].ToString();

                DataColumn column = new DataColumn(columnName, (Type) (drow["DataType"]));
                //column.ColumnName = columnName;
                //column.Unique = (bool) (drow["IsUnique"]);
                column.AllowDBNull = (bool) (drow["AllowDBNull"]);
                //column.AutoIncrement = (bool) (drow["IsAutoIncrement"]);
                //column.AutoIncrement = (bool) (drow["IsAutoIncrement"]);

                listCols.Add(column);
                dt.Columns.Add(column);
            }
            while (dr.Read())
            {
                DataRow dataRow = dt.NewRow();
                for (int i = 0; i < listCols.Count; i++)
                    dataRow[((DataColumn) listCols[i])] = dr[i];

                dt.Rows.Add(dataRow);
            }
        }
        return dt;
    }

    public static void Process(IDataReader data, string filePath)
    {
        Process(GetDataTableFromSqlDataReader(data), filePath);
    }

    public static void Process(DataTable table, string filePath)
    {
        DataSet ds = new DataSet();

        ds.Tables.Add(table.Clone());

        foreach (DataRow row in table.Rows)
        {
            DataRow newRow = ds.Tables[0].NewRow();
            for (int col = 0; col < ds.Tables[0].Columns.Count; col++)
                newRow[col] = row[col];
            ds.Tables[0].Rows.Add(newRow);
        }
        ds.WriteXml(new StreamWriter(filePath));
    }
}

为什么不使用DataTable.Loaddr?我想我已经解决了。。它位于ProcessDataTable表的字符串文件路径中,我已将对WriteXml的调用更改为ds.WriteXmlnew StreamWriterfilePath,XmlWriteMode.WriteSchema;