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

C# 根据ASP.NET文本字段的内容选择SQL搜索字符串,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,下面代码隐藏的目标是根据文本框是否为空,在字符串变量中选择SQLselect语句,然后执行该语句。我尝试了使用变量和直接执行SELECT语句 SqlDataSource1.SelectCommand = 'SELECT...' 不幸的是,当我将数据放入要检查的文本字段时,这两个方法都没有返回任何内容 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System

下面代码隐藏的目标是根据文本框是否为空,在字符串变量中选择SQL
select
语句,然后执行该语句。我尝试了使用变量和直接执行
SELECT
语句

SqlDataSource1.SelectCommand = 'SELECT...' 
不幸的是,当我将数据放入要检查的文本字段时,这两个方法都没有返回任何内容

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)
        {

        }
    }
}

我认为你最好用声明的方式,用ControlParameters来做这件事。在标记中,SqlDataSource1声明将有一个
部分:

<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>

就您的原始代码而言,当您添加文本框值作为参数时,您希望添加
.Text
属性作为默认值:

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

你需要这样的东西

在类范围内

private bool _hasWhere;
方法动态生成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;
}
帮助器方法,以确定是否已插入了

// 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;
}
获取命令对象的方法

private SqlCommand CreateCommand (string sql)
{

    .............
    SqlCommand command = new Sqlcommand(sql,....
    .............
    return Command
 }
因此,您可以在执行命令之前分配命令

SqlDataSource1.SelectCommand = CreateCommand(GetSelectSql()) 

这不是完整的功能代码,但我希望这能让您了解需要执行的操作

我认为我们需要执行该命令。您是否尝试过使用调试器?例如,
SqlDataSource1.SelectParameters.Add(“NameLast”,SearchLast.ToString())
将把类型的名称(即Textbox)添加到参数中,而不是文本框的文本值。在我看来,这是非结构化的混乱。您需要先创建“选择”,然后创建命令,然后execute@marc_s不是根据MSDN。只是好奇,贴出的答案是解决了你的问题,还是帮助了你?
SqlDataSource1.SelectCommand = CreateCommand(GetSelectSql())