0

エクセルでの作業はいかがでしたか

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」です。

4

3 に答える 3

2

同様の問題がありました。これがあなたの質問に適用された私の修正です:

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

「値」を取得することにより、それを使って何かをしようとするまで、引っ張っているものの詳細に対処する必要はありません。

もちろん、私の問題は、すべてを文字列に変換する必要があるという点で、あなたの問題とは少し異なりました。ただし、もちろん値が変換可能な場合、 Convert.ToDecimal は文字列で機能するため、理論的にはこのアプローチは引き続き機能するはずです。

于 2013-04-11T12:13:17.987 に答える
1

このコードを追加できます

if(myReader.GetString(0) != null)
{
    decimal LTLPrice = Decimal.Parse(myReader.GetString(0).Replace(",",".").Trim());
}   
于 2012-09-24T18:54:08.077 に答える
0

問題が見つかりました。oledbを介してExcelに数値をテキストとして保存しています。Excelでxlsファイルを開いても読み取ることができ、Excelはすべてを正常に計算しますが、oledbはExcelから正しいdouble値を取得できません。テキストとして保存された数値から計算されます。ここで、doubleをc#に格納して数値として優れたものにする方法を見つけるために残しました。そうすれば、問題は解決されます。

于 2012-09-25T06:40:51.257 に答える