DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データテーブルの範囲指定

環境/言語:[WindowsXP]
分類:[.NET]

いつもお世話になっております。
今回の質問ですが、現在VB.NET2003を使用して
2つのテーブルデータ(SQLServer内)を使って画面を作成しているのですが、
Form1で指定したレコード(DB1)のある値(文字列と数値)をフォーム間のデータ受渡を行ってからForm2にて同じ値のレコードのデータ(DB2)を表示を行いたいのです。

以前の#1041「DataGrid(クエリビルダ)での抽出条件」の
WHERE以降を(文字列 like'* " & Me.TextBox1.Text & "*') and (数値 like'* " & Me.TextBox2.Text & "*')"としましたが判定してくれない為
お知恵をお借りしたく思います
お世話になります。

■No12796に返信(尾白さんの記事)
> いつもお世話になっております。
> 今回の質問ですが、現在VB.NET2003を使用して
> 2つのテーブルデータ(SQLServer内)を使って画面を作成しているのですが、
> Form1で指定したレコード(DB1)のある値(文字列と数値)をフォーム間のデータ受渡を行ってからForm2にて同じ値のレコードのデータ(DB2)を表示を行いたいのです。
>
> 以前の#1041「DataGrid(クエリビルダ)での抽出条件」の
> WHERE以降を(文字列 like'* " & Me.TextBox1.Text & "*') and (数値 like'* " & Me.TextBox2.Text & "*')"としましたが判定してくれない為
> お知恵をお借りしたく思います

http://dobon.net/vb/bbs/log3-2/1041.html#1043

Me.OleDbDataAdapter1.SelectCommand.CommandText
にのWHERE以降を(文字列 like'* " & Me.TextBox1.Text & "*') and (数値 like'* " & Me.TextBox2.Text & "*')"
にした、ということでよろしいでしょうか。

*を%に変えてみても同じですか?
説明不足で申し訳ございませんでした。
なおこ様の言われる通りWHERE以降を変更致しました。

また*を%に変更しましても同様に判定されませんでした。

DataAdapterを使用する際のクエリビルダの抽出条件には何も入れていないのですが
それは大丈夫なのでしょうか?
■No12796に返信(尾白さんの記事)
> WHERE以降を(文字列 like'* " & Me.TextBox1.Text & "*') and (数値 like'* " &
ちょっと分からないのですが、
数値でlikeって使えましたっけ?

#MSDNには
#「引数が文字列型でない場合、Microsoft® SQL Server™
# は可能な限り文字列型に変換します。」
#と書かれているので、動くのかもしれませんが。

数値をCASTなどで自前で変換かけて、
まずは目的のSQL文が正しいのかどうか
実行してみてはいかがでしょうか?
お世話になっております。

封真様の記事により数値後のLikeをCastに変更をして
実行を行った結果IErrorInfoのエラーボックスが表示されました。
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation)
にて例外処理されていた為判定されていませんでした。

初歩的な質問かもしれませんが
> 数値をCASTなどで自前で変換かけて、
> まずは目的のSQL文が正しいのかどうか
> 実行してみてはいかがでしょうか?
はどの様に実行してみれば良いのでしょうか??
■No12815に返信(尾白さんの記事)
> お世話になっております。
> > 封真様の記事により数値後のLikeをCastに変更をして
> 実行を行った結果IErrorInfoのエラーボックスが表示されました。
> Catch ex As Exception
> MsgBox(ex.Message, MsgBoxStyle.Exclamation)
> にて例外処理されていた為判定されていませんでした。
どのようにプログラムを実行されているのか分かりませんが、
デバッグで止めて、Exceptionの中身を見たりすることは出来ないのでしょうか?

>数値後のLikeをCastに変更
って言葉が気になったのですが、
> (数値 like'* " & Me.TextBox2.Text & "*')"
の「数値」と書かれている部分は列名が入る場所だと思います。
その列が数値型(IntegerとかDecimal)なんですよね?
私は列に対してCASTをかけて数値列⇒文字列とし
SQLを発行してみてはいかがでしょうか?と提案したかったのです。
通じていなかったら、すみませんでした。


> > 初歩的な質問かもしれませんが
>>数値をCASTなどで自前で変換かけて、
>>まずは目的のSQL文が正しいのかどうか
>>実行してみてはいかがでしょうか?
> はどの様に実行してみれば良いのでしょうか??

