Как использовать SqlDataReader для получения информации из базы данных

Как использовать SqlDataReader для получения информации из базы данных, c #

Мне нужно получить доступ к переменной в моей базе данных SQL, а также к имени пользователя, которое уже правильно реализовано. Я запрашиваю базу данных, используя этот оператор:

private const string _getUserByUsernameQuery = @"
SELECT
    [User].[username]
FROM
    [User] WITH (NOLOCK) 
    INNER JOIN [Company] WITH (NOLOCK)
    ON [User].[companyId] = [Company].[id]
WHERE
    [User].[username] = @username 
    AND [User].[password] = @password";
 

Затем подключитесь к базе данных и получите доступ к имени пользователя:

using (SqlConnection connection = new SqlConnection(SQLConfiguration.ConnectionString))
{
   SqlCommand command = new SqlCommand(_getUserByUsernameQuery, connection);
   command.Parameters.AddWithValue("@username", username);
   command.Parameters.AddWithValue("@password", password);
   try
   {
      connection.Open();
      using (SqlDataReader reader = command.ExecuteReader())
      {
         if (reader.Read())
         {
            Username = Convert.ToString(reader["username"]);
            //CompanyId = Convert.ToString(reader["companyId"]);
            lblUsername = Username;
            //lblCompanyId = CompanyId;
            Debug.WriteLine("Testing2::");
            Debug.WriteLine(lblUsername);
            //Debug.WriteLine(lblCompanyId);
         }
      }
   }
   catch (Exception)
   {
      if(connection.State == System.Data.ConnectionState.Open)
      connection.Close();
   }
}
 

В операторе if, где я установил reader ["username"] равным Username, я выводил Username, используя debug, и значение было правильным. В комментариях к CompanyId у меня есть то, что я хотел сделать, но не смог. Это не вызывает ошибок, но игнорирует весь оператор (даже переменную Username, которая работает в противном случае). Как я могу получить доступ к переменной companyId на основе строки запроса?

Показать лучший ответ

Ваш sql-запрос на самом деле не выбирает значение столбца companyId в списке Select . Также обратите внимание, что вам не нужен блок try catch , поскольку using закроет соединение, как только код покинет область действия блока, независимо от успеха или неудачи.

Спасибо за информацию о попытках. Также кажется, что совет compayId может решить мою проблему.

В вашем _getUserByUsernameQuery вы выбираете только поле username . Убедитесь, что поля, которые вы хотите читать из reader[...] , присутствуют в вашем операторе select.

Это решило мою проблему; принимая ваш, поскольку это был первый ответ.

Похоже, вам нужно добавить идентификатор компании в оператор выбора, чтобы получить его:

private const string _getUserByUsernameQuery = @"
SELECT
    [User].[username], [User].[companyId]
FROM
    [User] WITH (NOLOCK) 
    INNER JOIN [Company] WITH (NOLOCK)
    ON [User].[companyId] = [Company].[id]
WHERE
    [User].[username] = @username 
    AND [User].[password] = @password";