【问题标题】:Comparing sql field with excel field in LINQ比较 LINQ 中的 sql 字段和 excel 字段
【发布时间】:2012-12-05 21:35:07
【问题描述】:

所以我有一个 excel sheet 表和一个 mssql 表,这两个表正在使用 LINQ 连接到 excel 表第 0 列(第一个)和 mssql 列 textfield2。 我在加入字母数字值时遇到的问题,这似乎不起作用。当值是数字时,它确实有效。

        var adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", excconnectionstring);
        var adapter2 = new SqlDataAdapter("SELECT * FROM Table1", sqlconnectionstring);

        var ds = new DataSet();
        adapter.Fill(ds, "excel");
        adapter2.Fill(ds, "sql");

        var excel = ds.Tables["excel"].AsEnumerable();
        var esqel = ds.Tables["sql"].AsEnumerable();

        var query = from exc in excel
                    from sql in esqel
                    where exc[0].ToString() == sql.Field<string>("textfield2")
                    select new
                    {
                        debnr = sql.Field<string>("debnr"),
                        bedrag = double.Parse(exc[5].ToString())/100,
                        description = DateTime.Parse(exc[7].ToString(), new CultureInfo("nl-NL")).ToString("MMM yyyy"),
                        text1 = exc[0].ToString(),
                        projectno = sql.Field<string>("textfield1"),
                        central = sql.Field<string>("CentralizationAccount").Trim()
                    };

编辑:当我在 Excel 工作表中排序值并在顶部显示字母数字值时,似乎字母数字确实有效。但后来我遇到的问题是它不适用于数值..

【问题讨论】:

  • 旁注:在 Linq-To-Objects 中链接表时使用 Join instead of Where
  • 我无法重现;连接适用于两个表中的代码和字符串。我猜是少了点什么。
  • 您必须确保将第一列中的数值转换为工作表本身中的文本。 OleDB 从前几行推断 Excel 列的类型。与类型不匹配的值作为 null 传递。另外,请注意前导和尾随空格。
  • OleDBDataAdaptor 根据数据开头的短样本设置列的类型 - 如果您的早期行都是整数,那么它将设置为整数并在遇到时吐出虚拟对象一个字符串。有一种方法可以强制将类型设置为字符串,但我不记得是多么随意,但如果你按照这些思路进行一些研究,你肯定会找到它。当你得到答案后,为我们发布!
  • 原来如此。我能够编辑 excel 文件以使用互操作将列转换为文本并且它有效!

标签: sql linq excel


【解决方案1】:

正如其他人所说,问题的发生是由于 OleDb 根据前几行推断列类型。使用 Interop TextToColumn 我将 excel 列数据类型更改为文本。这是我用来执行此操作的代码:

        Workbook workBook = _excelApp.Workbooks.Open(Directory.GetCurrentDirectory() + "\\" + thisFileName,
            0, false, 5, "", "", false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);


        object fieldInfo = new int[1, 2] { { 1, 2 } };
        Range _range = ((Worksheet)workBook.Worksheets.get_Item("Sheet1")).UsedRange.Columns[1, Type.Missing];

        _range.TextToColumns(
 _range, XlTextParsingType.xlDelimited,
 XlTextQualifier.xlTextQualifierNone, Type.Missing,
 Type.Missing, Type.Missing, Type.Missing,
 Type.Missing, Type.Missing,
 Type.Missing,
 fieldInfo,
 Type.Missing, Type.Missing);

        _excelApp.DisplayAlerts = false;
        _excelApp.ScreenUpdating = false;
        _excelApp.Visible = false;
        _excelApp.UserControl = false;
        _excelApp.Interactive = false;

        workBook.SaveAs(Directory.GetCurrentDirectory() + "\\" + thisFileName, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing);
        workBook.Close(false, thisFileName, null);
        Marshal.ReleaseComObject(workBook);
        _excelApp.Quit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多