2017-05-02 14 views
4

私は、ユーザーがテキストボックスに文字列を入力し、検索ボタンをクリックしたいというWebアプリケーションを開発しています。ユーザーが入力した文字列をデータベース全体で検索します(つまり、データベース名、スキーマ名、表名、列名、レコード名がグリッド表示されます)。C#(ASP.Net)でパラメータ化されたストアドプロシージャを呼び出す方法

私はすでにSQLでストアドプロシージャを書いて実行していた、それに成功した場合、ストアドプロシージャのデータベースに入力した文字列を検索し、tempdb.dbo.resultという名前のテーブルにデータを挿入します。ここで

は、データベース内の文字列検索のための私のストアドプロシージャです:

Use tempdb 
GO 

Create Table Result 
(
    [Sno] int identity(1,1), 
    [Database Name] sysname, 
    [Schema Name] sysname, 
    [Table Name] sysname, 
    [Column Name] sysname, 
    [Record Name] varchar(Max) 
) 

USE TestDB2 
GO 

CREATE PROCEDURE Find_Record_Across_Tables_Proc 
    @Database sysname, 
    @Schema sysname, 
    @Table sysname, 
    @String VARCHAR(Max) 
AS 
    DECLARE @SqlString varchar(Max) 
    DECLARE @Table_Schema sysname 
    DECLARE @Table_Name sysname 
    DECLARE @Column_Name sysname 

    --Declare Cursor 
    SET @SqlString = 'DECLARE String_cursor CURSOR FOR 
    Select TABLE_SCHEMA, TABLE_NAME ,COLUMN_NAME from 
    ' + @Database +'.INFORMATION_SCHEMA.COLUMNS 
    Where DATA_TYPE IN (''text'',''ntext'',''varchar'' 
    ,''nvarchar'',''char'',''nchar'')' 

    --Filter schema name 
    IF @schema IS NOT NULL 
    Begin 
     SET @SqlString = @SqlString + ' And TABLE_SCHEMA=''' + @Schema + '''' 
    End 

    --Filter table name 
    IF @table IS NOT NULL 
    Begin 
     SET @SqlString = @SqlString + ' And TABLE_NAME=''' + @table + '''' 
    End 

    Print @SqlString 
    EXEC (@SqlString) 

OPEN String_cursor 

FETCH NEXT FROM String_cursor 
INTO @Table_Schema, @Table_Name, @Column_Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @SqlString = 'IF EXISTS(SELECT ' + QUOTENAME(@Column_Name) 
+ ' FROM ' + @Database + '.' + QUOTENAME(@Table_Schema) 
+ '.' + QUOTENAME(@Table_Name) 
+ ' WHERE ' + QUOTENAME(@Column_Name) 
+ ' Like ''%' + @string + '%'') 
Insert into tempdb.dbo.result 
([Database Name],[Schema Name] 
,[Table Name],[Column Name],[Record Name]) 
SELECT ''' + QUOTENAME(@Database) + ''',''' 
+ QUOTENAME(@Table_Schema) + ''',''' 
+ QUOTENAME(@Table_Name) + ''','''' 
+ ''' + QUOTENAME(@Column_Name) 
+ ''',' + QUOTENAME(@Column_Name) 
+ ' FROM ' + @Database + '.' 
+ QUOTENAME(@Table_Schema) 
+ '.' + QUOTENAME(@Table_Name) 
+ ' WHERE ' + QUOTENAME(@Column_Name) 
+ ' Like ''%' + @string + '%''' 
Print @SqlString 
EXEC (@SqlString) 

FETCH NEXT FROM String_cursor 
INTO @Table_Schema, @Table_Name, @Column_Name 

END 
CLOSE String_cursor 
DEALLOCATE String_cursor 
GO 

私が正常にこれらのコマンドを使用してSQLにこのストアドプロシージャを実行していた:

Use TestDB2 
GO 

EXEC Find_Record_Across_Tables_Proc 
'TestDB2(My database name)', NULL, NULL ,'string to be searched' 
GO 

Select * from tempdb.dbo.result 
GO 

今私は(コール)を実行するたびにこのパラメーター化されたストアドプロシージャをWebアプリケーションから取得すると、コンパイラはストアドプロシージャを呼び出す際に例外を表示しませんが、選択クエリはBindGrid()でのみ実行されます。ここで

が、そのために私のコードです:cmd.ExecuteNonQuery();のためのあなたのbutton_Click

public partial class WebForm1 : System.Web.UI.Page 
{ 
    DataSet ds = new DataSet(); 
    SqlConnection con; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     String value = TextBox1.Text.ToString(); 

     con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString); 
     con.Open(); 

     SqlCommand cmd = new SqlCommand("Find_Record_Across_Tables_Proc", con); 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.AddWithValue("@Database", "TestDB2"); 
     cmd.Parameters.AddWithValue("@Schema", "NULL"); 
     cmd.Parameters.AddWithValue("@Table", "NULL"); 
     cmd.Parameters.AddWithValue("@String", value); 

     cmd.ExecuteNonQuery(); 
     con.Close(); 

     this.BindGrid(); 
    } 

    private void BindGrid() 
    { 
     string constr = ConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString; 

     using (SqlConnection con = new SqlConnection(constr)) 
     { 
      using (SqlCommand cmd = new SqlCommand("Select * from tempdb.dbo.result")) 
      { 
        using (SqlDataAdapter sda = new SqlDataAdapter()) 
        { 
         cmd.Connection = con; 
         sda.SelectCommand = cmd; 
         using (DataTable dt = new DataTable()) 
         { 
          sda.Fill(dt); 
          GridView1.DataSource = dt; 
          GridView1.DataBind(); 
         } 
        } 
       } 
      } 
     } 
    } 
+0

どのようなエラーが発生していますか? – Webruster

+0

それは私にエラーも例外も与えません。しかし、実行時にBindGrid()が正常に実行され、グリッドビューに結果が表示されます(SqlCommand cmd = new SqlCommand( "Select * from tempdb.dbo.result")) – Iqraa

+0

DBにデータを挿入できますか? – Webruster

答えて

1

だけint型の値を割り当てるi

例:

int i =cmd.ExecuteNonQuery(); 
if(i>0) 
{ 
    this.BindGrid(); 
} 

更新 注:私はあなたがDBとスキーマをプロのパラメータとして渡しているのを見るcedureを使用する必要はありませんが、接続文字列ではこれを定義します.SQLからやっているときに便利ですが、アプリケーションにアクセスする際には使用する必要はありません。それは冗長になります。

+0

を表示私がチェックしているが、今、それはスキップtempdb.dbo.result表、つまり、正常実行されますもしあれば。与え-1の値をI – Iqraa

+0

に@Iqraaをああ、それは – Webruster

+0

@Iqraa '文字列値= TextBox1.Text.ToString()しまった、とこの文は、[私は= cmd.ExecuteNonQuery()はINT];'これであなたはそれをキャストする必要がいけませんtoStringも、あなたがストアドプロシージャに値を渡しながら、それは同じ順序と同じ名前にする必要が同じ順序を以下の通りです(私が意味する、大文字と小文字を区別) – Webruster

関連する問題