简体   繁体   English

根据ASP.NET文本字段的内容选择SQL搜索字符串

[英]Select SQL Search String Based on Content of ASP.NET Text Field

The goal of the code-behind below is to select a SQL SELECT statement in a string variable based on whether or not a text box is or is not null, then execute the statement. 下面代码的目标是根据文本框是否为null来选择字符串变量中的SQL SELECT语句,然后执行该语句。 I've tried both using a variable and directly executing the SELECT statement using 我一直都使用一个变量,直接执行试图SELECT using语句

SqlDataSource1.SelectCommand = 'SELECT...' 

Unfortunately, neither method is returning anything at all when I put data in the text fields to be checked. 不幸的是,当我将数据放在要检查的文本字段中时,这两种方法都没有返回任何结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data.Sql;

namespace MyProgram
{
    public partial class WebForm1 : System.Web.UI.Page
    {
       string query = "";

        protected void Page_Load(object sender, EventArgs e)
        {

            SqlDataSource1.SelectCommand = query;
            SqlDataSource1.SelectParameters.Add("NameLast", SearchLast.ToString());
            SqlDataSource1.SelectParameters.Add("NameFirst", SearchFirst.ToString());
            SqlDataSource1.SelectParameters.Add("SSN", SearchSSN.ToString());
            SqlDataSource1.SelectParameters.Add("DOB", SearchDOB.ToString());
            SqlDataSource1.SelectParameters.Add("Case", SearchCase.ToString());

        }

        protected void Button1_Click(object sender, EventArgs e)
        {

                if (SearchCase.Text != string.Empty)
                {
                    SqlDataSource1.SelectCommand = "SELECT CLTCAS,CLTLST+', '+CLTFST,DATEFROMPARTS(cltbyr,cltbmm,cltbdd),CLTCTY+', '+[ CLTSTA],CLTSSN,CLTSEX FROM CLTMST WHERE CLTCAS = @Case";
                }
                if (SearchSSN.Text != string.Empty && SearchSSN.Text.Length == 4 && SearchLast.Text == string.Empty && SearchFirst.Text == string.Empty)
                {
                    SqlDataSource1.SelectCommand = "SELECT CLTCAS,CLTLST+', '+CLTFST,DATEFROMPARTS(cltbyr,cltbmm,cltbdd),CLTCTY+', '+[ CLTSTA],CLTSSN,CLTSEX FROM CLTMST WHERE right(CLTSSN,4) = @SSN";
                }
                if (SearchSSN.Text != string.Empty && SearchSSN.Text.Length == 9 && SearchLast.Text != string.Empty && SearchFirst.Text == string.Empty)
                {
                    query = "SELECT CLTCAS,CLTLST+', '+CLTFST,DATEFROMPARTS(cltbyr,cltbmm,cltbdd),CLTCTY+', '+[ CLTSTA],CLTSSN,CLTSEX FROM CLTMST WHERE CLTSSN = @SSN";
                }
                if (SearchLast.Text != string.Empty && SearchFirst.Text != string.Empty && SearchDOB.Text == string.Empty && SearchSSN.Text == string.Empty)
                {
                    query = "SELECT CLTCAS,CLTLST+', '+CLTFST,DATEFROMPARTS(cltbyr,cltbmm,cltbdd),CLTCTY+', '+[ CLTSTA],CLTSSN,CLTSEX FROM CLTMST WHERE CLTLST = @NameLast and CLTFST like @NameFirst+'%'";
                }
                if (SearchLast.Text != string.Empty && SearchFirst.Text == string.Empty && SearchSSN.Text == string.Empty && SearchDOB.Text == string.Empty)
                {
                    query = "SELECT CLTCAS,CLTLST+', '+CLTFST,DATEFROMPARTS(cltbyr,cltbmm,cltbdd),CLTCTY+', '+[ CLTSTA],CLTSSN,CLTSEX FROM CLTMST WHERE CLTLST = @NameLast+'%'";
                }
                if (SearchLast.Text == string.Empty && SearchFirst.Text == string.Empty && SearchSSN.Text == string.Empty && SearchDOB.Text != string.Empty)
                {
                    query = "SELECT CLTCAS,CLTLST+', '+CLTFST,DATEFROMPARTS(cltbyr,cltbmm,cltbdd),CLTCTY+', '+[ CLTSTA],CLTSSN,CLTSEX FROM CLTMST WHERE (cltbyr+'-'+cltbmm+'-'+cltbdd = @DOB)";
                }
                if (SearchLast.Text != string.Empty && SearchFirst.Text == string.Empty && SearchSSN.Text == string.Empty && SearchDOB.Text != string.Empty)
                {
                    query = "SELECT CLTCAS,CLTLST+', '+CLTFST,DATEFROMPARTS(cltbyr,cltbmm,cltbdd),CLTCTY+', '+[ CLTSTA],CLTSSN,CLTSEX FROM CLTMST WHERE CLTLST = @NameLast+'%' AND (cltbyr+'-'+cltbmm+'-'+cltbdd = @DOB)";
                }
        }

        protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {

        }
    }
}

I think you would be better off doing this declaratively, with ControlParameters. 我认为您最好使用ControlParameters声明性地执行此操作。 In your markup, you would have a <SelectParameters> section to your SqlDataSource1 declaration: 在您的标记中,您将对SqlDataSource1声明有一个<SelectParameters>部分:

<asp:SqlDataSource ID="SqlDataSource1" runate="server"
    CancelSelectOnNullParameter="False" ...other stuff... >
    ...other stuff...
    <SelectParameters>
        <asp:ControlParameter name="NameLast" controlid="SearchLast" propertyname="Text"/>
        <asp:ControlParameter name="NameFirst" controlid="SearchFirst" propertyname="Text"/>
        <asp:ControlParameter name="SSN" controlid="SearchSSN" propertyname="Text"/>
        <asp:ControlParameter name="DOB" controlid="SearchDOB" propertyname="Text"/>
        <asp:ControlParameter name="Case" controlid="SearchCase" propertyname="Text"/>
    </SelectParameters>
</asp:SqlDataSource>

This way you don't have to deal with adding them on Page_Load. 这样,您不必处理将它们添加到Page_Load上的问题。 Notice that I added the CancelSelectOnNullParameter property, and set it to false. 注意,我添加了CancelSelectOnNullParameter属性,并将其设置为false。 That way your query will execute, even if some of the values are empty. 这样,即使某些值是空的,查询也将执行。

You could also combine all your queries into one, that way you don't need to have all those if statements in your click event: 您还可以将所有查询合并为一个,这样就无需在click事件中拥有所有这些if语句:

SELECT 
    CLTCAS, 
    CLTLST+', '+CLTFST,
    DATEFROMPARTS(cltbyr,cltbmm,cltbdd), 
    CLTCTY+', '+[ CLTSTA],
    CLTSSN,
    CLTSEX 
FROM CLTMST 
WHERE 
    CLTCAS = @Case
    OR right(CLTSSN,4) = @SSN
    OR CLTSSN = @SSN
    OR (CLTLST = @NameLast AND CLTFST LIKE @NameFirst+'%')
    OR CLTLST LIKE @NameLast+'%'
    OR cltbyr+'-'+cltbmm+'-'+cltbdd = @DOB
    OR (CLTLST LIKE @NameLast+'%' AND (cltbyr+'-'+cltbmm+'-'+cltbdd = @DOB))

As far as your original code goes, when you add TextBox values as parameters, you want to add the .Text property as the default value: 就您的原始代码而言,当您将TextBox值添加为参数时,您想将.Text属性添加为默认值:

SqlDataSource1.SelectParameters.Add("NameLast", SearchLast.Text);

You need something like this 你需要这样的东西

In the class scope 在班级范围内

private bool _hasWhere;

Method to dynamically build Select statement 动态构建Select语句的方法

private string GetSelectSql()
{

    string sql = "Select ...... From .... "; // also, make sql a StringBuilder

    if (txtLastName.Text.Trim() != string.empty)
    {
        if (SetWhere()) 
            sql += " Where ";
        else 
           sql += ",";  
        sql += string.Format(" LastName like '%{0}%' ", txtLastName);
    }

    if (txtFirstName.Text.Trim() != string.empty)
    {
        if (SetWhere()) 
           sql += " Where ";
        else 
           sql += ",";  
        sql += string.Format(" FirstName like '%{0}%' ", txtLastName);
    }
    // keep on going here .................

    return sql;
}

Helper method to identify if where was inserted already 识别是否已插入where辅助方法

// if your sql was StringBuilder you would just pass it here and do sb.Append(" Where ")
private bool SetWhere()
{
    if (!hasWhere) 
    {
       hasWhere = true;
       return true;
    }
    return false;
}

A method that gets you the command object 一种获取命令对象的方法

private SqlCommand CreateCommand (string sql)
{

    .............
    SqlCommand command = new Sqlcommand(sql,....
    .............
    return Command
 }

So then you can assign your command right before executing it 因此,您可以在执行命令之前立即分配命令

SqlDataSource1.SelectCommand = CreateCommand(GetSelectSql()) 

This is not fully functional code but I hope this will give you an idea what you need to do 这不是功能齐全的代码,但我希望这能使您了解您需要做什么

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM