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

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

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

Re[9]: Parametersが追加されているか


(過去ログ 79 を表示中)

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

■46702 / inTopicNo.1)  Parametersが追加されているか
  
□投稿者/ だい (23回)-(2010/02/09(Tue) 15:42:55)

分類:[.NET 全般] 

質問させて頂きます。

VB.netにてフォーム上にあるテキスト(Txt_hoge)に入力し、登録ボタン押下でmdbに登録します。

テキストからLostFocusした時にCmd.parameters.add("@hoge",OleDb.OleDbType.Char).Value= txt_hoge.Text
としています。

この場合、最初に入力し、登録ボタンを押すという通常の流れでしたら、問題なく動作します。

しかし、間違えて入力していしまい、再度テキストボックスを選択し、値を変えた場合は既にParatemersが追加してあるのでうまくいきません。

すでにParametersに追加してあるかチェックする方法はありますでしょうか?

----Parametersに追加してあるか確認-------------
あれば
Cmd.Parameters("@Hoge").Value="変更後の値"
なければ
Cmd.parameters.add("@hoge",OleDb.OleDbType.Char).Value= txt_hoge.Text

といった流れです。

同じようなテキストボックスが数十個あるため、入力されたもののみ登録されるようにしたいです。

よろしくお願い致します。
引用返信 編集キー/
■46704 / inTopicNo.2)  Re[1]: Parametersが追加されているか
□投稿者/ 魔界の仮面弁士 (1484回)-(2010/02/09(Tue) 15:53:04)
No46702 (だい さん) に返信
> テキストからLostFocusした時にCmd.parameters.add("@hoge",OleDb.OleDbType.Char).Value= txt_hoge.Text

Add と Value を同時に書くのではなく、OleDbParameter を一度変数に受け取ってから、
 hogeParam.Value = txt_hoge.Text
と呼び出す書き方に統一してしまえば良いのではないかと。


> すでにParametersに追加してあるかチェックする方法はありますでしょうか?
名前を持つパラメータなら、Contains メソッドで探し出せるかも知れません。

あるいは単純に For Each で Parameters を列挙していき、
該当する ParameterName を持つパラメータの有無を確認してみては如何でしょう。
引用返信 編集キー/
■46706 / inTopicNo.3)  Re[2]: Parametersが追加されているか
□投稿者/ だい (24回)-(2010/02/09(Tue) 16:04:31)
No46704 (魔界の仮面弁士 さん) に返信
> ■No46702 (だい さん) に返信
>>テキストからLostFocusした時にCmd.parameters.add("@hoge",OleDb.OleDbType.Char).Value= txt_hoge.Text
>
> Add と Value を同時に書くのではなく、OleDbParameter を一度変数に受け取ってから、
>  hogeParam.Value = txt_hoge.Text
> と呼び出す書き方に統一してしまえば良いのではないかと。
>
>
>>すでにParametersに追加してあるかチェックする方法はありますでしょうか?
> 名前を持つパラメータなら、Contains メソッドで探し出せるかも知れません。
>
> あるいは単純に For Each で Parameters を列挙していき、
> 該当する ParameterName を持つパラメータの有無を確認してみては如何でしょう。

ありがとうございます。


> Add と Value を同時に書くのではなく、OleDbParameter を一度変数に受け取ってから、
>  hogeParam.Value = txt_hoge.Text
> と呼び出す書き方に統一してしまえば良いのではないかと。
ということは事前にパラメータをすべて追加しておかなければならないということでしょうか?

そうすると、入力されていない項目にもパラメータが設定されてしまい、mdbに反映されてしまうように思うのですが…。

引用返信 編集キー/
■46709 / inTopicNo.4)  Re[3]: Parametersが追加されているか
□投稿者/ Mr.T (329回)-(2010/02/09(Tue) 17:13:33)
2010/02/09(Tue) 17:16:24 編集(投稿者)
2010/02/09(Tue) 17:14:32 編集(投稿者)

>>Add と Value を同時に書くのではなく、OleDbParameter を一度変数に受け取ってから、
>> hogeParam.Value = txt_hoge.Text
>>と呼び出す書き方に統一してしまえば良いのではないかと。
> ということは事前にパラメータをすべて追加しておかなければならないということでしょうか?
>
> そうすると、入力されていない項目にもパラメータが設定されてしまい、mdbに反映されてしまうように思うのですが…。

