Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法按预期从数据库检索值。需要正确的查询才能获得答案_C#_Asp.net - Fatal编程技术网

C# 无法按预期从数据库检索值。需要正确的查询才能获得答案

C# 无法按预期从数据库检索值。需要正确的查询才能获得答案,c#,asp.net,C#,Asp.net,有四个文本框,用户在其中输入值,并根据这些值在gridview中显示结果 问题是,当用户留下一些文本框时,结果将仅基于其他三个文本框显示。但我的查询在这里不起作用。我在这里面临问题 protected void LoadGridData5() { try { GridView1.Visible = false; con.Open(); string ID = IDTEXT.Text;

有四个文本框,用户在其中输入值,并根据这些值在gridview中显示结果

问题是,当用户留下一些文本框时,结果将仅基于其他三个文本框显示。但我的查询在这里不起作用。我在这里面临问题

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=的谓词。尽管像这样的程序经常因为性能问题而受到反对,您可以在存储过程中使用此处指定的模式,以便在指定特定参数时仅使用值。正如您所说,我已创建了一个存储过程并尝试运行,但无法按预期运行。如果使用存储过程中使用的查询和用于调用的代码更新原始帖子它,我们也许能找出问题所在。更新。请看一看