C# oledb到csv异常的奇怪行为

C# oledb到csv异常的奇怪行为,c#,csv,oledb,C#,Csv,Oledb,我有一个应用程序,它通过ole db连接到csv数据。csv数据被加载到数据表中。然后我遍历表的数据行。对于每个datarow,都会调用一个函数,将数据插入mysql数据库 private void ConvertCSVDocument() { try { using (var dataSet = base.Source.CreateDataSet()) { using (var dataTable = dataSet.Ta

我有一个应用程序,它通过ole db连接到csv数据。csv数据被加载到数据表中。然后我遍历表的数据行。对于每个datarow,都会调用一个函数,将数据插入mysql数据库

private void ConvertCSVDocument()
{
    try
    {
        using (var dataSet = base.Source.CreateDataSet())
        {
            using (var dataTable = dataSet.Tables[0])
            {
                base.Progress(dataTable.Rows.Count, 0);

                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    try
                    {
                        this.ConvertCSVDocumentRow(dataTable.Rows[i]);
                    }
                    catch (Exception e)
                    {
                        base.Report($"Row {i.ToString("0000")} {e}");
                    }
                    finally
                    {
                        base.Progress(dataTable.Rows.Count, i);
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        base.Report($"Fatal error: {e}");
    }
}
以下是ConvertSCVDocumentRow函数的抽象版本:

try
{
    var forename = dataRow["some_column_name_1"].ToString();
    var surename = dataRow["some_column_name_2"].ToString();

    int person_ident = GetIdentForPerson(forename,surename);

    if (person_ident <= 0)
    {
        InsertPerson(forename,surename);                
    }
}
catch(Exception e)
{
    throw new Exception("Failed to convert person!", e);
}
试试看
{
var forename=dataRow[“某些列名称”]。ToString();
var surename=dataRow[“某些列名称”]。ToString();
int person_ident=GetIdentForPerson(名字,surename);

如果(person_ident如Rune Grimstadt所述,则有其他选项可用于将csv文件读取到数据集。以下是internet上使用FileStream i fount的解决方案:

public DataTable CreateDataTable()
{
    DataTable dt = new DataTable();
    FileStream aFile = new FileStream(this.FilePath, FileMode.Open);
    using (StreamReader sr = new StreamReader(aFile, System.Text.Encoding.Default))
    {
        string strLine = sr.ReadLine();
        string[] strArray = strLine.Split(';');

        foreach (string value in strArray)
            dt.Columns.Add(value.Trim());

        DataRow dr = dt.NewRow();

        while (sr.Peek() > -1)
        {
            strLine = sr.ReadLine();
            strArray = strLine.Split(';');
            dt.Rows.Add(strArray);
        }
    }
    return dt;
}

这对我很有用。

您能在
系统.ArgumentException
之后翻译消息并提供
转换CSVDocumentRow
方法吗?您可能使用了错误的方法参数。错误是由于oledb试图将输入转换为日期。oledb使用windows中的JET驱动程序或Microsoft Offic中的ACE驱动程序e、 Oldedb是Excel中使用的默认方法,当单元格设置为将数字转换为日期和日期转换为数字的常规格式时,您在Excel中会看到的错误是由于oledb方法。oledb的一个已知问题是它会自动将日期更改为整数的第一列。因此,我认为您的错误是由于oledb更改从date到int的第一列,然后将int放入datatable中声明为date的列失败。读取的第一列?或第一个表的第一列?我使用dataRow[“some_name”]读取每个值。ToString()。您真的需要使用OleDb驱动程序将csv文件读入数据表吗?还有其他更好的选项可用于解析csv文件。虽然有很多,但CsvHelper库是一个很好的起点。请查看此处的文档:
public DataTable CreateDataTable()
{
    DataTable dt = new DataTable();
    FileStream aFile = new FileStream(this.FilePath, FileMode.Open);
    using (StreamReader sr = new StreamReader(aFile, System.Text.Encoding.Default))
    {
        string strLine = sr.ReadLine();
        string[] strArray = strLine.Split(';');

        foreach (string value in strArray)
            dt.Columns.Add(value.Trim());

        DataRow dr = dt.NewRow();

        while (sr.Peek() > -1)
        {
            strLine = sr.ReadLine();
            strArray = strLine.Split(';');
            dt.Rows.Add(strArray);
        }
    }
    return dt;
}