C# oledb到csv异常的奇怪行为
我有一个应用程序,它通过ole db连接到csv数据。csv数据被加载到数据表中。然后我遍历表的数据行。对于每个datarow,都会调用一个函数,将数据插入mysql数据库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
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;
}