パラメータ付ストアドを実行するには?

解決


ぷりお  2006-08-02 20:03:01  No: 132574

度々、申し訳ありません。

現在、VB2005で作成しています。

SQLサーバに接続して、

パラメータ付きストアドを実行したいのですが、

コードの記入の仕方がわかりません。

具体的にコードの記述方法をご教授下さい。

SQLとの接続は確認済みです。

大変申し訳ないのですが、宜しくお願いします。


うなまな  URL  2006-08-02 20:26:53  No: 132575

引数、戻り値の型などが不明なので、以下のコードで感じをつかんで下さい。
ただ、このような情報は調べようによって見つけられますので・・・

Imports System.Data.SqlClient
上記、名前空間がインポートされている事

''引数2個で、カーソルを受け取る場合
Using con As New SqlConnection("接続文字列")
    Using cmd As New SqlCommand
        con.Open()
        With cmd
            .Connection = con
            .CommandType = Data.CommandType.StoredProcedure
            .CommandText = "HogeHogeProcedure"
            .Parameters.Add(New SqlParameter("inValue1", Data.SqlDbType.VarChar)).Value = "A"
            .Parameters.Add(New SqlParameter("inValue2", Data.SqlDbType.VarChar)).Value = "B"
        End With
        '以下でカーソルを取得する
        '???? = cmd.ExecuteReader
    End Using
End Using

''引数なしで、戻り値(数値)を受け取る場合
Using con As New SqlConnection("接続文字列")
    Using cmd As New SqlCommand
        con.Open()
        With cmd
            .Connection = con
            .CommandType = Data.CommandType.StoredProcedure
            .CommandText = "HogeHogeProcedure"
            .Parameters.Add(New SqlParameter("ReturnValue", SqlDbType.Int, 4))
            .Parameters("ReturnValue").Direction = ParameterDirection.ReturnValue
            .ExecuteNonQuery()
        End With
    End Using
End Using


ぷりお  2006-08-02 21:19:18  No: 132576

うなまな様

先日に引き続きありがとうございます。

調べ方の努力が足りずにご迷惑をお掛けして申し訳ありません。

ご記載頂いたサンプルコードで早速試してみたいと思います。

後からの報告で申し訳ないのですが、

このサンプルコードはSQLサーバ内にある作成済みの

ストアドプロシージャでも使用できるのでしょうか?

一度、試してみて再度ご報告致します。


ぷりお  2006-08-03 01:04:58  No: 132577

先程、うなまな様よりご指導頂き挑戦したのですが、

希望通りになりませんでした。

当方の内容は、SQLサーバにテーブルとビューとストアドがあります。

SQLには接続してあります。

作成したフォームにコンボボックスを2つ作成しました。

コンボAにはSQLのストアドを設定してうまく起動しています。

今回実行したい事は、コンボAで選択した値と一致する内容のみを

コンボBで表示させたいのです。

例としまして、

コンボAで食べ物フィールドの「果物」を選択した場合、

コンボBではコンボボックスAで選択された

食べ物フィールドの「果物」と入力されている内容を表示すると

いった具合です。

コンボA・B共にテーブルには食べ物フィールドがあります。

Using con As New SqlClient.SqlConnection("接続文字列")
Using cmd As New SqlClient.SqlCommand

con.Open()

With cmd
.Connection = con
.CommandType = Data.CommandType.StoredProcedure
.CommandText = "q生活_食べ物"
.Parameters.Add(New SqlParameter("@種類", Data.SqlDbType.VarChar)).Value = コンボBComboBox
End With
End Using
End Using

上記の様にしたのですが、どこが間違っているのでしょうか?

今までは「access」+「SQLサーバ」で動かしていまして、

同じ内容のものをVB2005にて作成しています。

コードが全然違うので困っています。

宜しくお願いします。


うなまな  2006-08-03 01:32:00  No: 132578

まず、以下のようなストアドがあるとして
---------------------------------------------------------ストアドここから
ALTER PROCEDURE [dbo].[q生活_食べ物]
         @種類     VARCHAR(6)
AS
BEGIN

SELECT * FROM 生活_食べ物テーブル WHERE 種類 = @種類

END
---------------------------------------------------------ストアドここまで

上記のストアドを利用したテストを行います。

---------------------------------------------------------ソースここから
Using con As New SqlConnection("接続文字列")
    Using cmd As New SqlCommand
        con.Open()
        With cmd
            .Connection = con
            .CommandType = Data.CommandType.StoredProcedure
            .CommandText = "q生活_食べ物"
            .Parameters.Add(New SqlParameter("@種類", Data.SqlDbType.VarChar)).Value = "果物"
        End With
        '------------------------------------------------ここでストアドの戻り値を取得します
        Dim dr As SqlDataReader = cmd.ExecuteReader
        While dr.Read
            Debug.WriteLine(dr("フィールド名"))
        End While
        '------------------------------------------------
    End Using
End Using
---------------------------------------------------------ソースここまで

これでデバッグウインドウに指定したフィールドが列挙されれば、OKですね。


ぷりお  2006-08-03 03:02:27  No: 132579

うなまな様

本当にありがとうございます。

ご提示頂いたコードを試しました所、

ウィンドウには正確に表示されましたが、

実際のフォームにあるコンボBには、

ウィンドウで出た内容が出てきませんでした。

>While dr.Read
> Debug.WriteLine(dr("フィールド名"))
>End While

この部分をコンボBで選択できる様なコードを書けば良いと思うのですが、

me.コンボB.text=(dr(食べ物))

と入力しても無反応でした。

申し訳ありませんが、宜しくお願いします。


うなまな  2006-08-03 04:11:44  No: 132580

コンボAでアイテムを追加されているようですが・・・
それはどのように行なっているのでしょうか?


ぷりお  2006-08-03 16:20:48  No: 132581

うなまな様

コンボAにはSQLにあるストアドを

プロパティのDataSourceに設定しております。
(SelectedValue、DisplayMember、ValueMemberも設定しました。)

返答が間違っていますでしょうか?


うなまな  2006-08-03 16:49:43  No: 132582

コンボボックスにアイテムを追加すればいいので、

コンボB.Items.Clear
While dr.Read
    コンボB.Items.Add(dr("フィールド名").ToString)
End While

こういうことかな?


うなまな  2006-08-03 17:30:06  No: 132583

DataSourceに指定する場合は、

Using con As New SqlConnection("接続文字列")
    Using da As New SqlDataAdapter("q生活_食べ物", con)
        With da.SelectCommand
            .CommandType = Data.CommandType.StoredProcedure
            .Parameters.Add(New SqlParameter("@種類", Data.SqlDbType.VarChar)).Value = "果物"
        End With
        Using ds As New DataSet
            da.Fill(ds, "生活_食べ物")
            Me.コンボB.DataSource = ds.Tables("生活_食べ物").DefaultView
            Me.コンボB.DisplayMember = "食べ物名称"
            Me.コンボB.ValueMember = "食べ物コード"
        End Using
    End Using
End Using

こんな感じですね。Itemsに追加するか、DataSourceに指定するかは、作成している
システムに良い方を選択してください。


ぷりお  2006-08-03 18:28:39  No: 132584

うなまな様

心より感謝致します。

DataSourceの場合とItemの場合の両方試しましたが、

共に希望する内容になりました。

どちらを選択するかは、ご記載頂いた通り

システムに良い方を選択したいと思います。

また、不明点が出てきた際はお世話になると思いますが、

宜しくお願いします。

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


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加