プログラムより実際に発行したいSQLがあると思うのですが、
まずそのSQLが尾白さんの期待したデータを取ってこれるのかどうかを
クエリアナライザ等を使い実行することで確認をし、
その後、確認したSQLと同等のSQLを組み立てるように
プログラムが作られているのかを確認すればいいかと思います。
クエリビルダにて実験をし
抽出条件に文字列には='AAA'を数列には='##'を設定(データ内の値)
にて実行を行うと指定されて表示されます。

現在はForm_Loadに
OleDbDataAdapter.fill(DataSet1,"DB名")
button_Click1に
判定のプログラムを入れています。

str((数値) like'* " &〜に変更を行いましたが変わらずでした
■No12818に返信(尾白さんの記事)
> クエリビルダにて実験をし
> 抽出条件に文字列には='AAA'を数列には='##'を設定(データ内の値)
> にて実行を行うと指定されて表示されます。
> > 現在はForm_Loadに
> OleDbDataAdapter.fill(DataSet1,"DB名")
> button_Click1に
> 判定のプログラムを入れています。
> > str((数値) like'* " &〜に変更を行いましたが変わらずでした

自分が実行したいSQL文は目的を果たせていたって事でしょうか?
#文面からどのようなSQLを作成されたのか読み取れなかったので
#確認させていただきたく思います。

テーブル名をT1、文字型の列をCOLCHR、数値型の列をCOLNUMとした場合、
select * from T1 where COLCHR Like '%AAA%' and cast(COLNUM as char(4)) like '%55%' ;
という感じのSQLであったということでしょうか?


>実行を行った結果IErrorInfoのエラーボックスが表示されました。
>Catch ex As Exception
>MsgBox(ex.Message, MsgBoxStyle.Exclamation)
>にて例外処理されていた為判定されていませんでした。
尾白さんがこの様に書かれていましたが、
そのExceptionの内容をデバッグ実行などで取得することはできたでしょうか?
どのようなExceptionが発生したのかが分からないので、
何がエラーになったのかわかりません。
問題ない程度で構いませんので、提示していただきたく思います。
お世話になります。

とりあえず、私がやって成功した実験の手順などを書いておきます。
1)SQLServerにDOBON12796というテーブルを作成。
 フィールドは、
  TEXTCOLUMN varchar 50
  NUMERICCOLUMN numeric 9
 以下のSQL2本をクエリアナライザから実行
 INSERT INTO DOBON12796 VALUES('ABCDE', 1133311);
 INSERT INTO DOBON12796 VALUES('FGHIJK', 2255522);

2)Formに
DataGrid1、TextBox1、TextBox2、Button1を貼り付ける。

3)Button1のClickイベントに以下のコードを記述
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim Conn As System.Data.OleDb.OleDbConnection
  Try
    Conn = New System.Data.OleDb.OleDbConnection
    Conn.ConnectionString = "…" 'ここは適宜変えてください。
    Conn.Open()

    Dim selectCMD As System.Data.OleDb.OleDbCommand = New System.Data.OleDb.OleDbCommand
    selectCMD.Connection = Conn
    selectCMD.CommandText = "SELECT TEXTCOLUMN, NUMERICCOLUMN FROM DOBON12796" _
                + " WHERE TEXTCOLUMN LIKE '%" + Me.TextBox1.Text + "%' AND CAST(NUMERICCOLUMN AS VARCHAR(50)) like '%" + Me.TextBox2.Text + "%'"
    Dim da As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter
    da.SelectCommand = selectCMD

    Dim ds As DataSet = New DataSet
    da.Fill(ds, "DOBON12796")

    Dim dt As DataTable = ds.Tables("DOBON12796")
    Me.DataGrid1.DataSource = dt
  Catch ex As Exception
    Trace.WriteLine(ex.StackTrace)
  Finally
    If Not IsNothing(Conn) Then
      Conn.Close()
    End If
  End Try
End Sub

4)TextBox1にB、TextBox2に3と入力し、Button1を押下。
 →DataGrid1に
  ABCDE 1133311
  のレコードのみ表示される。
毎度お世話になっています。

