c# 数据表强制使用适配器填充时的数据类型
本文关键字:填充 数据类型 适配器 数据表 | 更新日期: 2023-09-27 18:34:33
在使用 OleDbDataAdapter 时,Visual Studio 2010 为列选择不正确/不一致的数据类型时遇到了问题。
是否可以将每列的数据类型集中为字符串?
目前,我正在尝试将我的CSV文件转换为数据表。当我尝试在相同的列名上使用相同的方法时,某些列最终是双精度的,结果证明它是字符串(因为第二个 CSV 文件以"-"符号开头,所以它只是假设它是一个字符串(
using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path.GetDirectoryName(filePath) + ";Extended Properties='"Text;HDR=Yes;TypeGuessRows=0;ImportMixedTypes=Text'""))
using (OleDbCommand command = new OleDbCommand(@"SELECT * FROM [" + Path.GetFileName(filePath) + "]", connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
adapter.Fill(dt);
尝试将其与另一个 CSV 文件合并:
using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path.GetDirectoryName(part2FilePath) + ";Extended Properties='"Text;HDR=Yes;TypeGuessRows=0;ImportMixedTypes=Text'""))
using (OleDbCommand command = new OleDbCommand(@"SELECT * FROM [" + Path.GetFileName(part2FilePath) + "]", connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
DataTable tmpDt = new DataTable();
adapter.Fill(tmpDt);
dt.Merge(tmpDt, true, MissingSchemaAction.Add);
}
我遇到了数据类型不匹配的冲突。 第一个 CSV 的两倍作为其中一列,但第二个 CSV 中的同一列以字符串形式出现。
如果可能的话,我很想将它们全部集中为字符串,我会即时转换它们。
谢谢。
我已经发布了一个类,它将为您读取CSV文件到CsvLineItem对象列表中。我已经展示了几种不同的方法来读取值(按列索引或按列名,以及如何处理 NULL 值(
public class CsvLineItem
{
public string Id { get; set; }
public string Name { get; set; }
public double Value1 { get; set; }
public double Value2 { get; set; }
}
public static class CsvReader
{
public static IList<CsvLineItem> Read(string csvFilename)
{
var items = new List<CsvLineItem>();
using (var connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ Path.GetDirectoryName(csvFilename)
+ ";Extended Properties='"Text;HDR=Yes;TypeGuessRows=0;ImportMixedTypes=Text'""))
{
connection.Open();
using (var command = new OleDbCommand(@"SELECT * FROM [" + Path.GetFileName(csvFilename) + "]", connection))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
items.Add(new CsvLineItem
{
Id = reader.GetInt32(0), // By column index
Name = reader.GetString(reader.GetOrdinal("Name")), // By column name
Value1 = reader.GetDouble(2),
Value2 = reader.IsDBNull(3) ? 0 : reader.GetDouble(3) // Handling nulls
});
}
}
}
}
return items;
}
我的建议是使用额外的步骤来处理结构更难阅读的CSV文件。如果文件不大,可以使用此解决方案:
1(以更友好的结构加载CSV。
使用 Microsoft.VisualBasic.FileIO.TextFieldParser 解析所有文件,并获取字符串列表(或类似内容(列表的数据。更多细节可以在这里找到。
2(加载数据时,根据需要转换或跳过值。
此解决方案可能较慢,但它可以完全控制分析。