C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: DateTimePickerを日付/時刻型へ


(過去ログ 80 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■47695 / inTopicNo.1)  DateTimePickerを日付/時刻型へ
  
□投稿者/ QT (1回)-(2010/03/11(Thu) 14:56:04)

分類:[VB.NET/VB2005 以降] 

質問させていただきます。

DatetimePickerで指定された日付をAccessの日付/時刻型にUPDATEしたいのですが、どうしても1899/12/29もしくは0:00:00になってしまいます。
フォーム上に配置されたBtn_Reg押下でUPDATEしています。

Public Class clsDateReg
Private DtpDate As Date = Datetime.Now.Date

Private Sub DateTimePicker_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Dtp_Date.ValueChanged
DtpDate = Dtp_Date.Value.Date
End Sub

Private Sub Btn_Reg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Reg.Click
Dim Cmd as New OleDb.OleDbCommand

Cmd.Connection = Con
Cmd.CommandString = "PARAMETERS @DtpDate Date, @RegID Integer; UPDATE HogeTable SET Reg_Date = @DtpDate WHERE ID = @RegID"
Cmd.Parameters.Add("@DtpDate",GetType(Date)).Value=DtpDate
Cmd.Parameters.Add("@RegID",GetType(Integer)).Value= Hoge

Try
Cmd.ExecuteNonQuery()
Catch ex As Exeption
エラーメッセージ
Finally
Cmd.Dispose
End Try
End Sub
End Class

としていますが、ブレークポイントで確認してみたところ、パラメータには値が入っていることが確認できました。
が、実際に反映されるのは1899/12/29もしくは0:00:00です。

よろしくお願いします。

引用返信 編集キー/
■47697 / inTopicNo.2)  Re[1]: DateTimePickerを日付/時刻型へ
□投稿者/ QT (2回)-(2010/03/11(Thu) 15:03:44)
記載を間違えました。

Cmd.Parameters.Add("@DtpDate",GetType(Date)).Value=DtpDate
Cmd.Parameters.Add("@RegID",GetType(Integer)).Value= Hoge

ではなく

Cmd.Parameters.Add("@DtpDate",OleDb.OleDbType.Date).Value=DtpDate
Cmd.Parameters.Add("@RegID",OleDb.OleDbType.Integer).Value= Hoge

です。
引用返信 編集キー/
■47698 / inTopicNo.3)  Re[1]: DateTimePickerを日付/時刻型へ
□投稿者/ 魔界の仮面弁士 (1545回)-(2010/03/11(Thu) 15:18:15)
No47695 (QT さん) に返信
> Private DtpDate As Date = Datetime.Now.Date
  Private DtpDate As Date = Today でも可ですね。

>   Cmd.CommandString = "PARAMETERS @DtpDate Date, @RegID Integer; UPDATE HogeTable SET Reg_Date = @DtpDate WHERE ID = @RegID"
.CommandText では無く?

>   Cmd.Parameters.Add("@DtpDate",GetType(Date)).Value=DtpDate
.Add(String, Object) も利用可能ですが、できる限り
.Add(String, OleDbType) を利用するようにしてください。

すなわち、
 Cmd.Parameters.Add("@DtpDate", OleDb.OleDbType.Date).Value = DtpDate
です。


> Catch ex As Exeption
Exeption ではなく
Exception ですよね。


> 実際に反映されるのは1899/12/29もしくは0:00:00です。
提示されたサンプル中の SQL の内容は、実際に使っているものと一字一句違わず同じ内容ですか?

