在DataTable对象中,我如何获得列列表及其最小/最大字符串长度

本文关键字:字符串 列表 对象 DataTable 何获得 | 更新日期: 2023-09-27 17:51:03

当我尝试SqlBulkCopy时,我得到一个字符串截断错误,我需要调试哪个字段导致它。

到目前为止我有这个。我可以得到列名,但不知道如何继续得到他们的最小/最大字符串长度。

var columnNames = from columns in table.Columns.Cast<DataColumn>()
                  select columns.ColumnName;

我不知道LINQ是否可行。如果不是,我愿意将其转储到SQL server中,并在那里执行分析。

在DataTable对象中,我如何获得列列表及其最小/最大字符串长度

要获取存储在列中的最长字符串的长度,应该执行如下操作:

var columns = 
    from DataColumn column in table.Columns
    where column.DataType == typeof(string)
    select new
    {
        column.ColumnName,
        MaxLength = 
        (
            from DataRow row in table.Rows 
            where !row.IsNull(column) 
            select ((string)row[column]).Length
        ).Max()
    };

或者,在lambda语法中:

var columns = table.Columns.Cast<DataColumn>()
    .Where(column => column.DataType == typeof(string))
    .Select(column => new 
    { 
        column.ColumnName, 
        MaxLength = table.Rows.Cast<DataRow>()
            .Where(row => !row.IsNull(column))
            .Select(row => ((string)row[column]).Length)
            .Max() 
    });

EDIT:您还可以从行开始,并枚举每行的列,可能在大型表中为您提供更好的性能:

var columns =
    from DataRow row in table.Rows
    from DataColumn column in table.Columns
    where column.DataType == typeof(string) && !row.IsNull(column)
    let length = ((string)row[column]).Length
    group length by column.ColumnName into g
    select new
    {
        ColumnName = g.Key,
        MaxLength = g.Max()
    };

lambda语法:

var columns = table.Rows.Cast<DataRow>()
    .SelectMany(row => table.Columns.Cast<DataColumn>(), (row, column) => new { row, column })
    .Where(pair => pair.column.DataType == typeof(string) && !pair.row.IsNull(pair.column))
    .GroupBy(pair => pair.column.ColumnName, (key, items) => new 
    { 
        ColumnName = key, 
        MaxLength = items.Max(x => ((string)x.row[x.column]).Length) 
    });

用LINQ来做这个没有什么意义,但是还是用它吧:

var columnNames = from column in table.Columns.Cast<DataColumn>()
                  select new { column.ColumnName, column.MaxLength };

如果需要更多信息,还可以获取模式本身。这只需要您对ExecuteReader执行一些命令(select * from table)并在该数据读取器上调用GetSchemaTable。这将产生一个包含关于这些列的更多信息的表(每列一行)。