none
VB2008 ボタンを押すと、コード内に記述したSQLが実行されるようなプログラムを作りたい RRS feed

  • 質問

  • Visual Basic 2008 Express Editionと、Microsoft SQL Server Compact 3.5

    を使用してアプリケーションを作成しています。

     

    ボタンを押すと、コード内に記述したSQLが実行されるようなプログラムを作りたいのですが、

    知識不足のため、セットしたSQLをどうやって発行すれば良いのかが分かりません。

     

    作成中のプログラムは、以下のような感じです。

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

     

            Dim sql As New SqlClient.SqlCommand("INSERT INTO Addresses VALUES ('ねこ','品川','東京',200);")
            Dim Adapter As New SqlClient.SqlDataAdapter(sql)
            Dim Addresses As New DataTable

     

            Adapter.Update(Me.Database1DataSet.Addresses)


        End Sub

     

    どなたかご教授いただければ幸いです。

    以上、よろしくお願いいたします。

     

     

    2008年8月3日 16:43

回答

  •  nekota00 さんからの引用

    DB(名前:Testdb.sdf)へ接続する部分は、具体的にどのように記述したら

    いいでしょうか?

     

    以下のような感じになります。

     

    Code Snippet
    Dim cn As SqlCeConnection =  Nothing
     
    Try
       cn = New SqlCeConnection("Data Source=|DataDirectory|\Database1.sdf")
       Dim cmd As SqlCeCommand =  New SqlCeCommand("insert test (item1, item2) values('hoge', 'fuga')",cn)
       cn.Open()
       cmd.ExecuteNonQuery()
    Catch ex As Exception
       MessageBox.Show(ex.Message)
    Finally
       cn.Close()
    End Try

     

     

     

     nekota00 さんからの引用


    使用しているDBは「SQL Server 2005 Express Edition」ではなく

    「Microsoft SQL Server Compact 3.5」なのですが、

    接続する部分の記述(connectionStringなど)に違いはあるでしょうか?

     

    SQL Server 2005 Express Editionの拡張子はmdfですので、まずそこが違います。実際にはSystem.Data.SqlServerCeを使用して接続しますので、細かなオプションも違います。

     

    SqlCeConnection.ConnectionString プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.data.sqlserverce.sqlceconnection.connectionstring(VS.71).aspx

     

    SqlConnection.ConnectionString プロパティ

    http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.connectionstring(VS.80).aspx

     

    2008年8月4日 9:48
    モデレータ
  •  nekota00 さんからの引用

    InsertCommandのサンプルにある、

    adapter.InsertCommand = command

    という部分がSQLを実行している部分なのでしょうか?

     

    adapter.InsertCommandはSqlDataAdapter.Update()メソッドで引数に指定したDataTableなどのデータの中で、新規に追加された行データを実際にテーブルにINSERTするときに使用される、SqlCommandクラスのプロパティです。UpdateCommand,DeleteCommandもそれぞれ、Update,Delete分を発行するときに使用されます。

     

    SelectCommandプロパティはUpdateではなく、Fillメソッドを呼び出して、Fillメソッドの引数で指定したDataTableなどにデータベースのテーブルからデータを取得(Select)するときに使用されます。

     

    nekota00 さんがどのように登録処理をしたいのかがわかりませんが、単一のレコードをデータベースのテーブルに追加したい場合なら、単にSqlCommand.ExecuteNonQuery()を使用すればよいと思います。

    SqlDataAdapter.Update()はきちんと理解しないとすこしとっつきにくいと(あくまで個人的には)思いますので。

    2008年8月4日 13:26

