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

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

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

Re[10]: コンボボックスで選んだ値をSQLに代入したいのですが・・・


(過去ログ 42 を表示中)

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

■21850 / inTopicNo.1)  コンボボックスで選んだ値をSQLに代入したいのですが・・・
  
□投稿者/ 大吉 (1回)-(2008/07/11(Fri) 00:05:17)

分類:[.NET 全般] 

2008/07/11(Fri) 00:06:18 編集(投稿者)
2008/07/11(Fri) 00:06:11 編集(投稿者)

はじめまして
AccessVBAから.NETに転向して2日目です
名前は似てるのに全く別物でかなり戸惑ってます

Const strSQL As String = "select 完成品名 from t完成品マスター" + _
" where 完成品番='@完成品番';"
Dim oConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName)
Dim oCommand As New OleDbCommand()
Dim oDataReader As OleDbDataReader

'▼コネクション設定
oCommand.Connection = oConn
'▼SQL文の設定
oCommand.CommandText = strSQL
'▼DB接続を開く
oConn.Open()
'SQL文パラメータの設定
oCommand.Parameters.Add(New OleDbParameter("@完成品番", OleDbType.Char, 5))
oCommand.Parameters("@完成品番").Value = cmb検索対象.SelectedItem.ToString()←この部分
'▼取得レコードが1件の時は、引数にCommandBehavior.SingleRowを指定
oDataReader = oCommand.ExecuteReader(CommandBehavior.SingleRow)
If oDataReader.Read() Then
Me.txt検索結果1.Text = oDataReader("完成品名")
Else
MessageBox.Show("この品番は未登録です", "エラー")
Exit Sub
End If
Me.txt検索結果1.Text = oDataReader("完成品名")
oDataReader.Close()
oConn.Close()

このコードなのですがテーブルの中にデータはあるのですが
未登録となってしまいます
コンボボックスの値の代入方法が間違ってると思うのですがどうしたらいいのかさっぱりです

どなたか、御教授願います
引用返信 編集キー/
■21851 / inTopicNo.2)  Re[1]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 銀閣寺在住 (7回)-(2008/07/11(Fri) 00:15:50)

> Const strSQL As String = "select 完成品名 from t完成品マスター" + _
> " where 完成品番='@完成品番';"

'@完成品番'?

> どなたか、御教授願います

また・・・・
引用返信 編集キー/
■21852 / inTopicNo.3)  Re[2]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ ロック (38回)-(2008/07/11(Fri) 00:21:47)
コンボボックスへのアイテム追加方法にもよると思いますが
SelectedItemではなく、SelectedValueを使ってみてはいかがでしょうか
引用返信 編集キー/
■21856 / inTopicNo.4)  Re[1]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ nakaP (21回)-(2008/07/11(Fri) 08:50:22)
No21850 (大吉 さん) に返信
>"'@完成品番'"
この部分の「'」を取り除き、

> oDataReader = oCommand.ExecuteReader(CommandBehavior.SingleRow)
の部分で変更前と変更後のoCommand.CommandTextを比べてみてください。
引用返信 編集キー/
■21857 / inTopicNo.5)  Re[3]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 大吉 (2回)-(2008/07/11(Fri) 08:50:32)
No21852 (ロック さん) に返信
> コンボボックスへのアイテム追加方法にもよると思いますが
> SelectedItemではなく、SelectedValueを使ってみてはいかがでしょうか

Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName)
Dim SQLCm As OleDbCommand = Cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLCm)
Dim Table As New DataTable

Table.Clear()

Select Case cmb検索方法.Text
Case "完成品番検索"
'▼データ取得
SQLCm.CommandText = "SELECT 完成品番 FROM t完成品マスター group by 完成品番"
Adapter.Fill(Table)
'▼データ連結
cmb検索対象.DataSource = Table
cmb検索対象.DisplayMember = "完成品番"

このような感じでコンボボックスに追加しています

"'@完成品番'?" も SelectedValueもダメでした

宜しくお願いします
引用返信 編集キー/
■21858 / inTopicNo.6)  Re[2]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 大吉 (3回)-(2008/07/11(Fri) 08:56:17)
No21856 (nakaP さん) に返信
> ■No21850 (大吉 さん) に返信
> >"'@完成品番'"
> この部分の「'」を取り除き、
>
>>oDataReader = oCommand.ExecuteReader(CommandBehavior.SingleRow)
> の部分で変更前と変更後のoCommand.CommandTextを比べてみてください。

変更前
strSQL.........where 完成品番="'@完成品番'";

