Во-первых, ExecuteNonQuery не возвращает никаких результатов. Если вы хотите вернуть одно значение, используйте ExecuteScalar.
Во-вторых, путем конкатенации строк для создания SQL-запроса вы уязвимы для SQL-инъекций и ошибок преобразования. Google для «Bobby Tables». Или представьте, что произойдет, если кто-то введет '; DELETE FROM Users;--
в качестве имени пользователя.
В-третьих, если вы хотите получить данные пользователя, не выполнить два отдельных запроса. Используйте JOIN, например:
var query = "Select Gender from UserDetails d " +
" inner Join Users on Users.UserId=d.UserID " +
" where [email protected]";
var genderCmd=new SqlCommand(query);
genderCmd.Parameters.Add("@user",SqlDbType.NVarChar,30);
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
genderCmd.Connection=con;
genderCmd.Parameters["@user].Value=user;
var gender=(string)genderCmd.ExecuteScalar();
return gender;
}
Вы можете сохранить запрос и команды в полях и использовать их по мере необходимости, например:
void InitializeCommands()
{
var query = "Select Gender from UserDetails d " +
" inner Join Users on Users.UserId=d.UserID " +
" where [email protected]";
_genderCmd=new SqlCommand(query);
_genderCmd.Parameters.Add("@user",SqlDbType.NVarChar,30);
}
//....
public string GetGender(string user)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
genderCmd.Connection=con;
genderCmd.Parameters["@user"].Value=user;
var gender=(string)genderCmd.ExecuteScalar();
return gender;
}
}
Вы можете использовать асинхронные версии Open, ExecuteScalar, чтобы избежать блокировки поток во время ожидания ответа сервера, например:
public Task<string> GetGender(string user)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
await con.OpenAsync();
genderCmd.Connection=con;
genderCmd.Parameters["@user"].Value=user;
var gender=await genderCmd.ExecuteScalarAsync();
return (string)gender;
}
}
IO операция, таких как звонки в базу данных обрабатываются с использованием портов завершения ввода-вывода на уровне сетевой подсистемы, а не нитки.
Попробуйте выполнить cmd.ExecuteScalar и добавьте его в int или задолго до назначения var. –
Вы должны использовать 'ExecuteNonQuery', если вы не ожидаете результата. В этом случае вы, скорее всего, захотите «ExecuteScalar». - http://stackoverflow.com/questions/2974154/what-is-the-difference-between-executescalar-executereader-and-executenonquery – smoksnes
[Возвращаемое значение Тип: System.Int32 Число затронутых строк.] (https : //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery (v = vs.110) .aspx) – rene