引用返信 編集キー/
■47699 / inTopicNo.4)  Re[2]: DateTimePickerを日付/時刻型へ
□投稿者/ QT (3回)-(2010/03/11(Thu) 15:26:38)
No47698 (魔界の仮面弁士 さん) に返信
> ■No47695 (QT さん) に返信
>>Private DtpDate As Date = Datetime.Now.Date
> Private DtpDate As Date = Today でも可ですね。
>
>> Cmd.CommandString = "PARAMETERS @DtpDate Date, @RegID Integer; UPDATE HogeTable SET Reg_Date = @DtpDate WHERE ID = @RegID"
> .CommandText では無く?
>
>> Cmd.Parameters.Add("@DtpDate",GetType(Date)).Value=DtpDate
> .Add(String, Object) も利用可能ですが、できる限り
> .Add(String, OleDbType) を利用するようにしてください。
>
> すなわち、
>  Cmd.Parameters.Add("@DtpDate", OleDb.OleDbType.Date).Value = DtpDate
> です。
>
>
>>Catch ex As Exeption
> Exeption ではなく
> Exception ですよね。
>
>
>>実際に反映されるのは1899/12/29もしくは0:00:00です。
> 提示されたサンプル中の SQL の内容は、実際に使っているものと一字一句違わず同じ内容ですか?

間違いが多く申し訳ないです。ご指摘の通り訂正させていただきます。

SQLは他にもフィールドがあるので、実際とは違いますが問題の部分を抜き出すと上記の通りとなります。

引用返信 編集キー/
■47700 / inTopicNo.5)  (削除)
□投稿者/ -(2010/03/11(Thu) 15:45:51)
この記事は(投稿者)削除されました
引用返信 編集キー/
■47701 / inTopicNo.6)  Re[4]: DateTimePickerを日付/時刻型へ
□投稿者/ QT (4回)-(2010/03/11(Thu) 15:50:15)
No47700 (魔界の仮面弁士 さん) に返信
> ■No47699 (QT さん) に返信
>>間違いが多く申し訳ないです。ご指摘の通り訂正させていただきます。
> とはいえ、本筋は特に間違っていませんでしたよ。
> 最初のサンプルそのままでも、正しく更新できましたし。
>
>
>>SQLは他にもフィールドがあるので、実際とは違いますが
> 質問時にそれは避けましょう。問題の切り分けが難しくなってしまいます。
>
> どこかに見落としがあるといけませんので、
> テーブル名/列名などの定義も、今回提示したサンプルとすべて同じにして、
> 先のコードをもう一度実行してみてください。
>
>
> >>>実際に反映されるのは1899/12/29もしくは0:00:00です。
> これも妙なんですよね…。
>
> その値だと、数値的には -1 or 0 が渡されたことになっていますので、多分、どこかの箇所で
> 日付のかわりに YES or NO (あるいは TRUE or FALSE)が渡されているものと予想されます。
> (YES/NO 型の内部値は -1 / 0 です)
>
>
> ちなみに、DATE 型の内部値は以下の通り。
>
>  −2.00 … 1899/12/28 00:00:00
>
>  −1.75 … 1899/12/29 18:00:00
>  −1.50 … 1899/12/29 12:00:00
>  −1.20 … 1899/12/29 12:00:00
>  −1.00 … 1899/12/29 00:00:00
>
>  −0.75 … 1899/12/30 18:00:00
>  −0.50 … 1899/12/30 12:00:00
>  −0.25 … 1899/12/30 06:00:00
>   0.00 … 1899/12/30 00:00:00
>  ±0.25 … 1899/12/30 06:00:00
>  ±0.50 … 1899/12/30 12:00:00
>  ±0.75 … 1899/12/30 18:00:00
>
>  +1.00 … 1899/12/31 00:00:00
>  +1.25 … 1899/12/31 06:00:00
>  +1.50 … 1899/12/31 12:00:00
>  +1.75 … 1899/12/31 18:00:00
>
>  +2.00 … 1900/01/01 00:00:00

なるほど。気づいたのですが、Yes/No型の列を追加してから妙なことになっている気がします。
ただ、SQLにPARAMETERS句を使用しているのでずれたりすることは考えにくいのですが、そういうことは起こり得るのでしょうか?
引用返信 編集キー/
■47702 / inTopicNo.7)  Re[3]: DateTimePickerを日付/時刻型へ
□投稿者/ 魔界の仮面弁士 (1547回)-(2010/03/11(Thu) 15:53:54)
No47699 (QT さん) に返信
> 間違いが多く申し訳ないです。ご指摘の通り訂正させていただきます。
とはいえ、本筋は特に間違っていませんでしたよ。
最初のサンプルそのままでも、正しく更新できましたし。


