当我尝试SqlBulkCopy
时,我得到一个字符串截断错误,我需要调试哪个字段导致它。
到目前为止我有这个。我可以得到列名,但不知道如何继续得到他们的最小/最大字符串长度。
var columnNames = from columns in table.Columns.Cast<DataColumn>()
select columns.ColumnName;
我不知道LINQ是否可行。如果不是,我愿意将其转储到SQL server中,并在那里执行分析。
要获取存储在列中的最长字符串的长度,应该执行如下操作:
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
。这将产生一个包含关于这些列的更多信息的表(每列一行)。