У меня есть форма входа в систему, которую я хочу выбрать 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 '.
Вы можете попробовать использовать как ниже
string result = Convert.ToString(com.ExecuteScalar());
Что делать, если запись не существует (т.е. Курсор пуст)? Давайте прочитаем и проверим, есть ли у нас хотя бы одна запись:
// 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
}
}
Попробуй это,
string result = string.Empty;
SqlCommand com = new SqlCommand(..);
..
object executedResult = com.ExecuteScalar();
if(executedResult != null) {
result = executedResult.ToString();
}
Надежда помогает,
Вероятно, самое простое решение было бы (при условии, что запрос всегда возвращает результат):
string result = com.ExecuteScalar().ToString();
Вы также можете использовать nvarchar в своем запросе:
string insertQuery = "SELECT cast(UserID as nvarchar) FROM Customers WHERE Email = @Email AND Password = @Password";
ExecuteScalar возвращает тип объекта, и вы можете преобразовать его в любой тип, который вам нравится
public override object ExecuteScalar ();
Вы можете вызвать его метод ToString(), и он возвращает строковую форму своего значения.
Ниже приведены мои выводы
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();
}
}
string insertQuery = "SELECT CONVERT(NVARCHAR(20),UserID) FROM Customers WHERE Email = @Email AND Password = @Password";
(string)
впереди, если это, добавьте.ToString()
позади него.