2012-12-05 27 views
0

所以我有一个Excel表格和一个mssql表格,并且两个正在使用LINQ在Excel表格列0(第一个)和mssql列textfield2上进行连接。 我在加入字母数字值时看到的问题似乎无法解决。当值是数字时它确实有效。在LINQ中比较sql字段和excel字段

 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工作表,顶部的一个字母数字值责令值做工作。但后来我有问题,它不能在数值上工作。

+1

侧面说明:使用['Join',而不是'Where'(http://stackoverflow.com/questions/5551264/why-is-linq-join当链接Linq-To-Objects中的表时,这要比链接快得多)。 –

+0

我不能重现那个;连接在两个表中的代码和字符串都正常工作。我想有一些缺失。 –

+1

您必须确保将第一列中的数值转换为工作表本身_中的文本。 OleDB推断来自第一对行的Excel列的类型。与该类型不匹配的值将作为空值传递。另外,观看领先和尾随空间。 –

回答

0

正如其他人所说,由于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();