我正在开发一个Web应用程序,我希望用户在文本框中输入一个字符串并单击搜索按钮;它将在整个数据库中搜索用户输入的字符串(即它将在网格视图中显示数据库名称,模式名称,表名称,列名称和记录名称).
我已经在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 +'.@R_267_4045@ION_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,@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,'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(); } } } } } }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。