使用OleDbCommand时,指定的强制转换无效

时间:2012-09-24 18:41:51

标签: c# excel oledb

如何使用excel

decimal LTLPrice = Decimal.Parse(sheet.get_Range("H27").Value.ToString());
decimal mathLTLPrice = Math.Round(LTLPrice, 2);
sheet.get_Range("C29").Value = SumToTextFormatProvider.SumToText(mathLTLPrice, "Lt", "ct");

OleDb的想象力如何?

myCommand = new OleDbCommand("SELECT * FROM [Sheet1$H27:H27]", MyConnection);
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
    decimal LTLPrice = Decimal.Parse(myReader.GetString(0));
    decimal mathLTLPrice = Math.Round(LTLPrice, 2);
    myCommand = new OleDbCommand("UPDATE [Sheet1$C29:C29] SET F1='" + SumToTextFormatProvider.SumToText(mathLTLPrice, "Lt", "ct") + "'", MyConnection);
    myCommand.ExecuteNonQuery();
}
myReader.Close();

它是怎么回事

System.InvalidCastException: Specified cast is not valid.
at System.Data.OleDb.ColumnBinding.ValueString()
at System.Data.OleDb.OleDbDataReader.GetString(Int32 ordinal)
at Trains.invoiceForm.invoiceGenerateXls_Click(Object sender, EventArgs e) in D:\Users\Nullified\Documents\Visual Studio 2010\Projects\Trains\Trains\invoiceForm.cs:line 592

错误在此行

decimal LTLPrice = Decimal.Parse(myReader.GetString(0));

我尝试了GetInt32 / GetDecimal但没有结果。 :(

更新

使用GetDouble我没有错误,但myReader返回0,然后在excel中它是“3,49”

3 个答案:

答案 0 :(得分:2)

我有类似的问题,这是我的修正应用于您的问题:

    decimal LTLPrice = Convert.ToDecimal(myReader.GetValue(0).ToString());

通过抓住“价值”,您不必处理有关您的内容的详细信息,直到您尝试使用它。

当然我的问题与你的问题有点不同,因为我只需将所有内容转换为字符串。然而,这种方法应该仍然适用于你,因为Convert.ToDecimal将对字符串起作用,当然值是可转换的。

答案 1 :(得分:1)

您可以添加此代码

if(myReader.GetString(0) != null)
{
    decimal LTLPrice = Decimal.Parse(myReader.GetString(0).Replace(",",".").Trim());
}   

答案 2 :(得分:0)

发现问题,我通过oledb在excel中存储数字作为文本,尽管如果我们在excel中打开xls文件我们仍然可以读取它,并且excel正常计算所有内容,oledb无法从excel获得正确的double值如果它是根据存储为文本的数字计算的。 现在只剩下找到如何将c#中的double存储为excel作为数字,问题将得到解决。