Как преобразовать int, извлеченный из базы данных, в строку

2

У меня есть форма входа в систему, которую я хочу выбрать userID (который имеет форму int) из базы данных, и сохранить его в виде string.

string insertQuery = 
  "SELECT UserID FROM Customers WHERE Email = @Email AND Password = @Password";

SqlCommand com = new SqlCommand(insertQuery, conn);

com.Parameters.AddWithValue("@Email", tbEmail.Text);
com.Parameters.AddWithValue("@Password", tbPassword.Text);

string result = (string)com.ExecuteScalar();

Но после входа в систему я получаю эту ошибку:

System.InvalidCastException: 'Невозможно привести объект типа' System.Int32 'к типу' System.String '.

  • 0
    Например: string insertQuery = "SELECT CONVERT(NVARCHAR(20),UserID) FROM Customers WHERE Email = @Email AND Password = @Password";
  • 1
    Вместо (string) впереди, если это, добавьте .ToString() позади него.
Показать ещё 2 комментария
Теги:

6 ответов

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

Вы можете попробовать использовать как ниже

string result = Convert.ToString(com.ExecuteScalar());
8

Что делать, если запись не существует (т.е. Курсор пуст)? Давайте прочитаем и проверим, есть ли у нас хотя бы одна запись:

// Keep Sql being readable
string insertQuery = 
  @"SELECT UserID 
      FROM Customers 
     WHERE Email = @Email 
       AND Password = @Password";

// Do not forget to dispose IDisposable
using (SqlCommand com = new SqlCommand(insertQuery, conn)) {
  com.Parameters.AddWithValue("@Email", tbEmail.Text);
  com.Parameters.AddWithValue("@Password", tbPassword.Text);

  using (var reader = com.ExecuteReader()) {
    string result = reader.Read()
      ? Convert.ToString(reader[0]) // record exists
      : null;                       // cursor is empty

    //TODO: put relevant code which works with result here
  }
}
1

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

string result = string.Empty;

SqlCommand com = new SqlCommand(..);
..
object executedResult = com.ExecuteScalar();

if(executedResult != null) {
   result = executedResult.ToString();
}

Надежда помогает,

1

Вероятно, самое простое решение было бы (при условии, что запрос всегда возвращает результат):

string result = com.ExecuteScalar().ToString();

Вы также можете использовать nvarchar в своем запросе:

string insertQuery = "SELECT cast(UserID as nvarchar) FROM Customers WHERE Email = @Email AND Password = @Password";
1

ExecuteScalar возвращает тип объекта, и вы можете преобразовать его в любой тип, который вам нравится

public override object ExecuteScalar ();

Вы можете вызвать его метод ToString(), и он возвращает строковую форму своего значения.

0

Ниже приведены мои выводы

    string userID;

using(SqlConnection conn = new SqlConnection(connectionString))
{
            string insertQuery = "SELECT UserID FROM Customers WHERE Email = @Email AND 
            Password = @Password";
            SqlCommand com = new SqlCommand(insertQuery, conn);
            com.CommandType = CommandType.StoredProcedure;
            com.Parameters.AddWithValue("@Email", tbEmail.Text.ToString().Trim());
            com.Parameters.AddWithValue("@Password", tbPassword.Text.ToString().Trim());
            SqlDataReader reader = com.ExecuteReader();
            while(reader.Read())
            {
              userID = reader["UserID"].ToString();
            }
}

Ещё вопросы

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