変更後
strSQL.........where 完成品番="@完成品番";

となっています
テキストボックスからの値が代入されてませんね・・・

どうしたもんでしょう?
引用返信 編集キー/
■21860 / inTopicNo.7)  Re[3]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ ロック (39回)-(2008/07/11(Fri) 09:06:30)
すいません、改めてよく見てみると銀閣寺在住さんの言っていた意味がわかりました。

「@完成品番」がシングルクォーテーションで囲まれているためにパラメータとして
扱われていないようです。
最初の処理の状態でシングルクォーテーションをはずしてみて下さい。

また、コンボボックスに設定する際、DisplayMemberのほかにValueMemberにも
同じ値を設定してください。
#単純に、cmb検索対象.Textでも良いような気がしますが自分がいつもそれなので
引用返信 編集キー/
■21861 / inTopicNo.8)  Re[4]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 大吉 (4回)-(2008/07/11(Fri) 09:51:40)
No21860 (ロック さん) に返信
> すいません、改めてよく見てみると銀閣寺在住さんの言っていた意味がわかりました。
>
> 「@完成品番」がシングルクォーテーションで囲まれているためにパラメータとして
> 扱われていないようです。
> 最初の処理の状態でシングルクォーテーションをはずしてみて下さい。
>
> また、コンボボックスに設定する際、DisplayMemberのほかにValueMemberにも
> 同じ値を設定してください。
> #単純に、cmb検索対象.Textでも良いような気がしますが自分がいつもそれなので

シングルクォーテーションを外してみたのですがだめです

パラメータが正しく設定されていればoCommand.CommandTextが
select 完成品名 from t完成品マスター where 完成品番=@完成品番
ではなく
select 完成品名 from t完成品マスター where 完成品番=「コンボボックスで選択された値」
になると思いますが

変わらず@完成品番となってます
引用返信 編集キー/
■21862 / inTopicNo.9)  Re[5]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 特攻隊長まるるう (134回)-(2008/07/11(Fri) 10:08:30)
No21861 (大吉 さん) に返信
>select 完成品名 from t完成品マスター where 完成品番=「コンボボックスで選択された値」
>になると思いますが
なりません。パラメータ付きクエリのパラメータへ実際の値を代入するのは
データベースの仕事です。
引用返信 編集キー/
■21863 / inTopicNo.10)  Re[5]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ ロック (40回)-(2008/07/11(Fri) 10:10:55)
どこまで、実行してみました?
デバッグで見た、oCommand.CommandTextは
> select 完成品名 from t完成品マスター where 完成品番=@完成品番
この状態で問題ないです。

うーーん、最初の処理の状態で
・完成品番='@完成品番' を 完成品番=@完成品番 に変更
・cmb検索対象.SelectedItem.ToString() を cmb検索対象.Text に変更

で、上手くいきませんか?

あと、
oCommand.Parameters.Add(New OleDbParameter("@完成品番", OleDbType.Char, 5))
となっていますが、Charで5だと完全に5文字入っていないと取得できなかったと思います(記憶が曖昧)
なので、↑で上手くいかない場合は、コンボからの取得箇所を
oCommand.Parameters("@完成品番").Value = "00000" と、実際にある値で実験してみてはいかがでしょうか?

引用返信 編集キー/
■21864 / inTopicNo.11)  Re[5]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 小春 (65回)-(2008/07/11(Fri) 10:18:28)
2008/07/11(Fri) 10:19:32 編集(投稿者)

No21861 (大吉 さん) に返信
oCommand.ExecuteReaderのときに、バインド変数との紐つけを行うので、
oCommand.CommandTextは、
>select 完成品名 from t完成品マスター where 完成品番=@完成品番
のままで正解です。

>oCommand.Parameters("@完成品番").Value = cmb検索対象.SelectedItem.ToString()←この部分
cmb検索対象.SelectedItem.ToString()がDBに登録された「完成品番」に一致しますか?
ということと、
>oCommand.Parameters.Add(New OleDbParameter("@完成品番", OleDbType.Char, 5))
の完成品番は5桁以上ありませんか?といったところかと。

#かぶっちゃいましたね(^^;
引用返信 編集キー/
■21866 / inTopicNo.12)  Re[6]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 大吉 (5回)-(2008/07/11(Fri) 10:28:02)
No21863 (ロック さん) に返信

> oCommand.Parameters.Add(New OleDbParameter("@完成品番", OleDbType.Char, 5))
> となっていますが、Charで5だと完全に5文字入っていないと取得できなかったと思います(記憶が曖昧)
> なので、↑で上手くいかない場合は、コンボからの取得箇所を

