C# 无法按预期从数据库检索值。需要正确的查询才能获得答案
有四个文本框,用户在其中输入值,并根据这些值在gridview中显示结果 问题是,当用户留下一些文本框时,结果将仅基于其他三个文本框显示。但我的查询在这里不起作用。我在这里面临问题C# 无法按预期从数据库检索值。需要正确的查询才能获得答案,c#,asp.net,C#,Asp.net,有四个文本框,用户在其中输入值,并根据这些值在gridview中显示结果 问题是,当用户留下一些文本框时,结果将仅基于其他三个文本框显示。但我的查询在这里不起作用。我在这里面临问题 protected void LoadGridData5() { try { GridView1.Visible = false; con.Open(); string ID = IDTEXT.Text;
protected void LoadGridData5()
{
try
{
GridView1.Visible = false;
con.Open();
string ID = IDTEXT.Text;
string ROLE = DropDownList2.SelectedValue.ToString();
string str = TextBox1.Text.ToString();
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID;
cmd.Parameters.Add("@NAME", SqlDbType.NVarChar).Value =str;
cmd.Parameters.Add("@ROLE", SqlDbType.VarChar).Value =ROLE;
cmd.Parameters.Add("@DOB", SqlDbType.DateTime).Value =DOBTEXT.Text;
SqlCommand cmd = new SqlCommand("SP_OPERATORS", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds, "OPERATOR");
cmd.ExecuteNonQuery();
//GridView1.DataSource = ds;
//GridView1.DataBind();
//con.Close();
if (ds.Tables[0].Rows.Count > 0)
{
GridView1.DataSource = ds;
GridView1.DataBind();
}
else
{
ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
GridView1.DataSource = ds;
GridView1.DataBind();
int columncount = GridView1.Rows[0].Cells.Count;
GridView1.Rows[0].Cells.Clear();
GridView1.Rows[0].Cells.Add(new TableCell());
GridView1.Rows[0].Cells[0].ColumnSpan = columncount;
GridView1.Rows[0].Cells[0].Text = "No Records Found";
}
}
catch
{
//Response.Redirect("Error.aspx");
}
finally
{
con.Close();
}
}
这是存储过程
CREATE PROCEDURE SP_OPERATORS
@ID INT,
@NAME NVARCHAR(50),
@DOB DATETIME,
@ROLE VARCHAR(50)
AS
Set NoCount ON
Declare @SQLQuery AS NVarchar(4000)
Declare @ParamDefinition AS NVarchar(2000)
Set @SQLQuery = 'Select * From [OPERATOR] where (1=1) '
If @NAME Is Not Null
Set @SQLQuery = @SQLQuery + ' And (NAME LIKE '''+ '%' + @NAME + '%' + ''')'
If @ID Is Not Null
Set @SQLQuery = @SQLQuery + ' And (ID=@ID)'
If @DOB Is Not Null
Set @SQLQuery = @SQLQuery + ' And (DOB=@DOB)'
If @ROLE Is Not Null
Set @SQLQuery = @SQLQuery + ' And (ROLE=@ROLE)'
If (@NAME Is Not Null) AND (@DOB Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (NAME LIKE '''+ '%' + @NAME + '%' + ''')'+'And (DOB=@DOB)'
If (@NAME Is Not Null) AND (@ROLE Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (NAME LIKE '''+ '%' + @NAME + '%' + ''')'+' And (ROLE=@ROLE)'
If (@DOB Is Not Null) AND (@ID Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (DOB=@DOB)'+' And (ID=@ID)'
If (@ROLE Is Not Null) AND (@ID Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (ROLE=@ROLE)'+' And (ID=@ID)'
If (@ROLE Is Not Null) AND (@DOB Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (DOB=@DOB)'+' And (ROLE=@ROLE)'
If (@NAME Is Not Null) AND (@ID Is Not Null ) AND (@ROLE Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (NAME LIKE '''+ '%' + @NAME + '%' + ''')'+' And (ID=@ID)'+ ' And (ROLE=@ROLE)'
If (@NAME Is Not Null) AND (@ID Is Not Null ) AND (@DOB Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (NAME LIKE '''+ '%' + @NAME + '%' + ''')'+' And (ID=@ID)'+ ' And (DOB=@DOB)'
If (@ROLE Is Not Null) AND (@ID Is Not Null ) AND (@DOB Is Not Null )
Set @SQLQuery = @SQLQuery + ' And (ROLE=@ROLE)'+' And (ID=@ID)'+ ' And (DOB=@DOB)'
If (@NAME Is Not Null) AND (@ID Is Not Null ) AND (@DOB Is Not Null ) AND (@ROLE Is Not Null)
Set @SQLQuery = @SQLQuery + ' And (NAME LIKE '''+ '%' + @NAME + '%' + ''')'+' And (ID=@ID)'+ ' And (ROLE=@ROLE)' + ' And (DOB=@DOB)'
Set @ParamDefinition =
' @ID INT,
@NAME NVARCHAR(50),
@DOB DATETIME,
@ROLE VARCHAR(50)'
Execute sp_Executesql @SQLQuery,
@ParamDefinition,
@ID,
@NAME,
@ROLE,
@DOB
If @@ERROR <> 0 GoTo ErrorHandler
Set NoCount OFF
Return(0)
ErrorHandler:
Return(@@ERROR)
GO
您对da.Fillds的调用将执行查询,之后不需要额外的cmd.ExecuteNonQuery 出于您自己的考虑,请将用于查询的构造字符串切换为对存储过程的调用或参数化查询。如果有人在这些文本框中输入恶意值,您将面临SQL注入。这里和这里有更多的细节
还不太清楚您试图对查询执行什么操作。目前,它将尝试匹配您指定的所有参数,因为您在每个谓词之间使用“and”。如果您试图进行搜索,您可能希望其中一些是“or”,或者您可能只希望在提供值的位置添加谓词。例如,目前,如果您将ID文本框留空,您将只返回运算符ID为空的结果,这听起来与您的意图不符。该查询显然会失败,只需在SSM上直接运行该查询,并使用示例值和您的代码打开SQL注入。最好在SP中执行此操作。请参阅一些示例搜索SP.NB:您正在使用ExecuteOnQuery执行查询。请参见“是”,如果我将文本框留空,那么查询应该是什么,以便我检索的值不考虑空文本框。留下一个文本框就像考虑那个属性的所有可能性。这就是我的意思。因此,如果查询中有ID='+ID+'部分,那么当值为空时仍将对其进行检查。您需要根据是否为这些文本框指定了值来构造SQL查询,因此如果您没有提供ID,则不应该向查询中添加ID=的谓词。尽管像这样的程序经常因为性能问题而受到反对,您可以在存储过程中使用此处指定的模式,以便在指定特定参数时仅使用值。正如您所说,我已创建了一个存储过程并尝试运行,但无法按预期运行。如果使用存储过程中使用的查询和用于调用的代码更新原始帖子它,我们也许能找出问题所在。更新。请看一看