2017-05-02 70 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()中運行select查詢。

這裏是我的代碼:

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

在你button_Clickcmd.ExecuteNonQuery();只是分配一個int值i

例:

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

更新 注意:我看到你正在傳遞DB和Schema作爲參數但是在連接字符串中,你將定義這個,當你從SQL中進行操作時,它會很有用,但是在進入應用程序時,你不需要使用它們,因爲你將聲明web-config數據庫和模式,所以這將是一個多餘的。

+0

我已檢查,但現在它跳過如果部分。並且這個語句[int i = cmd.ExecuteNonQuery();]給-1給我 – Iqraa

+0

@Iqraa啊得到了它 – Webruster

+0

@Iqraa'String value = TextBox1.Text.ToString();'在這個你不需要施放它tostring也是,你是否遵循相同的順序,同時將值傳遞給存儲過程,它應該是在相同的順序和相同的名稱(我的意思是區分大小寫) – Webruster

相關問題