> SQLは他にもフィールドがあるので、実際とは違いますが
質問時にそれは避けましょう。問題の切り分けが難しくなってしまいます。

どこかに見落としがあるといけませんので、
テーブル名/列名などの定義も、今回提示したサンプルとすべて同じにして、
先のコードをもう一度実行してみてください。


>>>実際に反映されるのは1899/12/29もしくは0:00:00です。
これも妙なんですよね…。

その値だと、数値的には -1 or 0 が渡されたことになっていますので、多分、どこかの箇所で
日付のかわりに YES or NO (あるいは TRUE or FALSE)が渡されているものと予想されます。
(YES/NO 型の内部値は -1 / 0 です)


ちなみに、DATE 型の内部値は以下の通り。

 −2.00 … 1899/12/28 00:00:00

 −1.75 … 1899/12/29 18:00:00
 −1.50 … 1899/12/29 12:00:00
 −1.25 … 1899/12/29 06:00:00
 −1.00 … 1899/12/29 00:00:00

 −0.75 … 1899/12/30 18:00:00
 −0.50 … 1899/12/30 12:00:00
 −0.25 … 1899/12/30 06:00:00
  0.00 … 1899/12/30 00:00:00
 ±0.25 … 1899/12/30 06:00:00
 ±0.50 … 1899/12/30 12:00:00
 ±0.75 … 1899/12/30 18:00:00

 +1.00 … 1899/12/31 00:00:00
 +1.25 … 1899/12/31 06:00:00
 +1.50 … 1899/12/31 12:00:00
 +1.75 … 1899/12/31 18:00:00

 +2.00 … 1900/01/01 00:00:00

引用返信 編集キー/
■47703 / inTopicNo.8)  Re[5]: DateTimePickerを日付/時刻型へ
□投稿者/ 魔界の仮面弁士 (1548回)-(2010/03/11(Thu) 15:56:31)
No47701 (QT さん) に返信
> なるほど。気づいたのですが、Yes/No型の列を追加してから妙なことになっている気がします。
> ただ、SQLにPARAMETERS句を使用しているのでずれたりすることは考えにくいのですが、
> そういうことは起こり得るのでしょうか?

PARAMETERS 句以外の箇所に問題がある可能性もありますよ。

たとえば、"No" という列名が存在していた場合、SQL の記述ミスで、
それが Yes/No 型の NO リテラルと誤解されてしまい、
FALSE という値として処理されてしまうとか。
引用返信 編集キー/
■47704 / inTopicNo.9)  Re[6]: DateTimePickerを日付/時刻型へ
□投稿者/ QT (5回)-(2010/03/11(Thu) 16:08:17)
No47703 (魔界の仮面弁士 さん) に返信
> ■No47701 (QT さん) に返信
>>なるほど。気づいたのですが、Yes/No型の列を追加してから妙なことになっている気がします。
>>ただ、SQLにPARAMETERS句を使用しているのでずれたりすることは考えにくいのですが、
>>そういうことは起こり得るのでしょうか?
>
> PARAMETERS 句以外の箇所に問題がある可能性もありますよ。
>
> たとえば、"No" という列名が存在していた場合、SQL の記述ミスで、
> それが Yes/No 型の NO リテラルと誤解されてしまい、
> FALSE という値として処理されてしまうとか。

ありがとうございます。
調べてみたところ、PARAMETERS句の各パラメータの並びとコマンドにパラメータを追加する順を同じにしたところ正常に登録されるようになりました。

並びを同じにしなければならないのでしたら、PARAMETERS句を使っている意味もない気がします・・・。
引用返信 編集キー/
■47705 / inTopicNo.10)  Re[7]: DateTimePickerを日付/時刻型へ
□投稿者/ みきぬ (816回)-(2010/03/11(Thu) 16:29:24)
> 並びを同じにしなければならないのでしたら、PARAMETERS句を使っている意味もない気がします・・・。

