gpt4 book ai didi

c# - 如何在C#(ASP.Net)中调用参数化存储过程?

转载 作者:行者123 更新时间:2023-11-30 12:39:52 24 4
gpt4 key购买 nike

我正在开发一个 web 应用程序,我希望用户在文本框中输入一个字符串,然后单击搜索按钮;它将在整个数据库中搜索用户输入的字符串(即它将在​​ GridView 中显示数据库名称、架构名称、表名称、列名称和记录名称)。

我已经用 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() 中运行选择查询。

这是我的代码:

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();
}
}
}
}
}
}

最佳答案

button_Click 中为 cmd.ExecuteNonQuery(); 分配一个 int 值 i

例如:

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

更新注意:我看到您将数据库和模式作为过程中的参数传递,但在连接字符串中您将定义它,当您从 SQL 执行时它会很有用,但在进入应用程序时您不需要使用它们是因为您将说明 web-config 是哪个数据库和模式,因此它将是多余的。

关于c# - 如何在C#(ASP.Net)中调用参数化存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43729975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com