できました〜!!!!!!!
文字数の制限がNGだったんですね>_<

お忙しい中、申し訳ありませんでした

あと、とりあえず文字数を20文字に設定したのですが無制限って出来るのでしょうか?


解決済み
引用返信 編集キー/
■21869 / inTopicNo.13)  Re[6]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ ロック (41回)-(2008/07/11(Fri) 10:47:11)
> あと、とりあえず文字数を20文字に設定したのですが無制限って出来るのでしょうか?
無制限という響きが怖いですが、VarCharを使ってみてはいかがでしょうか?
ちなみに、型は沢山あります。用途によって使い分けが必要になってくると思いますので
一度、型の確認と用途について確認してみることをお勧めします。
#でないと、あとからDBを直すはめになるんで・・・涙

解決済みですが、もう少しだけこのスレ伸ばしていいですか(汗)
今回のようにSQLに渡したパラメータ付きSQL文を、実際にどんなSQL文として処理したのか
確認する方法はあるのでしょうか?

詳しいかた、よろしくお願いします。
解決済み
引用返信 編集キー/
■21876 / inTopicNo.14)  Re[7]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ やじゅ (483回)-(2008/07/11(Fri) 11:37:56)
やじゅ さんの Web サイト
No21869 (ロック さん) に返信
> 今回のようにSQLに渡したパラメータ付きSQL文を、実際にどんなSQL文として処理したのか
> 確認する方法はあるのでしょうか?
>

無いと思われますね、私はGetBindToValueSQLという独自メソッドでパラメータの文字列置換
する処理を作成して、DEBUG時にコンソールに出力してます。例はOracleです

#If DEBUG Then
'Debug用にSQL句を出力する
Dim DebugSQL As String
DebugSQL = DBMConn.GetBindToValueSQL(oraCmd, strSQL)
Debug.WriteLine(DebugSQL)
#End If

引用返信 編集キー/
■21877 / inTopicNo.15)  Re[8]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 小春 (66回)-(2008/07/11(Fri) 12:04:21)
No21869 (ロック さん) に返信
>今回のようにSQLに渡したパラメータ付きSQL文を、実際にどんなSQL文として処理したのか
>確認する方法はあるのでしょうか?

.Net側から見る方法は無いと思われますが、
DBのトレースログから見ることができたような気がします。
Oracle限定だと、
http://otn.oracle.co.jp/forum/thread.jspa?threadID=2001406
の記事でできるみたいですが、
デバッグ時にここまでして、バインド結果が見たいかと言われれば…。
デバッグ時では、やじゅさんのやり方がよいかと思います。
Accessはというと...見たことありません(^^;

No21866 (大吉 さん) に返信
>あと、とりあえず文字数を20文字に設定したのですが無制限って出来るのでしょうか?
「とりあえず」は危険ではないでしょうか?
無制限にする必要はなく、テーブルの桁数に合わせるべきだと思います。

引用返信 編集キー/
■21880 / inTopicNo.16)  Re[9]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ ロック (42回)-(2008/07/11(Fri) 12:59:30)
無いですか〜、残念です。
需要がありそうなのに、そういった情報が無かったもので聞いてみました。
やじゅさんの方法は、今後の参考にさせて頂きます。

ありがとうございました。

解決済み
引用返信 編集キー/
■21881 / inTopicNo.17)  Re[9]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 大吉 (6回)-(2008/07/11(Fri) 13:27:32)
No21877 (小春 さん) に返信

> ■No21866 (大吉 さん) に返信
> >あと、とりあえず文字数を20文字に設定したのですが無制限って出来るのでしょうか?
> 「とりあえず」は危険ではないでしょうか?
> 無制限にする必要はなく、テーブルの桁数に合わせるべきだと思います。
>

そうですよね
テーブルの桁数に合わせます^^

ありがとうございました
引用返信 編集キー/
■21884 / inTopicNo.18)  Re[10]: コンボボックスで選んだ値をSQLに代入したいのですが・・・
□投稿者/ 大吉 (7回)-(2008/07/11(Fri) 14:14:21)
No21881 (大吉 さん) に返信
> ■No21877 (小春 さん) に返信
>
>>■No21866 (大吉 さん) に返信
>>>あと、とりあえず文字数を20文字に設定したのですが無制限って出来るのでしょうか?
>>「とりあえず」は危険ではないでしょうか?
>>無制限にする必要はなく、テーブルの桁数に合わせるべきだと思います。
>>
>
> そうですよね
> テーブルの桁数に合わせます^^
>
> ありがとうございました
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -