2013-03-11 2 views
0

Я хочу проверить, нет ли имени пользователя в базе данных.Проверить дублирующееся имя пользователя с параметризованным запросом

SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["DBCOnn"].ToString()); 
try 
{ 
    con.Open(); 

    SqlCommand cmd = new SqlCommand("select client_id from tbl_client where [email protected]", con); 
    cmd.CommandType = CommandType.Text; 

    cmd.Parameters.Add("@cname", DbType.String).Value = usernm; 

    int i = cmd.ExecuteNonQuery(); 
    if (i > 0) 
     return true; 
    else 
     return false; 
} 
catch (Exception ex) 
{ 
    throw new Exception("CheckExistingClient:" + ex.Message, ex.InnerException); 
} 
finally 
{ 
    con.Close(); 
} 

Но здесь, i всегда дает в -1

Что является проблемой.?

ответ

3

ExecuteNonQuery возвращает количество затронутых строк и обычно используется для инструкций insert-, update- или delete-statements. Используйте вместо этого ExecuteScalar с COUNT.

using (var con = new SqlConnection(ConfigurationManager.AppSettings["DBCOnn"].ToString())) 
using(var cmd = new SqlCommand("select COUNT(client_id) from tbl_client where [email protected]", con)) 
{ 
    cmd.Parameters.Add("@cname", DbType.String).Value = usernm; 
    con.Open(); 
    int i = (int)cmd.ExecuteScalar(); 
    return i > 0; 
} 

Вот родственный ответ на SO: https://stackoverflow.com/a/4269651/284240

+0

Oops, почему он не пришел на мой mind..Thanks..It теперь работает. –

1

ExecuteNonQuery возвращает количество строк, затронутых INSERT, UPDATE или DELETE заявление. Вы используете SELECT.

Мне кажется, что «SELECT FROM Users, где UserName = @ cName» проще, и запустить стандартный Select.

1

ExecuteNonQuery предназначен для запросов DML. Вы не изменяете и не стробируете. Таким образом, вы получаете результат как -1.

Вы можете использовать select count(client_id) from tbl_client where [email protected]

И получить счетчик с cmd.ExecuteScalar

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