質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • SQL

    2571questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • VB.NET

    969questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    562questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NETでストアドプロシージャの使い方

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 895

erumoa

score 1

こんにちは
Visual studioを使って
VB.NETで商品検索機能を作成することにしたのですが
データベースからストアドプロシージャを使って検索しましたが
うまく検索結果を表示されることができません。
おそらくストアドプロシージャを呼び出せてないかと思います。

流れは検索条件として商品コードと商品名をテキストボックスで取得して
ボタンをクリックするとdtoクラスのlistItemメソッドでSQLの処理をし
結果をDataSet型で返して、GridViewに結果を入れる

   '商品検索メソッド
    Public Function listItem(name As String, code As Integer) As DataSet
        Dim setting As ConnectionStringSettings =ConfigurationManager.ConnectionStrings("SelfAsp")

        Using db As New SqlConnection(setting.ConnectionString)
            db.Open()
            Dim comm As SqlCommand = db.CreateCommand
            comm.CommandType = CommandType.StoredProcedure
            comm.CommandText = "DrinklistItem"
            Dim dataSet As DataSet = New DataSet()
            comm.Parameters.Clear()
            'ストアドプロシージャに引数を渡す
            comm.Parameters.Add("@Namelist", SqlDbType.Text).Value = name
            comm.Parameters.Add("@Codelist", SqlDbType.Int).Value = code
            '検索結果をDataSet型に渡す
            Using adapter As SqlDataAdapter = New SqlDataAdapter(comm)
                adapter.Fill(dataSet, "drink")
            End Using
            comm.ExecuteNonQuery()

            Return dataSet
            db.Close()
        End Using
    End Function
   Protected Sub listbtn_Click(sender As Object, e As EventArgs) Handles listbtn.Click
        Dim code As Integer = TextCode.Text
        Dim name As String = TextName.Text
        Dim dataSet As DataSet
        Dim dto As New dto
        dataSet = dto.listItem(name, code)
        Me.Gridlist.DataSource = dataSet

    End Sub


ストアドプロシージャです。

CREATE PROCEDURE [dbo].[DrinklistItem](
@Namelist nvarchar(200),
@Codelist int)

AS
begin

SELECT  [code],[name],[price],[count],[favorite]
FROM [drink]
WHERE name LIKE '%@Namelist%' OR code LIKE '%@Codelist%'

END
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/06/26 21:54

    何を作っているかと開発環境ぐらいは書けませんか?

    キャンセル

回答 3

+3

質問に対する私のコメントへの返答をもらってませんので、作っているのは ASP.NET Web Forms アプリで DB は SQL Server であろうと勝手に想像してレスを書いておきます。質問者さんの実際の環境とは違うかもしれませんが。

まずストアドの WHERE 句の部分が間違っているようです。

code は文字型ではないですよね? int 型ではないかと想像していますが、そうだとすると LIKE 句は使えません。

name の方は文字型のようですが LIKE '%@Namelist%' ではうまくいかないかと思われます。

あと、OR ではなくて AND の間違いだと想像してます。

そこを直して、あとは自力でコードを書かないで GridView + SqlDataSource を使ってデザイナでアプリを作れば多分自力では一行もコードを書かなくても望むことができると思います。

質問者さんの DB では試せませんので、Microsoft が提供するサンプルデータベースの Ptoducts テーブルを使って検証してみましたが、ストアドがきちんとできていれば、それをベースにデザイナで作れば簡単に完成します。

ご参考に検証に使ったコードを以下にアップしておきます。(.aspx.cs はデフォルトで生成されたものに手を加えてないので省略)

ストアドプロシージャ(SSMS で作成)

USE [NORTHWIND]
GO
/****** Object:  StoredProcedure [dbo].[ProductList]    Script Date: 06/27/2018 11:48:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[ProductList]
(
    @name nvarchar(250),
    @catId int
)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT [ProductID],[ProductName],[SupplierID],[CategoryID],[UnitPrice]
    FROM [Products]
    WHERE ([ProductName] LIKE N'%' + @name + N'%') AND ([CategoryID] = @catId)
END


.aspx

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="0041-StoredProcAndGridView.aspx.cs" 
    Inherits="_0041_StoredProcAndGridView" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        ProductName: <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        CategoryID: <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" Text="PostBack" />
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NORTHWINDConnectionString %>" 
            SelectCommand="ProductList" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:ControlParameter ControlID="TextBox1" 
                    Name="name" PropertyName="Text" Type="String" />
                <asp:ControlParameter ControlID="TextBox2"
                     Name="catId" PropertyName="Text" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ProductID" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="ProductID" HeaderText="ProductID" 
                    InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
                <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
                    SortExpression="ProductName" />
                <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" 
                    SortExpression="SupplierID" />
                <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" 
                    SortExpression="CategoryID" />
                <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
                    SortExpression="UnitPrice" />
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/27 17:10

    コメント遅くなり申し訳ございませんでした。
    解決しました。
    回答ありがとうございました。

    キャンセル

  • 2018/06/27 18:20

    どのように解決したのか書いていただけませんか? ここのようなサイトは情報共有を目的としているので、質問者さんがどのように解決したかの情報も役に立ちますし、情報提供は義務とまではいわないもののマナーではあると思いますので。

    自分としては、上に指摘した「code は文字型ではないですよね? int 型ではないかと想像していますが、そうだとすると LIKE 句は使えません」というところをどう解決したのかお聞きしたいです。

    キャンセル

checkベストアンサー

0

1,商品検索メソッド側のストアドプロシージャに渡す型の定義が違います。

-comm.Parameters.Add("@Namelist", SqlDbType.Text).Value = name
+comm.Parameters.Add("@Namelist", SqlDbType.NVarChar, 200).Value = name


2,adapter.Fill(dataSet, "drink")を行っているので、comm.ExecuteNonQueryは不要です。

comm.ExecuteNonQuery()


3,Return後にdb.Close()を行っているため、Close行は実行されません。

Return dataSet
db.Close()

ストアドプロシージャ側
4,渡されたパラメータではなくシングルクォートで囲った固定文字列を条件式としています。

WHERE name LIKE '%@Namelist%' OR code LIKE '%@Codelist%'
WHERE name LIKE '%' + @Namelist + '%' OR code LIKE '%' + @Codelist + '%'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/27 17:10

    おかげさまで、解決できました。
    ありがとうございました。

    キャンセル

0

GridのDataSourceにDataSetを設定しているのであれば、DataMemberでテーブル名("drink"かな?)を設定しなくてはいけないのではないでしょうか。
System.Windows.Forms.DataGridViewの話なので、タグでASP.NETがあるので外しているかもしれませんが・・・

何にしろ、ストアドを実行した後、それが成功しているのか、データが取得できているのかデバッガで確認するとかログで件数を出してみるとか別の手段で確認すべきかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/27 17:11

    回答ありがとうございました。
    解決できました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • SQL

    2571questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • VB.NET

    969questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    562questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。