私は、ユーザーがテキストボックスに文字列を入力し、検索ボタンをクリックしたいという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();
}
}
}
}
}
}
どのようなエラーが発生していますか? – Webruster
それは私にエラーも例外も与えません。しかし、実行時にBindGrid()が正常に実行され、グリッドビューに結果が表示されます(SqlCommand cmd = new SqlCommand( "Select * from tempdb.dbo.result")) – Iqraa
DBにデータを挿入できますか? – Webruster