C# OleDB,丢失数据的第一个字符
我维护的ASP.NET应用程序有一个CSV读取代码。这个ASP.NET网站从3年前开始运行良好,使用Ole.JetDB.4.0的CSV读取代码运行良好,只是偶尔会有一些超过4K-5K记录的CSV产生问题。通常问题是,位于随机位置[随机行]的记录丢失了它的第一个字符 CSV文件只是每行的一组名称和地址,它们是ASNI格式的。CSV是逗号分隔的,数据中没有“逗号”,现在字段用单引号或双引号括起来。此外,这种情况并不经常发生,我们使用相同的代码来上传70K记录,它们工作正常,但有时说在3年内大约3-4个文件只有这个问题,我们每天上传大约一个文件 对于那些需要我所做的事情的人C# OleDB,丢失数据的第一个字符,c#,asp.net,csv,oledb,C#,Asp.net,Csv,Oledb,我维护的ASP.NET应用程序有一个CSV读取代码。这个ASP.NET网站从3年前开始运行良好,使用Ole.JetDB.4.0的CSV读取代码运行良好,只是偶尔会有一些超过4K-5K记录的CSV产生问题。通常问题是,位于随机位置[随机行]的记录丢失了它的第一个字符 CSV文件只是每行的一组名称和地址,它们是ASNI格式的。CSV是逗号分隔的,数据中没有“逗号”,现在字段用单引号或双引号括起来。此外,这种情况并不经常发生,我们使用相同的代码来上传70K记录,它们工作正常,但有时说在3年内大约3-4
using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection
("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='text;HDR=Yes;FMT=Delimited';Data Source=" + HttpContext.Current.Server.MapPath("/System/SaleList/"))
{
string sql_select = "select * from [" + this.FileName + "]";
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter();
da.SelectCommand = new System.Data.OleDb.OleDbCommand(sql_select, conn);
DataSet ds = new DataSet();
// Read the First line of File to know the header
string[] lines = System.IO.File.ReadAllLines(HttpContext.Current.Server.MapPath("/System/SaleList/") + FileName);
string header = "";
if (lines.Length > 0)
header = lines[0];
string[] headers = header.Split(',');
CreateSchema(headers, FileName);
da.Fill(ds, "ListData");
DataTable dt = ds.Tables["ListData"];
}
除了提到的事情,这段代码运行良好。我剪切了一些不相关的部分,所以复制粘贴可能不起作用
编辑:更多信息
编辑2:我已在此处将其作为错误提交给Microsoft:我建议您使用十六进制编辑器检查问题文件-检查导致问题的行及其前面的行
特别是查看行终止符(CR/LF?仅CR?仅LF?)并查找任何不可打印的字符。尝试使用ACE驱动程序来代替JET(在x86和x64服务器上可用,JET仅为x86!)
你为什么不用这个:
using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection
("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='text;HDR=Yes;FMT=Delimited';Data Source=" + HttpContext.Current.Server.MapPath("/System/SaleList/"))
{
string sql_select = "select * from [" + this.FileName + "]";
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter();
da.SelectCommand = new System.Data.OleDb.OleDbCommand(sql_select, conn);
DataSet ds = new DataSet();
// Read the First line of File to know the header
string[] lines = System.IO.File.ReadAllLines(HttpContext.Current.Server.MapPath("/System/SaleList/") + FileName);
DataTable mdt=new DataTable("ListData");
for (int i = 1; i < lines.Length; i++)
{
string[] sep=lines[i].Split(',');
foreach (var item in sep)
{
mdt.Rows.Add(sep);
}
}
string header = "";
if (lines.Length > 0)
header = lines[0];
string[] headers = header.Split(',');
ds.Tables.Add(mdt);
CreateSchema(headers, FileName);
da.Fill(ds, "ListData");
DataTable dt = mdt;}
使用(System.Data.OleDb.OleDbConnection conn=new System.Data.OleDb.OleDbConnection
(“Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='text;HDR=Yes;FMT=Delimited';Data Source=“+HttpContext.Current.Server.MapPath(“/System/SaleList/”))
{
字符串sql_select=“select*from[”+this.FileName+“]”;
System.Data.OleDb.OleDbDataAdapter da=新的System.Data.OleDb.OleDbDataAdapter();
da.SelectCommand=new System.Data.OleDb.OleDbCommand(sql\U select,conn);
数据集ds=新数据集();
//读取文件的第一行以了解标题
string[]lines=System.IO.File.ReadAllLines(HttpContext.Current.Server.MapPath(“/System/SaleList/”)+FileName);
DataTable mdt=新的DataTable(“ListData”);
对于(int i=1;i0)
标题=行[0];
string[]headers=header.Split(',');
ds.Tables.Add(mdt);
CreateSchema(标题、文件名);
da.填写(ds,“列表数据”);
数据表dt=mdt;}
我没有调试它。我希望没有问题,但如果有我在这里为你
非常感谢我得到了相同的OleDB,缺少数据字符的问题,请参见此处: 字符丢失,因为Microsoft.Jet.OLEDB.4.0驱动程序 尝试猜测列数据类型。在我的示例中,它正在处理 数据为十六进制而非字母数字 有问题的oledbProviderString:
oledbProviderString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"
{0}\";Extended Properties=\"Text;HDR=No;FMT=Delimited\"";
为了解决这个问题,我添加了TypeGuessRows=0
oledbProviderString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"
{0}\";Extended Properties=\"Text;HDR=No;FMT=Delimited;TypeGuessRows=0\"";
复制:
oledbProviderString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"
{0}\";Extended Properties=\"Text;HDR=No;FMT=Delimited\"";
使用以下内容创建Book1.csv文件:
KU88、G6、CCKU88,F7,抄送 如上图所示,逐步完成此代码
private void button1_Click(object sender, EventArgs e)
{
string folder = @"G:\Developers\Folder";
ReproProblem(folder);
}
static string oledbProviderString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"{0}\";Extended Properties=\"Text;HDR=No;FMT=Delimited\"";
private void ReproProblem(string folderPath)
{
using (OleDbConnection oledbConnection = new OleDbConnection(string.Format(oledbProviderString, folderPath)))
{
string sqlStatement = "Select * from [Book1.csv]";
//open the connection
oledbConnection.Open();
//Create an OleDbDataAdapter for our connection
OleDbDataAdapter adapter = new OleDbDataAdapter(sqlStatement, oledbConnection);
//Create a DataTable and fill it with data
DataTable table = new DataTable();
adapter.Fill(table);
//close the connection
oledbConnection.Close();
}
}
这看起来像是一个包含私人信息的真实文件。我从问题中删除了它,但您应该删除源文件。Sumit Gupta您有办法调试失败的任何文件吗?是的,我可以使用Visual Studio或您希望我调试的任何工具。但我不确定如何调试它。我的数据集显示所有记录都已读取exc请接受只缺少第一个字符的一条记录。@LarsTech,谢谢,我只是觉得有人想查看该文件,因此我上传了它。@SumitGupta可能会有所帮助!我做了所有这些,事实上,我尝试将文件从Ansi更改为Unicode,或从visa更改为Unicode,正如我所说的,当我更改上面任何人的问题行顺序时,它将解决该行问题,但s直到给出下一个错误行的问题。我认为这是库中缓冲区计数的问题。。可能。@SumitGupta我不认为您应该尝试混淆编码,因为这会导致更多问题。正如Joe建议的那样,如果您的行用CR/LF组合分隔,请使用十六进制编辑器检查行值
0D0A
然后直接检查后面的字符。我确实在HEX Editor中打开了该文件,其中有OD作为换行符,并且在整个文件中都是一致的。没有特殊/不可打印的字符等@SumitGupta,因此您的文件包含OD(CR)仅当您在提供程序字符串中使用FMT=Delimited
时,这可能是您的问题。Delimited用于“,”划界,而不是换行。此外,我们所有文件的来源都是相同的计算机和相同的Excel安装。正如您所了解的,是自动化系统,我们每天获得10-15个CSV,这些CSV中有200-70K记录,所有解析都很好,只有一些4-5个CSV有这个问题,即使我们将OD更改为OA或ODOA,在任何情况下,它仍然给出相同的结果问题。我已经在使用ODBC文本驱动程序,但这三种驱动程序在数据读取时都会出现相同的错误。如果要在CSV文件中修复G7和F7,请使用引号将其括起来,例如KU88,“G7”,CC
well