Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OleDB,丢失数据的第一个字符_C#_Asp.net_Csv_Oledb - Fatal编程技术网

C# OleDB,丢失数据的第一个字符

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

我维护的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"];
}
除了提到的事情,这段代码运行良好。我剪切了一些不相关的部分,所以复制粘贴可能不起作用

编辑:更多信息

  • 我尝试将ODBC与Microsoft文本驱动程序结合使用,然后将ACE驱动程序与OleDB结合使用。结果与所有三个驱动相同

  • 如果我将问题记录与前一行交换,则这些行的读取效果相当好,直到下一个问题行(如果原始文件中有多行出现问题),如果这些是唯一的问题行,则可以正常工作

  • 所以从上面看,似乎有什么东西分散了字符计数器的注意力,但我如何确保它顺利工作仍然是一个小测验


    编辑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、CC
    KU88,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