Я использую. NET Ядро и пытаюсь выяснить, почему не работает SQL Сервер localdb. Я использую Dapper для подключения к базе данных, и я использовал точки останова, чтобы проверить, все ли данные были и были. Я получаю эту ошибку при попытке вызвать метод ExecuteReader
из класса DbCommand
.
Моя SQL Строка подключения к серверу:
"DefaultConnection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=PostStackDatabaseV2;Integrated Security=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
Я использую базу данных сервера localdb SQL и попытался подключиться к ней с помощью SQL Server Management Studio, и она прошла успешно. Код, где я регистрирую пользователя, находится здесь:
public int RegisterUser(string connectionStr, string name, string email, string password)
{
using (IDbConnection conn = new SqlConnection(connectionStr))
{
// hash password here before it goes into the database
var passwordHasher = new PasswordHasher();
string hashedPassword = passwordHasher.HashPassword(password);
var isAdmin = 0;
DateTime currentTime = DateTime.Now;
conn.Open();
using (var transaction = conn.BeginTransaction())
{
using (DbCommand registerCommand = (DbCommand)conn.CreateCommand())
{
try
{
registerCommand.Transaction = (DbTransaction)transaction;
registerCommand.CommandText = "INSERT INTO Users VALUES (@UserName, @UserEmail, @UserPassword, @CreatedAt, @Admin)";
registerCommand.Connection = (DbConnection)conn;
var firstNameParam = registerCommand.CreateParameter();
firstNameParam.ParameterName = "@UserName";
firstNameParam.Value = name;
registerCommand.Parameters.Add(firstNameParam);
var emailParam = registerCommand.CreateParameter();
emailParam.ParameterName = "@UserEmail";
emailParam.Value = email;
registerCommand.Parameters.Add(emailParam);
var passwordParam = registerCommand.CreateParameter();
passwordParam.ParameterName = "@UserPassword";
passwordParam.Value = password;
registerCommand.Parameters.Add(passwordParam);
var createdAtParam = registerCommand.CreateParameter();
createdAtParam.ParameterName = "@CreatedAt";
createdAtParam.Value = currentTime;
registerCommand.Parameters.Add(createdAtParam);
var adminParam = registerCommand.CreateParameter();
adminParam.ParameterName = "@Admin";
adminParam.Value = isAdmin;
registerCommand.Parameters.Add(adminParam);
int rowsAffected = registerCommand.ExecuteNonQuery();
// conn.Close();
Console.WriteLine(rowsAffected);
int userId = RetrieveUserId(email, connectionStr);
return userId;
}
catch
{
transaction.Rollback();
conn.Close();
throw;
}
}
}
}
}
private int RetrieveUserId(string userEmail, string connectionStr)
{
using (DbConnection conn = new SqlConnection(connectionStr))
{
conn.Open();
using (var transaction = conn.BeginTransaction())
{
using (var retrieveCmd = conn.CreateCommand())
{
retrieveCmd.Connection = conn;
retrieveCmd.Transaction = transaction;
retrieveCmd.CommandText = "SELECT Id FROM Users WHERE Email = @UserEmail";
retrieveCmd.CommandType = CommandType.Text;
retrieveCmd.Parameters.Add(new SqlParameter("@UserEmail", userEmail));
try
{
var reader = retrieveCmd.ExecuteReader(CommandBehavior.CloseConnection);
if (reader.Read())
{
string userIdStr = reader.GetValue(0).ToString();
int userId = int.Parse(userIdStr);
if (userId != -1)
{
// conn.Close();
return userId;
}
else
{
// conn.Close();
return -1;
}
}
else
{
return -1;
}
}
catch(DbException err)
{
Console.WriteLine("DbException.GetType: {0}", err.GetType());
Console.WriteLine("DbException.Source: {0}", err.Source);
Console.WriteLine("DbException.ErrorCode: {0}", err.ErrorCode);
Console.WriteLine("DbException.Message: {0}", err.Message);
return -1;
}
catch(Exception e)
{
Console.WriteLine(e.Message);
return -1;
}
}
}
}
}
RegisterUser
вызывается первым, который вставляет данные пользователя в базу данных, и затрагиваемые строки возвращаются как 1 вместо 0. Когда я щелкаю правой кнопкой мыши в таблице базы данных пользователей и нажал «просмотреть данные» я не вижу никаких данных.
Метод RetrieveUserId
вызывается для получения идентификатора пользователя, автоматически сгенерированного сервером SQL после вставки данных. В строке retrieveCmd.ExecuteReader()
время ожидания истекло. Я пробовал префикс dbo.
перед Users
в операторе SQL, и он тоже не работал.
Я также попробовал asyn c версии методов ExecuteReader
и ExecuteNonQuery
, но это не сработало. Я заблудился, что делать дальше, любая помощь будет принята с благодарностью.