2013-03-23 3 views
2

В моем веб-браузере у меня есть окно поиска, чтобы я мог искать свою базу данных с использованием имени или фамилии, и он отображает результат в моем веб-приложении. Пользователь вводит имя firstname или lastname.if Firstname запрос работает нормально, но если поиск пользователей только фамилию он показывает все данные в таблице не показаны данные, как по LastNameне поиск по только фамилии

string sql = @"SELECT opd_id AS [OPD No] 
     , opd_date AS DATE 
     , opd_dpt AS DEPARTMENT 
     , opd_pfname + ' ' + opd_plname AS [Patient NAME] 
     , opd_age AS AGE 
     , opd_gender AS GENDER 
     , opd_mob AS [MOBILE NO] 
     , opd_fthrname AS [FATHER NAME] 
     , opd_hsbndname AS [HUSBAND NAME] 
     FROM tbl_OPD 
     WHERE opd_pfname like'%" + fname + @"%' 
     OR opd_plname like'%" + lname + @"% ' 
     ORDER BY DATE DESC"; 
+0

На самом деле у какого opd_pfname? –

+3

Кто-нибудь за игру SQL-инъекции? http://xkcd.com/327/ – Dan

+0

opd_pfname, opd_plname - это имя столбца – Bhavnish

ответ

2

Дополнительное белое пространство в

OR opd_plname like'%" + lname + @"% ' 

Пустое пространство                                                                                                        ^

Кроме того, остерегайтесь sql injection, который можно исправить с prepared sql statements и параметров привязки

1

Не видя больше кода он может быть, что у вас есть только либо из заполняемых переменных fname, либо lname. Предполагая, что это так, вы можете использовать этот код.

// this assumes that you have only have 1 input for both the first name and lastname 
// and are storing it in a variable named searchForName 
using (var connection = new SqlConnection("YOUR_CONFIGURATION_CONNECTION_STRING")) 
{ 
    using (var command = new SqlCommand("SELECT opd_id AS [OPD No], opd_date AS DATE, opd_dpt AS DEPARTMENT, opd_pfname + ' ' + opd_plname AS [Patient NAME], opd_age AS AGE, opd_gender AS GENDER, opd_mob AS [MOBILE NO], opd_fthrname AS [FATHER NAME], opd_hsbndname AS [HUSBAND NAME] FROM tbl_OPD WHERE (opd_pfname like @p0 OR opd_plname like @p0) ORDER BY DATE DESC", connection)) 
    { 
     command.Parameters.Add(new SqlParameter("@p0", string.Format("%{0}%", searchForName))); 

     // rest of your code here E.G., sComm.ExecuteNonQuery(); 
    } 
} 

Если вы знаете, что обе переменные заселены попробовать Этот блок кода

using (var connection = new SqlConnection("YOUR_CONFIGURATION_CONNECTION_STRING")) 
{ 
    using (var command = new SqlCommand("SELECT opd_id AS [OPD No], opd_date AS DATE, opd_dpt AS DEPARTMENT, opd_pfname + ' ' + opd_plname AS [Patient NAME], opd_age AS AGE, opd_gender AS GENDER, opd_mob AS [MOBILE NO], opd_fthrname AS [FATHER NAME], opd_hsbndname AS [HUSBAND NAME] FROM tbl_OPD WHERE (opd_pfname like @p0 OR opd_plname like @p1) ORDER BY DATE DESC", connection)) 
    { 
     command.Parameters.Add(new SqlParameter("@p0", string.Format("%{0}%", searchForFirstName))); 
     command.Parameters.Add(new SqlParameter("@p1", string.Format("%{0}%", searchForLastName))); 

     // rest of your code here E.G., sComm.ExecuteNonQuery(); 
    } 
} 

PS. Как говорили другие, код, показанный здесь, несколько небезопасен, и вы должны сделать все, чтобы избежать атак Sql Injection.

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