Получить данные с SQL Server Compact 4.0 в текстовое поле

1

У меня есть два текстовых поля в моей 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
       { 
       }
Теги:
sql-server

3 ответа

0
Лучший ответ

Вам не хватает предложения 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

1

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();
}
-2

Попробуй это:

    Dataset ds = cmd.ExecuteDataset().ToString();
    TrainerNameBox.Text = ds.tables[0].Rows[0][1].toString();
    TrainerIDBox.Text = ds.tables[0].Rows[0][0].toString();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню