У меня есть два текстовых поля в моей winform. Я хотел бы ввести userId в первое текстовое поле, после чего щелкнув по кнопке, отобразите User Name во втором текстовом поле правильно. Данные хранятся в sql-сервере. Имя таблицы - это Users
, и эта таблица содержит два столбца UserID
и UserName
.
С помощью этого кода я могу открыть соединение и получить первое значение из столбца UserName,
SqlCeConnection cn = new SqlCeConnection(@"Data Source = D:\Database\Training.sdf");
try
{
cn.Open();
SqlCeCommand cmd = new SqlCeCommand("SELECT UserID, UserName from Users;", cn);
TrainerNameBox.Text = cmd.ExecuteScalar().ToString();
cn.Close();
}
catch
{
}
Вам не хватает предложения WHERE, чтобы изолировать имя пользователя, которое вы хотите отобразить.
int userID;
if(!Int32.TryParse(txtUserID.Text, out userID))
{
MessageBox.Show("Invalid User ID number");
return;
}
using(SqlCeConnection cn = new SqlCeConnection(@"Data Source = D:\Database\Training.sdf"))
using(SqlCeCommand cmd = new SqlCeCommand("SELECT UserName from Users WHERE UserID=@id;", cn))
{
cn.Open();
cmd.Parameters.AddWithValue("@id", userID);
object result = cmd.ExecuteScalar();
if(result != null)
TrainerNameBox.Text = result.ToString();
else
MessageBox.Show("No user for ID=" + userID.ToString());
}
Обратите внимание, что ExecuteScalar
возвращает первый столбец первой строки, поэтому вам нужно удалить поле UserID из вашего запроса, и если пользователь не найден, вам нужно проверить нулевой возврат.
Применение метода ToString() непосредственно к вашему ExecuteScalar может вызвать исключение, если ваш пользователь вводит неверный идентификатор. Существует также проблема проверки ввода пользователя. Если вы вводите не числовое значение для идентификатора пользователя, преобразование завершится с ошибкой. В этом случае вам нужно проверить ввод, используя Int32.TryParse
ExecuteScalar
возвращает первый столбец первой строки. Другие столбцы или строки игнорируются.
В вашем случае ваш первый столбец - UserID
. Вот почему вы получаете первое значение этого столбца.
Если вы хотите получить значение UserName
, вам может потребоваться изменить ваш запрос:
SELECT UserName from Users
И похоже, что вы забываете использовать WHERE
в своем запросе, так как вы хотите получить UserName
из UserID
. Возможно, вам понадобится использовать оператор using
для размещения ваших SqlCeConnection
и SqlCeCommand
.
Полный пример;
using(SqlCeConnection cn = new SqlCeConnection(@"Data Source = D:\Database\Training.sdf"))
using(SqlCeCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "SELECT UserName from Users WHERE UserID = @id";
cmd.Parameters.AddWithValue("@id", (int)txtUserID.Text);
cn.Open();
TrainerNameBox.Text = cmd.ExecuteScalar().ToString();
}
Попробуй это:
Dataset ds = cmd.ExecuteDataset().ToString();
TrainerNameBox.Text = ds.tables[0].Rows[0][1].toString();
TrainerIDBox.Text = ds.tables[0].Rows[0][0].toString();