パラメータ名を認識してくれる時点で意味ありまくりな気がするけど。
同じパラメータが複数箇所にあらわれる場合とか、"?" だけじゃ発狂するよ。
引用返信 編集キー/
■47706 / inTopicNo.11)  Re[7]: DateTimePickerを日付/時刻型へ
□投稿者/ 魔界の仮面弁士 (1549回)-(2010/03/11(Thu) 16:35:20)
No47704 (QT さん) に返信
> 調べてみたところ、
DateTimePickerは関係無かったみたいですね。(^^;

> PARAMETERS句の各パラメータの並びとコマンドにパラメータを追加する順を
> 同じにしたところ正常に登録されるようになりました。
> 並びを同じにしなければならないのでしたら、PARAMETERS句を使っている意味もない気がします・・・。

同じ並びになっていない状況というのは、
 PARAMETERS @変数1 型1, @変数2 型2, @変数3 型3;
というパラメータークエリーに対して、
 Cmd.Parameters.Add("@変数1", 型1)
 Cmd.Parameters.Add("@変数3", 型3)
 Cmd.Parameters.Add("@変数2", 型2)
のような登録を行っていた、という意味でしょうか?

それとも、.Parameters.Add の順番は PARAMETERS 句と一致させていたけれども、
 PARAMETERS @変数1 型1, @変数2 型2, @変数3 型3;
 UPDATE foo SET Col1 = @変数3, Col2 = @変数1 WHERE Col3 = 変数2;
のように、DML 中での登場順と PARAMETERS 句での記述順が異なっていたという意味でしょうか?


前者の意味だとしたら、それはそういう仕様です。

DAO や ADO(Jet OLE DB Provider)で処理した場合には、パラメータ名を自動取得できるのですが、
ADO.NET 経由だと、パラメータ名を正しい順番で手動管理しなければなりません。

引用返信 編集キー/
■47707 / inTopicNo.12)  Re[8]: DateTimePickerを日付/時刻型へ
□投稿者/ QT (6回)-(2010/03/11(Thu) 16:46:26)
No47706 (魔界の仮面弁士 さん) に返信
> ■No47704 (QT さん) に返信
>>調べてみたところ、
> DateTimePickerは関係無かったみたいですね。(^^;
>
>>PARAMETERS句の各パラメータの並びとコマンドにパラメータを追加する順を
>>同じにしたところ正常に登録されるようになりました。
>>並びを同じにしなければならないのでしたら、PARAMETERS句を使っている意味もない気がします・・・。
>
> 同じ並びになっていない状況というのは、
>  PARAMETERS @変数1 型1, @変数2 型2, @変数3 型3;
> というパラメータークエリーに対して、
>  Cmd.Parameters.Add("@変数1", 型1)
>  Cmd.Parameters.Add("@変数3", 型3)
>  Cmd.Parameters.Add("@変数2", 型2)
> のような登録を行っていた、という意味でしょうか?
>
> それとも、.Parameters.Add の順番は PARAMETERS 句と一致させていたけれども、
>  PARAMETERS @変数1 型1, @変数2 型2, @変数3 型3;
>  UPDATE foo SET Col1 = @変数3, Col2 = @変数1 WHERE Col3 = 変数2;
> のように、DML 中での登場順と PARAMETERS 句での記述順が異なっていたという意味でしょうか?
>
>
> 前者の意味だとしたら、それはそういう仕様です。
>
> DAO や ADO(Jet OLE DB Provider)で処理した場合には、パラメータ名を自動取得できるのですが、
> ADO.NET 経由だと、パラメータ名を正しい順番で手動管理しなければなりません。

前者の方です。
そういう仕様なんですね…。勉強になりました。

教えて頂きありがとうございました。
またお伺いすることもあるかと思いますのでよろしくお願い致します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -