Ошибка тайм-аута Sql Исключение 0 x 80131904. Net Core - PullRequest
0 голосов
/ 15 апреля 2020

Я использую. 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, но это не сработало. Я заблудился, что делать дальше, любая помощь будет принята с благодарностью.

...