Необходимо объявить скалярную переменную, обновив представление таблицы данных для пользователя, вошедшего в систему - PullRequest
0 голосов
/ 15 марта 2019

Вот таблицы в моем проекте:

Users table

Records table

Я пытаюсь обновить DataGridView, чтобы в нем отображались данные пользователя, вошедшего в систему.

Я получаю сообщение об ошибке: 'Необходимо объявить скалярную переменную' @CurrentUserID '... Я думаю, это потому, что я не могу преобразовать значение в int, но если это так, то как Я исправляю проблему?

Это мой код:

//Find ID of user who is logged in
SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\n0740572\Projects\newest\CW\CW\Database1.mdf;Integrated Security=True");
SqlCommand command = new SqlCommand("select UserID from Users where Username = '"+loggedInLabel.Text+"' ", conn);
try
{
    conn.Open();
    SqlDataReader reader = command.ExecuteReader();
    while(reader.Read())
    {
        int currentUserID = reader.GetInt32(reader.GetOrdinal("UserID"));
        command.Parameters.Add("@CurrentUserID", SqlDbType.Int);
        command.Parameters["@CurrentUserID"].Value = currentUserID;

        //update datagridview
        string dgvconn = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\n0740572\Projects\newest\CW\CW\Database1.mdf;Integrated Security=True";
        string sql = "select * from Records where UserID = @CurrentUserID";
        SqlConnection connection = new SqlConnection(dgvconn);
        SqlDataAdapter dataadapter = new SqlDataAdapter(sql, connection);
        DataSet ds = new DataSet();
        connection.Open();
        dataadapter.Fill(ds, "Records");
        connection.Close();
        dataGridView.DataSource = ds;
        dataGridView.DataMember = "Records";

    }
    reader.Close();
} 
catch (SqlException ex)
{
    MessageBox.Show(ex.Message);
} 
finally
{
    conn.Close();
}

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

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

Вы не используете параметры. Вы не используете SQL-соединение повторно. Вы неправильно добавляете параметры.

Вот так должен выглядеть код

try
{
    DataSet records = new DataSet();

    using (SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\n0740572\Projects\newest\CW\CW\Database1.mdf;Integrated Security=True"))
    {
        int? userId = null;
        using (SqlCommand command = new SqlCommand("select UserID from Users where Username = @Username", conn))
        {
            command.Parameters.Add("@Username", SqlDbType.NVarChar).Value = loggedInLabel.Text;

            conn.Open();
            using (SqlDataReader reader = command.ExecuteReader())
                if (reader.Read())
                    userId = reader.GetInt32(reader.GetOrdinal("UserID"));
            conn.Close();
        }      

        if (userId == null) // No row found
            throw new ApplicationException("User not found");

        using (SqlCommand command = new SqlCommand("select * from Records where UserID = @CurrentUserID", conn))
        {
            command.Parameters.Add("@CurrentUserID", SqlDbType.Int).Value = userID.Value;

            // SqlDataAdapter opens and closes the connection itself.
            using (SqlDataAdapter dataadapter = new SqlDataAdapter(command))
                dataadapter.Fill(records , "Records");
        }
    }

    //update datagridview    
    dataGridView.DataSource = records ;
    dataGridView.DataMember = "Records";
} 
catch (SqlException ex)
{
    MessageBox.Show(ex.Message);
} 

Вам также следует объединить SQL-запросы

select UserID from Users where Username = @Username и select * from Records where UserID = @CurrentUserID можно объединить в следующее:

select Records.*
from Records
join Users
    on Users.UserID = Records.UserID
where Users.Username = @Username

Тогда вам нужно только указать имя пользователя, и вы получите записи, если все там есть.

0 голосов
/ 15 марта 2019

На всякий случай, если кто-то еще застрял с ним.

Я решил это, удалив код, в который я добавил параметры, и заменив его на:

dataadapter.SelectCommand.Parameters.AddWithValue("@CurrentUserID", currentUserID);

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...