- PR -

日付パラメータの受け渡しについて(VC++.NET、ODB.NET)

投稿者投稿内容
2litre
会議室デビュー日: 2005/12/07
投稿数: 5
投稿日時: 2005-12-07 11:50
VC++.NETでODB.NETをつかって開発しています。

DBからVARCHAR型の日時を取得したものを、
他テーブルにDATE型で登録したいのですが、
SQL発行時に下記のエラーとなってしまいます。
『System.InvalidOperationException' のハンドルされていない例外が oracle.dataaccess.dll で発生しました。
追加情報 : オブジェクトの現在の状態に問題があるため、操作は有効ではありません。』

日付文字列("yyyyymmdd")をDate型(yy-mm-dd)に変換する必要があると思うのですが、
方法がわかりません。

どなたかご存知の方、ご教授下さい。
よろしくお願いします。

---------------------------------------------------
ソース
---------------------------------------------------
OracleCommand *cmdLastDate = new OracleCommand();
cmdLastDate->Connection = Cnn;
cmdLastDate->CommandText = "SELECT EE_LD FROM T_ET";

OracleDataReader* rLastDate = cmdLastDate->ExecuteReader();

if(rLastDate->Read() == true){
String* etcerpDate = (rLastDate->GetValue(0))->ToString();

rLastDate->Dispose();
rLastDate->Close();
cmdLastDate->Dispose();

OracleCommand *cmdStsSet = new OracleCommand();

cmdStsSet->CommandText = "UPDATE T_ETCERPROCST SET EE_DATE=:1";

OracleParameter *paraStsSet1
= cmdStsSet->Parameters->Add("etcerpDate", etcerpDate);

int iStsSet = cmdStsSet->ExecuteNonQuery(); ←エラー!
}
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-07 12:27
「オブジェクトの状態が〜〜〜」っていうメッセージは
Dispose(破棄)されたオブジェクトに対して何かの操作をしたときに出たのを覚えています

この場合は rLastDate を Dispose した後に Close しているからかな?

[ メッセージ編集済み 編集者: かるあ 編集日時 2005-12-07 12:37 ]

[ メッセージ編集済み 編集者: かるあ 編集日時 2005-12-07 12:37 ]
2litre
会議室デビュー日: 2005/12/07
投稿数: 5
投稿日時: 2005-12-07 13:23
ご回答ありがとうございます。

DisposeとCloseを処理の最後で行うようにしてみましたが、
同じエラーがでました。。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-07 13:29
こんにちは。

DateTime.Parse() で日付を作ります。(もちろん例外処理は行ってください。)
それを Parameter に渡すとよいです。
Parameter に Add するときは、型を明示的に指定してやると尚よいでしょう。

_________________
囚人のジレンマな日々
2litre
会議室デビュー日: 2005/12/07
投稿数: 5
投稿日時: 2005-12-07 21:38
ご回答ありがとうございます。

DateTimeを使うように修正してみたところ、
Parseのところでエラーとなってしまいました。
『'System.FormatException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : 文字列は有効な DateTime ではありませんでした。』

取得方法が間違っているのでしょうか?

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

String* etcerpDate = (rLastDate->GetValue(0))->ToString();
DateTime data = System::DateTime::Parse(etcerpDate);

OracleCommand *cmdStsSet = new OracleCommand();

cmdStsSet->CommandText = "UPDATE T_ETCERPROCST SET EE_DATE=:1";

OracleParameter *paraStsSet1
= cmdStsSet->Parameters->Add("etcerpDate", data.ToString());
2litre
会議室デビュー日: 2005/12/07
投稿数: 5
投稿日時: 2005-12-07 21:42
また、先ほどのコードの先頭2行を以下のようにしてみたところ

DateTime etcerpDate = rLastDate->GetDateTime(0);

こんなエラーがでました。
『'System.InvalidCastException' のハンドルされていない例外が oracle.dataaccess.dll で発生しました。
追加情報 : 指定されたキャストは有効ではありません。』
DateTime型からDateTime型への受け渡しのように見えるのですが、
間違っているのでしょうか?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-07 23:53
EE_LD 列は varchar なんですよね?

コード:
rLastDate->GetValue(0)


↑これでどんな値が取得できているか見ましたか?

コード:
rLastDate->GetDateTime(0);


↑varchar であり、文字列なら無理です。


コード:
rLastDate->GetString(0);


↑これを使ってください。そして取得できた値を見てください。
それをつかって、DateTime.Parse() です。日付の形式の文字列しか変換できません。
Framework はかなり頑張ってくれます。「日付文字列("yyyyymmdd")」なら楽勝です。正確には yyyyMMdd ?

コード:
rLastDate->GetValue(0)


↑これでもいいですが、その場合は
コード:
(string)rLastDate->GetValue(0)


↑こうして下さい。文字列でないなら、例外を投げてくれます。ToString() を使えば、文字列でないのに文字列にしちゃいます。駄目ですよね。

例外がスローされたら、そのメッセージの通りです。それに従いましょう。
_________________
囚人のジレンマな日々
2litre
会議室デビュー日: 2005/12/07
投稿数: 5
投稿日時: 2005-12-08 10:54
EE_LD 列は varchar です。

String* etcerpDate = rLastDate->GetString(0);

として日付を取得したところ、値は"yyyyMMdd"でした。
ですがParseのところで以下のエラーとなってしまいました。
GetStringで取得した値をそのままParseの引数にしてはいけないのでしょうか?

System::DateTime date =System::DateTime::Parse(etcerpDate); ←エラー!

『'System.FormatException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : 文字列は有効な DateTime ではありませんでした。』

[ メッセージ編集済み 編集者: 2litre 編集日時 2005-12-08 10:55 ]

[ メッセージ編集済み 編集者: 2litre 編集日時 2005-12-08 10:56 ]

スキルアップ/キャリアアップ(JOB@IT)