Containsでそのhogeのキーがなかったら
Cmd.Parameters.add("@hoge",OleDb.OleDbType.Char)
この一文を付け加えたらいいということだと思います。


引用返信 編集キー/
■46712 / inTopicNo.5)  Re[4]: Parametersが追加されているか
□投稿者/ だい (25回)-(2010/02/09(Tue) 18:05:25)
No46709 (Mr.T さん) に返信
> 2010/02/09(Tue) 17:16:24 編集(投稿者)
> 2010/02/09(Tue) 17:14:32 編集(投稿者)
>
> >>Add と Value を同時に書くのではなく、OleDbParameter を一度変数に受け取ってから、
> >> hogeParam.Value = txt_hoge.Text
> >>と呼び出す書き方に統一してしまえば良いのではないかと。
>>ということは事前にパラメータをすべて追加しておかなければならないということでしょうか?
>>
>>そうすると、入力されていない項目にもパラメータが設定されてしまい、mdbに反映されてしまうように思うのですが…。
>
> Containsでそのhogeのキーがなかったら
> Cmd.Parameters.add("@hoge",OleDb.OleDbType.Char)
> この一文を付け加えたらいいということだと思います。
>
>

ありがとうございます。

質問ばかりで恐縮ですが、
Fomr_Loadでパラメータをすべて追加し、各テキストボックスの値が変更された時パラメータの値を変更するようにしました。

Private Sub Form_Load
Cmd.Parameters.Add("@Hoge",OleDb.OleDbType.Char)
End Sub

Private Sub Txt_SyainNo_LostFocus
Cmd.Parameters("@Hoge).Value= Txt_SyainNo.Text
End Sub

しかし、実行すると、「"パラメータ名"にはにはデフォルト値はありません。」となってしまいます。
ds = new DataSet
Da = new OleDb.OleDbDataAdapter(Cmd)
Da.Fill(Ds) ←ここでエラー


パラメータの値を確すると、正常に入っています。
何が問題なのでしょうか?

ちなみにAddする際にValueを追加しても同様のエラーとなりました。
引用返信 編集キー/
■46723 / inTopicNo.6)  Re[5]: Parametersが追加されているか
□投稿者/ もりお (182回)-(2010/02/09(Tue) 19:33:11)
2010/02/09(Tue) 19:36:00 編集(投稿者)
No46712 (だい さん) に返信

> 何が問題なのでしょうか?

値のセットされていないパラメータがあるのではないでしょうか。
もう一度確認してみてはいかがでしょうか。

...

For Each parameter As OleDbParameter In Cmd.Parameters
  If parameter.Value Is Nothing Then
    MessageBox.Show(parameter.ParameterName)
  End If
Next

Da.Fill(Ds)

引用返信 編集キー/
■46729 / inTopicNo.7)  Re[6]: Parametersが追加されているか
□投稿者/ だい (26回)-(2010/02/09(Tue) 23:22:18)
No46723 (もりお さん) に返信
> 2010/02/09(Tue) 19:36:00 編集(投稿者)
>
>
> ■No46712 (だい さん) に返信
>
>>何が問題なのでしょうか?
>
> 値のセットされていないパラメータがあるのではないでしょうか。
> もう一度確認してみてはいかがでしょうか。
>
> ...
>
> For Each parameter As OleDbParameter In Cmd.Parameters
> If parameter.Value Is Nothing Then
> MessageBox.Show(parameter.ParameterName)
> End If
> Next
>
> Da.Fill(Ds)
>

Form_Loadですべての15個くらいのパラメータを追加し、最初のコマンドのうち使っているのは3つです。
その場合もすべてのパラメータに値が入っていないとだめなんでしょうか??

Private Sub Form_Load
Cmd.CommandText = "SELECT * FROM TBL WHERE HOGEA = @AAA AND HOGEB = @BBB AND HOGEC = @CCC"

Cmd.Parameters.Add("@AAA",OleDb.OleDbType.Char)
Cmd.Parameters.Add("@BBB",OleDb.OleDbType.Char)
Cmd.Parameters.Add("@CCC",OleDb.OleDbType.Char)
Cmd.Parameters.Add("@DDD",OleDb.OleDbType.Char)