すべての返信

  • nekota00さんこんにちは

     

    提示されたプログラムだと検索したいのか、登録したいのかがわかりませんが、AddressesというDataTableの内容を登録したいのならInsertCommandの説明で提示されているサンプルが参考になると思います。

     

    -SqlDataAdapter.InsertCommand プロパティ

    http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqldataadapter.insertcommand(VS.80).aspx

     

    データを検索する場合はFillメソッドを使用します。

    http://msdn.microsoft.com/ja-jp/library/905keexk(VS.80).aspx

    2008年8月3日 20:50
  • SqlCommandとSqlDataAdapterの概念をよく理解されていないようです。SqlDataAdapter

    はデータベースよりレコードセットをローカルのデータテーブルに抽出してきて、データテーブル上でデータを編集した後、複数のレコードをまとめてデータベースへ戻す(保存・変更・削除)ために存在します。

    上記のようにデータテーブルを使わない、使う必要がない場合は、SqlCommandを使います。

    簡単に書けば以下のようになります。


    Code Snippet

    Try
           SqlConnection1.Open()
           SqlCommand1.CommandType = CommandType.Text
           SqlCommand1.CommandText = "INSERT INTO Addresses VALUES ('ねこ','品川','東京',200);")"

       SqlCommand1.ExecuteNonQuery()

    Catch ex As Exception
                MessageBox.Show(ex.Message)
    Finally
            SqlConnection1.Close()
    End Try

     

     

    2008年8月4日 3:24
    モデレータ
  • handcraftさま

     

    ご回答ありがとうございます。

     

    検索、登録どちらも行いたいです。

    教えていただいたサンプル、大変参考になります。

     

    InsertCommandのサンプルにある、

    adapter.InsertCommand = command

    という部分がSQLを実行している部分なのでしょうか?

     

    また、SqlDataAdapterを使用する場合、

    Microsoft SQL Server Compact 3.5のDB(名前:Testdb.sdf)へ

    接続する部分はどう記述すれば良いのでしょうか?

     

    何度も質問をしてしまってすみません。

    時間のあるときで構いませんので、ご教授のほどよろしくお願いいたします。

     

    2008年8月4日 8:28
  • trapemiyaさま

     

    ご回答ありがとうございます。

     

    おっしゃるとおり、SqlCommandとSqlDataAdapterを混同していたようです。

     

    ご提示いただいたコードは大変参考になりました。

    SqlCommandをる使用するやり方は、ほかの言語にも共通した感じがするので

    とっつきやすいです。

     

    二点、質問させていただきたいのですが、

    DB(名前:Testdb.sdf)へ接続する部分は、具体的にどのように記述したら

    いいでしょうか?

     

    使用しているDBは「SQL Server 2005 Express Edition」ではなく

    Microsoft SQL Server Compact 3.5」なのですが、

    接続する部分の記述(connectionStringなど)に違いはあるでしょうか?


    時間のあるときで構いませんので、ご教授のほどよろしくお願いいたします。

     

    2008年8月4日 8:46
  •  nekota00 さんからの引用

    DB(名前:Testdb.sdf)へ接続する部分は、具体的にどのように記述したら

    いいでしょうか?

     

    以下のような感じになります。

     

    Code Snippet
    Dim cn As SqlCeConnection =  Nothing
     
    Try
       cn = New SqlCeConnection("Data Source=|DataDirectory|\Database1.sdf")
       Dim cmd As SqlCeCommand =  New SqlCeCommand("insert test (item1, item2) values('hoge', 'fuga')",cn)
       cn.Open()
       cmd.ExecuteNonQuery()
    Catch ex As Exception
       MessageBox.Show(ex.Message)
    Finally
       cn.Close()
    End Try

     

     

     

     nekota00 さんからの引用


    使用しているDBは「SQL Server 2005 Express Edition」ではなく

    「Microsoft SQL Server Compact 3.5」なのですが、

    接続する部分の記述(connectionStringなど)に違いはあるでしょうか?

     

    SQL Server 2005 Express Editionの拡張子はmdfですので、まずそこが違います。実際にはSystem.Data.SqlServerCeを使用して接続しますので、細かなオプションも違います。

     

    SqlCeConnection.ConnectionString プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.data.sqlserverce.sqlceconnection.connectionstring(VS.71).aspx

     

    SqlConnection.ConnectionString プロパティ

    http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection.connectionstring(VS.80).aspx

     

    2008年8月4日 9:48
    モデレータ
  •  nekota00 さんからの引用

    InsertCommandのサンプルにある、

    adapter.InsertCommand = command

    という部分がSQLを実行している部分なのでしょうか?

     

    adapter.InsertCommandはSqlDataAdapter.Update()メソッドで引数に指定したDataTableなどのデータの中で、新規に追加された行データを実際にテーブルにINSERTするときに使用される、SqlCommandクラスのプロパティです。UpdateCommand,DeleteCommandもそれぞれ、Update,Delete分を発行するときに使用されます。

     

    SelectCommandプロパティはUpdateではなく、Fillメソッドを呼び出して、Fillメソッドの引数で指定したDataTableなどにデータベースのテーブルからデータを取得(Select)するときに使用されます。

     

    nekota00 さんがどのように登録処理をしたいのかがわかりませんが、単一のレコードをデータベースのテーブルに追加したい場合なら、単にSqlCommand.ExecuteNonQuery()を使用すればよいと思います。

    SqlDataAdapter.Update()はきちんと理解しないとすこしとっつきにくいと(あくまで個人的には)思いますので。

    2008年8月4日 13:26
  • trapemiyaさま

     

    ご回答ありがとうございます。

    教えていただいた書き方で、希望通りの結果を得ることができました!

     

    SQL Server 2005 Express EditionではSystem.Data.SqlServerCeではなく

    SqlConnection.ConnectionString 使うとのことも、納得しました。

     

    本当に助かりました。ありがとうございました!

     

    2008年8月4日 16:12
  • handcraft さま

     

    ご回答ありがとうございます。

     

    adapter.InsertCommandはプロパティで、SQL文を実行する関数ではないのですね。

    InsertCommand、UpdateCommand、DeleteCommandでは、

    SqlDataAdapter.Update()メソッドがSQL文を実行する関数にあたり、

    SelectCommandプロパティでは、Fillメソッドがそれにあたるという解釈で

    正しいでしょうか?

     

    SqlDataAdapter.Update()を使用してSQLを発行できるようにもなりたいので、

    きちんと理解できるようになるまで、もっと勉強します。

     

    丁寧に教えてくださり、ありがとうございました!

     

     

    2008年8月4日 16:51