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 中的同一列以字符串形式出现。

如果可能的话,我很想将它们全部集中为字符串,我会即时转换它们。

谢谢。

c# 数据表强制使用适配器填充时的数据类型

我已经发布了一个类,它将为您读取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(加载数据时,根据需要转换或跳过值。

此解决方案可能较慢,但它可以完全控制分析。