テーブル検索後のフィールド値の取得方法について

タグの編集
投稿者 他路  (社会人) 投稿日時 2011/4/21 16:56:29
続けてお世話になります。
テーブル(管理番号座標)には、3つのフィールドがあります。
 管理番号、X座標、Y座標  です。
DataGridView1の現在行の管理番号を取得後、その管理番号で
テーブル(管理番号座標)の管理番号を検索し、そのX座標、Y座標を
各変数 X、Y に入力したく、下記コードを作成しました。
この後、X座標、Y座標の取り出し方が解りません。
ご指導、よろしくお願いいたします。
VB6の世界より、VisualBasic 2010に来たのですが、
VisualBasic 2010は難解×難解です。

       crRow = (DataGridView1.CurrentRow.Index)
        crValue = DataGridView1.Item(0, crRow).Value.ToString()
        cn.Open()
        Com = New OleDb.OleDbCommand("SELECT 管理番号=""" & crValue & """ FROM 管理番号座標", cn)
        Com.ExecuteNonQuery()
投稿者 とくま  (社会人) 投稿日時 2011/4/21 17:56:24
・OleDbCommand.ExecuteNonQuery メソッド 
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbcommand.executenonquery.aspx
>解説
> ExecuteNonQuery では、カタログ操作 (データベース構造の照会、テーブルなどのデータベース 
> オブジェクトの作成など) を実行できます。また、DataSet を使用せずに、UPDATE、INSERT、
> または DELETE ステートメントを実行して、データベース内のデータを変更することもできます。 
>
> ExecuteNonQuery は行を返しません
簡単に言えば、UPDATE、INSERT といったデータ行を取得しない命令の為のコマンドです。
NonQuery は、そのまま訳して「問合せしない」と読めるでしょう。

・OleDbCommand.ExecuteReader メソッド 
http://msdn.microsoft.com/ja-jp/library/979byfca.aspx
を使って1行1行読み込むか、

・DbDataAdapter.Fill メソッド (DataTable)
http://msdn.microsoft.com/ja-jp/library/905keexk.aspx
で DataTable に読み込みます。
この場合、DataAdapter の使い方を勉強する必要があります。

> VB6の世界より、VisualBasic 2010に来たのですが、
> VisualBasic 2010は難解×難解です。
VB6 では ADODB だと思いますが、コネクション開いて接続するだけですし、
1行ずつ読んだり、全行入れ物に入れたり、手順とできることは大して変わって
ないと思います。
内部のコマンドが変わることは、違うオブジェクトを扱うのだから当然のこと。
お決まりの手順を調べれば良いのだから「VB.NET データベース検索」あたりの
キーワードで調べれば、こんな基本的な操作で困る事なんて無いはず。

むしろ、VB6の知識が邪魔してるのでは?
新しいライブラリだと意識して勉強しなおせば、そうそう難解なことは無いと
思います。
投稿者 るきお  (社会人) 投稿日時 2011/4/22 00:00:43
>X座標、Y座標の取り出し方が解りません。
X座標、Y座標を取り出したのであれば、SELECT句にこの2つを含めなくてはだめですよね?

>SELECT 管理番号=""" & crValue & """ 
これだといろいろおかしいです。

まずはSQL文をちゃんと作って、
それから、その結果をVBで取得するようにするのがよく、

他路さんの場合SQLがかけていないのでVBの話をする前の部分でつまずいていると思います。

対象のデータベースの種類により接続文字列やSQLの書き方は変わりますが、
たとえば、次のようにするとテーブルからX座標、Y座標を取り出すことができます。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    Dim connectionString = "Provider=SQLOLEDB.1;Data Source=(local);Persist Security Info=True;User ID=rucio;Password=password;Initial Catalog=TestDb"
    Dim cn As New OleDbConnection(connectionString)

    Dim crRow As Integer
    Dim crValue As String
    Dim com As OleDbCommand


    crRow = (DataGridView1.CurrentRow.Index)
    crValue = DataGridView1.Item(0, crRow).Value.ToString()

    com = New OleDbCommand("SELECT X座標,Y座標 FROM 管理番号座標 WHERE 管理番号='" & crValue & "'", cn)

    Dim adapter As New OleDbDataAdapter(com)
    Dim table As New DataTable
    adapter.Fill(table)
    adapter.Dispose()
    cn.Dispose()

    Dim x As Integer = table.Rows(0)("X座標")
    Dim y As Integer = table.Rows(0)("Y座標")

    MsgBox("X座標は" & x)
    MsgBox("Y座標は" & y)
End Sub


値をとってくるだけでこれだけのコードを書かなければいけないのはどうかと思っていますが、これが標準的な書き方です。
多分データベースのプログラムをよくする人は、一連の処理をカプセル化してもっと楽に書けるようにしていることと思います。

とってくる値が1つだけなら、次のように多少は楽に書けます。
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    Dim connectionString = "Provider=SQLOLEDB.1;Data Source=(local);Persist Security Info=True;User ID=rucio;Password=password;Initial Catalog=TestDb"
    Dim cn As New OleDbConnection(connectionString)

    Dim crRow As Integer
    Dim crValue As String
    Dim com As OleDbCommand

    crRow = (DataGridView1.CurrentRow.Index)
    crValue = DataGridView1.Item(0, crRow).Value.ToString()

    com = New OleDbCommand("SELECT X座標 FROM 管理番号座標 WHERE 管理番号='" & crValue & "'", cn)

    cn.Open()
    Dim x As Integer = com.ExecuteScalar
    cn.Close()

    com.Dispose()
    cn.Dispose()

    MsgBox("X座標は" & x)

End Sub
投稿者 他路  (社会人) 投稿日時 2011/4/22 09:48:14
るきおさん、ありがとうございました。

>たとえば、次のようにするとテーブルからX座標、Y座標を取り出すことができます。
このままで、うまくいきました。

------------------------
るきおさん、とくまさん、アドバイスいただきありがとうございました。
>他路さんの場合SQLがかけていないのでVBの話をする前の部分でつまずいていると思います。

>お決まりの手順を調べれば良いのだから「VB.NET データベース検索」あたりの
>キーワードで調べれば、こんな基本的な操作で困る事なんて無いはず。

>新しいライブラリだと意識して勉強しなおせば、そうそう難解なことは無いと
>思います。 

ご指摘の通りです、肝に銘じて進めていきます。
本件、解決とさせていただきます。
ありがとうございました。