2014-01-31 4 views
0

Целью следующего кода является выбор инструкции SQL SELECT в строковой переменной в зависимости от того, является или нет текстовое поле или нет, тогда выполните инструкцию. Я пробовал как с помощью переменного и непосредственно выполнения SELECT заявления, используяВыберите строку поиска SQL на основе содержимого текстового поля ASP.NET

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

     } 
    } 
} 
+0

Я думаю, что нам нужно для выполнения команды. –

+0

Вы пытались использовать отладчик? Похоже, что, например, 'SqlDataSource1.SelectParameters.Add (« NameLast », SearchLast.ToString());' собирается добавить имя ТИПА (то есть текстовое поле) в параметр, а не текстовое значение текстового поля , – asawyer

+1

Похож на неструктурированный беспорядок для меня. Вам нужно начать с выбора здания, а затем создать команду и выполнить –

ответ

0

Я думаю, вам было бы лучше сделать это декларативно с помощью ControlParameters. В разметке, вы бы <SelectParameters> раздел вашей декларации 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> 

Таким образом, вам не придется иметь дело с добавлением их на Page_Load. Обратите внимание, что я добавил свойство CancelSelectOnNullParameter и установил значение false. Таким образом ваш запрос будет выполнен, даже если некоторые из значений пустые.

Вы также могли бы объединить все ваши запросы в один, таким образом, вы не должны иметь все те, если заявления в вашем случае, нажмите:

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

Насколько исходный код идет, при добавлении значения TextBox в качестве параметров, вы хотите добавить .Text свойства в качестве значения по умолчанию:

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

Вам нужно что-то вроде этого

В области видимости класса

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

метод Helper, чтобы определить, если 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; 
} 

метод, который получает вам команду объект

private SqlCommand CreateCommand (string sql) 
{ 

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

Итак вы можете назначить команду прямо перед выполнением

SqlDataSource1.SelectCommand = CreateCommand(GetSelectSql()) 

Это не полностью функциональный код, но я надеюсь, что это даст вам представление о том, что вам нужно сделать

Смежные вопросы