Private Sub Txt_AAA_LostFocus
Cmd.Parameters("AAA").Value="HogeA"
ENd Sub

Private Sub Txt_BBB_LostFocus
Cmd.Parameters("BBB").Value="HogeB"
ENd Sub

Private Sub Txt_CCC_Lost_Focus
Cmd.Parameters("CCC").Value="HogeC"
ENd Sub

Private Sub Btn_Reg_Click
Ds = new DataSet
Da = new OleDb.OleDbCommandAdapter(Cmd)
Da.Fill(Ds)

Fillする時点で@DDDはパラメータに追加してありますが、SQL文に使用していないのでValueには値がありません。
これでもエラーになりますか?

ちなみにエラーのメッセージに出てくるのは値の入っている@AAAはデフォルト値がないと出てきます。
引用返信 編集キー/
■46735 / inTopicNo.8)  Re[7]: Parametersが追加されているか
□投稿者/ だい (27回)-(2010/02/10(Wed) 09:28:13)
No46729 (だい さん) に返信
> ■No46723 (もりお さん) に返信
>>2010/02/09(Tue) 19:36:00 編集(投稿者)
>>
>>
>>■No46712 (だい さん) に返信
>>
> >>何が問題なのでしょうか?
>>
>>値のセットされていないパラメータがあるのではないでしょうか。
>>もう一度確認してみてはいかがでしょうか。
>>
>>...
>>
>>For Each parameter As OleDbParameter In Cmd.Parameters
>> If parameter.Value Is Nothing Then
>> MessageBox.Show(parameter.ParameterName)
>> End If
>>Next
>>
>>Da.Fill(Ds)
>>
>
> Form_Loadですべての15個くらいのパラメータを追加し、最初のコマンドのうち使っているのは3つです。
> その場合もすべてのパラメータに値が入っていないとだめなんでしょうか??
>
> Private Sub Form_Load
> Cmd.CommandText = "SELECT * FROM TBL WHERE HOGEA = @AAA AND HOGEB = @BBB AND HOGEC = @CCC"
>
> Cmd.Parameters.Add("@AAA",OleDb.OleDbType.Char)
> Cmd.Parameters.Add("@BBB",OleDb.OleDbType.Char)
> Cmd.Parameters.Add("@CCC",OleDb.OleDbType.Char)
> Cmd.Parameters.Add("@DDD",OleDb.OleDbType.Char)
> ・
> ・
> ・
>
> Private Sub Txt_AAA_LostFocus
> Cmd.Parameters("AAA").Value="HogeA"
> ENd Sub
>
> Private Sub Txt_BBB_LostFocus
> Cmd.Parameters("BBB").Value="HogeB"
> ENd Sub
>
> Private Sub Txt_CCC_Lost_Focus
> Cmd.Parameters("CCC").Value="HogeC"
> ENd Sub
>
> Private Sub Btn_Reg_Click
> Ds = new DataSet
> Da = new OleDb.OleDbCommandAdapter(Cmd)
> Da.Fill(Ds)
>
> Fillする時点で@DDDはパラメータに追加してありますが、SQL文に使用していないのでValueには値がありません。
> これでもエラーになりますか?
>
> ちなみにエラーのメッセージに出てくるのは値の入っている@AAAはデフォルト値がないと出てきます。

追記です。

とりあえず使用しないパラメータを削除し、実行してみました。
"パラメータ名"にはデフォルト値はありません。というエラーはなくなりましたが、うまくFillせずデータなしで返ってきます。

パラメータに値は入っており、パラメータを使用しないで実行するとうまくいきます。


引用返信 編集キー/
■46736 / inTopicNo.9)  Re[7]: Parametersが追加されているか
□投稿者/ Mr.T (332回)-(2010/02/10(Wed) 09:32:50)
当然ながら、この場合では不必要なパラメータを追加してはいけません。

LostFocus時にいちいちパラメータ追加されてしまうと、単純な操作ミス(いったんフォーカスだけを移して他の入力欄にうつる)時もパラメータが追加されてしまいます。

パラメータを追加するのはBtn_Reg_Clickの時でよいのじゃないですか?



引用返信 編集キー/
■46738 / inTopicNo.10)  Re[8]: Parametersが追加されているか
□投稿者/ みきぬ (776回)-(2010/02/10(Wed) 09:45:03)
ところで、使っているのは OLE DB プロバイダなのかな。
だとしたら、名前つきパラメータは使えないんじゃないっけ?

処理は通ったとしてもパラメータの名前は無視されるんじゃないかしら。
たぶん Parameters に Add した順番に適応されると思うけど…大丈夫?
引用返信 編集キー/
■46740 / inTopicNo.11)  Re[8]: Parametersが追加されているか
□投稿者/ だい (28回)-(2010/02/10(Wed) 09:53:47)
No46736 (Mr.T さん) に返信
> 当然ながら、この場合では不必要なパラメータを追加してはいけません。
>
> LostFocus時にいちいちパラメータ追加されてしまうと、単純な操作ミス(いったんフォーカスだけを移して他の入力欄にうつる)時もパラメータが追加されてしまいます。
>
> パラメータを追加するのはBtn_Reg_Clickの時でよいのじゃないですか?
>
>
>

たびたびありがとうございます。

> LostFocus時にいちいちパラメータ追加されてしまうと、単純な操作ミス(いったんフォーカスだけを移して他の入力欄にうつる)時もパラメータが追加されてしまいます。
というのは、Parameters.Addを行うということでしょうか?なので一応Form_Loadでパラメータをすべて追加しておき、Lost_FocusでValueを変えるようにしています。

まず、Txt_HogeAとTxt_HogeBに入力された値をA.mdbから検索し、あれば表示し、さらにB.mdbを検索し、Txt_A〜Txt_Zに表示します。
B.mdbを検索した結果、データがなければ、入力されたTxt_A〜Txt_Zに入力されたものをInsertしますが、B.mdbにレコードがあった場合はユーザーが入力したもののみをUpdateしたいんです。

そのような仕様ですので、Btn_Reg_Click時だと、すべてのテキストに値が入っているかチェックし、入っていればValueに追加ということになると思いますが、これだと入力されたものだけ更新ができなくなってしまうと思います。

大変恐縮ですが、よろしくお願いいたします。
引用返信 編集キー/
■46743 / inTopicNo.12)  Re[9]: Parametersが追加されているか
□投稿者/ だい (30回)-(2010/02/10(Wed) 10:01:49)
No46738 (みきぬ さん) に返信
> ところで、使っているのは OLE DB プロバイダなのかな。
> だとしたら、名前つきパラメータは使えないんじゃないっけ?
>
> 処理は通ったとしてもパラメータの名前は無視されるんじゃないかしら。
> たぶん Parameters に Add した順番に適応されると思うけど…大丈夫?

ありがとうございます。
OleDBです。.NETとしてしまいましたが、VB2008です。
大変申し訳ありません。

調べてみたところ、.NETだと
OLE DB用の.NETデータ・プロバイダの場合には、名前付きパラメータではなく、パラメータ部分に「プレースホルダ」と呼ばれる「?」を記述する。
と書いてあります。

http://www.atmarkit.co.jp/fdotnet/basics/adonet03/adonet03_02.html
引用返信 編集キー/
■46751 / inTopicNo.13)  Re[9]: Parametersが追加されているか
□投稿者/ Mr.T (333回)-(2010/02/10(Wed) 11:24:50)
>>LostFocus時にいちいちパラメータ追加されてしまうと、単純な操作ミス(いったんフォーカスだけを移して他の入力欄にうつる)時もパラメータが追加されてしまいます。
> というのは、Parameters.Addを行うということでしょうか?なので一応Form_Loadでパラメータをすべて追加しておき、Lost_FocusでValueを変えるようにしています。

言葉を間違えてました。申し訳ないです。パラメータ追加ではなく、値の変更ですね。
> Cmd.Parameters("BBB").Value="HogeB"


>そのような仕様ですので、Btn_Reg_Click時だと、すべてのテキストに値が入っているかチェックし、入っていればValueに追加ということになると思いますが、これだと入力されたものだけ更新ができなくなってしまうと思います。

値が入っていればではなく、b.mdbから読み出した初期の値と現在の入力値と比較して、ということになるでしょう。
b.mdbからデータを引き出してくるタイミングで、それら読出しの値を適当なクラスにでも保持させて
登録時に比較チェックし、必要なパラメータのみ追加して更新すればいいんじゃないかと思います。



引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -