2017-05-02 67 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

相关问题