SQL文は
"SELECT * FROM T1 WHERE (COLCHR = 'AA') AND" & " (COLNUM = 0)"
でSELECTCommandTextに記入されていますがこちらは違うのでしょうか??

また
>そのExceptionの内容をデバッグ実行などで取得することはできたでしょうか?
>どのようなExceptionが発生したのかが分からないので、
>何がエラーになったのかわかりません。
>問題ない程度で構いませんので、提示していただきたく思います。
お答えしたいのですがなぜか現状ではエラーが発生せず
どちらを変更したからかが判っていません。
申し訳ないです。
■No12830に返信(尾白さんの記事)
> 毎度お世話になっています。
> > SQL文は
> "SELECT * FROM T1 WHERE (COLCHR = 'AA') AND" & " (COLNUM = 0)"
> でSELECTCommandTextに記入されていますがこちらは違うのでしょうか??

最初の投稿で
>WHERE以降を(文字列 like'* " & Me.TextBox1.Text & "*') and (数値 like'* " & Me.TextBox2.Text & "*')"
にしたんだと思っていたんですが、
この修正をする前の状態が
> "SELECT * FROM T1 WHERE (COLCHR = 'AA') AND" & " (COLNUM = 0)"
であるということでしょうか?

今回尾白さんが提示されたSQL文をlike文にするのであれば、なおこさんが提示されている
---------------------------------------------------------------------------
>"SELECT TEXTCOLUMN, NUMERICCOLUMN FROM DOBON12796" _
>+ " WHERE TEXTCOLUMN LIKE '%" + Me.TextBox1.Text + "%' AND CAST(NUMERICCOLUMN AS VARCHAR(50)) like '%" + Me.TextBox2.Text + "%'"
---------------------------------------------------------------------------
の部分が答えになっているので、
尾白さんのテーブル名、列名に合わせたものに直せばいいかと思います。
2005/09/16(Fri) 21:39:38 編集(投稿者)

お世話になります。

■No12830に返信(尾白さんの記事)
> SQL文は
> "SELECT * FROM T1 WHERE (COLCHR = 'AA') AND" & " (COLNUM = 0)"
> でSELECTCommandTextに記入されていますがこちらは違うのでしょうか??

封真さんが仰りたいことは、
VBのSELECTCommandTextとかで何かをやる前に、
そのSQL文自体が正しいかどうか、
クエリアナライザで、そのSQLを発行してみて、確かめてみては?
という事ではないのかと。

# 投稿がかぶっちゃいましたw
お世話になっています。
本当に無知ですみません。

封真様へ
クエリアナライザでは、2回目に記入した
Select * From T1 Where (COLCHA ='AA') and (COLNUM=0)でした。

なおこ様へ
プログラムをありがとうございます。
現在見ながら行っていますが
DataAdapter・DataConnection・DataSetは作成するだけで宜しいのですか?
Button_Click内に da.Fill(ds,"DOBON")がある為Form内にはいらないのでしょうか?
お世話になります。

■No12839に返信(尾白さんの記事)
> なおこ様へ
> プログラムをありがとうございます。
> 現在見ながら行っていますが
> DataAdapter・DataConnection・DataSetは作成するだけで宜しいのですか?
> Button_Click内に da.Fill(ds,"DOBON")がある為Form内にはいらないのでしょうか?

デザイナでフォームにDataAdapter・DataConnection・DataSetを
ツールボックスから貼り付ける必要はないか?
…という事でよろしいですか?
であれば、上記コードの場合は必要ないです。
■No12839に返信(尾白さんの記事)
> お世話になっています。
> 本当に無知ですみません。
> > 封真様へ
> クエリアナライザでは、2回目に記入した
> Select * From T1 Where (COLCHA ='AA') and (COLNUM=0)でした。
最初の投稿で尾白さんは
>WHERE以降を(文字列 like'* " & Me.TextBox1.Text & "*') and (数値 like'* " & Me.TextBox2.Text & "*')"としましたが判定してくれない為
と書いていますよね。
よって試して欲しいSQLとしては
SELECT * FROM T1 WHERE (COLCHA like '%AA%') and (CAST(COLNUM as VARCHAR(10)) like '%0%')
となります。

