我将多个电子表格中的数据导入到单个数据库表中。
首先,我已将整个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'”)我逐个选择每个条款。
我错过了什么?它试图比较哪个双倍?
答案 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。