DataTable.Select抛出EvaluateException:无法对System.Double和System.String执行'='操作

时间:2016-01-15 18:46:40

标签: c# sql-server excel

我将多个电子表格中的数据导入到单个数据库表中。

首先,我已将整个excel文件加载到数据集中,1页= 1表。然后我循环遍历所有页面并将列添加到新组合表中。最后,我将获取每一行,在其他页面中找到相应的行,并将数据复制到新表中的新行中。我需要使用3列的组合来执行此匹配:'Brand','Model'和'Yr'。这是最后一步的循环。

//Add Data
foreach (DataRow drBase in tableSet.Tables[0].Rows)
{               
    List<DataRow> drSelect = new List<DataRow>(); //selected rows for specific bike
    foreach(DataTable dt in tableSet.Tables)
    {
        string expression="";
        foreach (string colName in joiningCols)
        {
            if (drBase[colName].ToString() == "") break;
            if (!string.IsNullOrWhiteSpace(expression))
            {
                expression += " and ";
            }

            expression += string.Format("{0} = '{1}'",colName, drBase[colName].ToString().Trim());
        }
        DataRow[] temp= { };
        if (!string.IsNullOrWhiteSpace(expression))
        {
        temp = dt.Select(expression);   //This is the line throwing the exception                     
        }

        if (temp.Length == 1)
        {
            drSelect.Add(temp[0]);
            //Debug.Print(string.Format("Match found {0} on {1}", expression, dt.TableName));
        }
        else
        {
            Debug.Print(string.Format("Incorrect number of matches ({2}) to <{1}> on Table[{0}]", dt.TableName, expression, temp.Length));
            continue;
        }
    }

    if (drSelect.Count == 2)
    {
        DataRow current = resultTable.NewRow();

        for (int t = 0; t < tableSet.Tables.Count; t++)
        {
            foreach (DataColumn c in tableSet.Tables[t].Columns)
            current[c.ColumnName] = drSelect[t][c.ColumnName];
        }

        resultTable.Rows.Add(current);
    }                
}

例外是:

EvaluateException was unhandled
An unhandled exception of type 'System.Data.EvaluateException' occurred in System.Data.dll

Additional information: Cannot perform '=' operation on System.Double and System.String.

异常期间'表达式'的值为“Brand ='BMW'且Yr ='1997-2000'且Model ='F 650'”

错误和我的研究表明,我应该将所有值都包含在字符串中,我已经完成了。 excel中的所有列都不使用特殊格式,因此所有列都应默认为文本。唯一可能只包含数字的列是年份,但由于它在停止之前能够进行多次迭代,因此我不相信错误指向另一行。

经过一些测试后,我将表达式分解为部分(A,B和C),它只在A和C上选择时崩溃(“Brand ='BMW'和Yr ='1997-2000'”)我逐个选择每个条款。

我错过了什么?它试图比较哪个双倍?

3 个答案:

答案 0 :(得分:0)

&#34; Excel文件&#34;

将所有内容视为字符串。我将我的结果放入一个简单的类中,使用&#34; String&#34;属性是可设置的...然后有一个相应的&#34; get&#34;具有正确数据类型的属性。 然后我可以对它运行查询/过滤器。

public class ExcelImportRow
{
    public string SalaryString { get; set; }

    /* if zero is ok */
    public double Salary
    {
        get
        {
            double returnValue = 0.00D;

            if (!string.IsNullOrEmpty(this.SalaryString))
            {
                double.TryParse(this.SalaryString, out returnValue);
            }

            return returnValue;
        }
    }

    public string TaxRateString { get; set; }

    /* if zero is not ok */
    public decimal? TaxRate
    {
        get
        {
            decimal? returnValue = null;

            if (!string.IsNullOrEmpty(this.TaxRateString))
            {
                decimal tryParseResult;
                if (decimal.TryParse(this.TaxRateString, out tryParseResult))
                {
                    returnValue = tryParseResult;
                }
            }

            return returnValue;
        }
    }
}

答案 1 :(得分:0)

尝试

"Yr >= 1997 and Yr =< 2000"

你还在打“猜数据类型”的战斗。

我仍然建议转换为ICollection<MyHolderObject>

答案 2 :(得分:0)

Excel不是数据库。在Excel中,任何工作表单元格都可以包含任何类型的数据。

我不熟悉Excel Data Reader,但它可能使用与Excel ODBC / OLE驱动程序相同的模糊逻辑,即:有一个RowsToScan参数告诉驱动程序有多少非标题行它应扫描到猜测每列的数据类型,默认为1行。

参考:Excel ODBC Driver May Determine Wrong Data Type

您的Excel文件可能发生的事情是前几行包含Yr列中的数字数据,因此Excel数据读取器将Yr数据类型推断为十进制(并且它/其他设置为DataTable的Yr列上的数据类型)。当你到达包含&#39; 1997-2000&#39;您的异常:DataTable [Yr]列的类型为Decimal,您的比较值的类型为String。