ポイントとして今回修正したことによってSQLが変わったように見受けられます。
修正後に発行しているSQLが正しいのか否かをまずチェックていただきたいと思うのです。
SQLが正しいのであれば、問題は別の場所にあるということになりますから(^^)

大変かもしれませんが、少しずつ確認しながら前に進んでいきましょう。
お世話になっています。
なおこ様
説明が不足していた申し訳ございませんでした。
また、プログラムですが適宜変更の…部分は変えないと
判定しない事がありますでしょうか?

封真様
SELECT * FROM T1 WHERE (COLCHA like '%AA%') and (CAST(COLNUM as VARCHAR(10)) like '%0%')の構文でも判定されました。
違う構文でも同じ判定をする事が出来るのは勉強になりました。
■No12844に返信(尾白さんの記事)
> SELECT * FROM T1 WHERE (COLCHA like '%AA%') and (CAST(COLNUM as VARCHAR(10)) like '%0%')の構文でも判定されました。
> 違う構文でも同じ判定をする事が出来るのは勉強になりました。

えっと・・・
気分を害されたらごめんなさい。
>Select * From T1 Where (COLCHA ='AA') and (COLNUM=0)
>SELECT * FROM T1 WHERE (COLCHA like '%AA%') and (CAST(COLNUM as VARCHAR(10)) like '%0%')
の違いってわかりますか?
#わかっているのであれば、余計な心配をオレがしているだけなので、
#放置してください。

で、本題。
プログラムで作っているSQLが正しいのであれば、
なおこさんが#12827で提示してくださったプログラムの内容と
自分のプログラムの内容を比べてみて、
何が違うのかを調べるのが動かすポイントになると思います。
お世話になります。
■No12844に返信(尾白さんの記事)
> お世話になっています。
> なおこ様
> 説明が不足していた申し訳ございませんでした。
> また、プログラムですが適宜変更の…部分は変えないと
> 判定しない事がありますでしょうか?

ちょっと質問の意味が解りかねますが…
ConnectionStringは、その名の通りデータベースへの接続文字列なので、
尾白さんのデバッグ環境に合わせて記述してくださいね。
との意味で適宜…と書きました。

なので、実際は以下のような感じになると思います。
Conn.ConnectionString = "Provider=SQLOLEDB;Data Source=サーバー名;Initial Catalog=データベース名;Integrated Security=SSPI;"

※参考(OleDbConnection.ConnectionString プロパティ)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemDataOleDbOleDbConnectionClassConnectionStringTopic.asp
お世話になっております。
お二方のおかげでDataGridの範囲指定が出来るようになりました。
なおこ様のプログラムですが、デザイナでフォームにDataAdapter・DataConnection・DataSetをツールボックスから貼り付けずに行うプログラムですが、ツールボックスから貼り付けた際の状態で同じ様なプログラムを作成しましたが(必要部分は変更)判定してくれませんでした。
やはりDataGridの判定はDataAdapter等を貼り付けずに行う方法しかないのでしょうか?
2005/09/17(Sat) 23:07:34 編集(投稿者)

お世話になります。

■No12867に返信(尾白さんの記事)
> お世話になっております。
> お二方のおかげでDataGridの範囲指定が出来るようになりました。
> なおこ様のプログラムですが、デザイナでフォームにDataAdapter・DataConnection・DataSetをツールボックスから貼り付けずに行うプログラムですが、ツールボックスから貼り付けた際の状態で同じ様なプログラムを作成しましたが(必要部分は変更)判定してくれませんでした。
> やはりDataGridの判定はDataAdapter等を貼り付けずに行う方法しかないのでしょうか?

いや、そんな事は無いはずです。
今一度、デザイナ上で貼り付けたコントロールのプロパティと、
プログラム内で生成したコントロールのプロパティを見比べて見てください。

もしくは、.vbのソースの、Region "Windowsフォームデザイナで生成されたコード"
の中で、DataAdapter等コントロールのプロパティにセットしている値と、
プログラム内で生成したコントロールのプロパティにセットしている値を比べてみてください。

# 個人的には、デザイナに貼り付けなくても使えるものであれば、
# フォームの中で生成する方が好きです…
お世話になっています。
なおこ様に頂いたプログラムを再度プロパティ値の確認を行い、
デザイナでDataAdapter等を貼り付けたプログラムで
検索が出来るようになりました。

どうもありがとうございました
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板