Garvin12 Ответов: 2

Как читать данные из базы данных с помощью SQL datareaders


Всем привет

У меня есть хранимая процедура, которая регистрирует пользователя и извлекает некоторые данные из нескольких таблиц, когда я тестирую процедуру с тестовыми данными, она возвращает все необходимые мне поля, но в моем приложении, когда я использую datareader для извлечения этих значений, я получаю исключение индекса вне диапазона.

Я использовал свойство"C#" >reader.VisibleFieldCount, чтобы подсчитать, сколько полей возвращается, и оказалось, что я возвращаю только 3 из 8 полей.


Любая помощь будет оценена по достоинству

С уважением

Что я уже пробовал:

вот моя хранимая процедура
ALTER PROCEDURE [dbo].[spCustomerLogin]

 @Email nvarchar(Max),
 @Password nvarchar(Max)

AS
SET NOCOUNT ON
SELECT Customer_name,CUSTOMER_PROFILE_DATA.Customer_email,Customer_password,Customer_phone,Card_number as 'crd_num',Card_expmnth,Card_expyear,Card_cvc
FROM CUSTOMER_PROFILE_DATA
join CARD_INFO
on CARD_INFO.Customer_email = CUSTOMER_PROFILE_DATA.Customer_email
WHERE (CUSTOMER_PROFILE_DATA.Customer_email =@Email) AND (Customer_password = @Password)
RETURN

Мой код читателя
while(reader.Read() && reader.VisibleFieldCount > 5)
              {


                  Response.Redirect("ProfileC.aspx", false);
                  Session["Cus_name"] = Convert.ToString(reader[0]);
                  Session["Cus_email"] = Convert.ToString(reader[1]);
                  Session["Cus_pass"] = Convert.ToString(reader[2]);
                  Session["Cus_phone"] = Convert.ToString(reader[3]).ToString();
                  Session["Card_num"] = Convert.ToString(reader[4]);
                  Session["Card_expmnth"] = Convert.ToString(reader[5]);
                  Session["Card_expyr"] = Convert.ToString(reader[6]);
                  Session["Card_cvv"] = Convert.ToString(reader[7]);

              }

Richard MacCutchan

Вы серьезно храните идентификатор пользователя и пароль в открытом тексте в базе данных?

Garvin12

нет, пароль зашифрован.

Garvin12

кощунственный

Richard MacCutchan

Просто спрашиваю; мы видим так много людей, хранящих их в открытом тексте.

Richard Deeming

Шифрование паролей почти так же плохо, как и хранение их в виде обычного текста. Если ваш ключ шифрования скомпрометирован, то и все ваши пароли тоже.

Вы должны всегда хранить только соленый хэш пароля, используя уникальную соль для каждой записи.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хеширование паролей - все правильно[^]

Richard Deeming

Кроме того, похоже, что вы храните данные кредитной карты в своем столе. Надеюсь, они не хранятся в обычном тексте?

Garvin12

Я понимаю, что вы имеете в виду, спасибо за ссылки.

2 Ответов

Рейтинг:
19

Karthik_Mahalingam

попробуйте использовать SqlDataAdapter [^]

SqlCommand sqlCommand = new SqlCommand();
           SqlDataAdapter da = new SqlDataAdapter(sqlCommand);
           DataTable dt = new DataTable();
           da.Fill(dt);
           if (dt.Rows.Count == 1)
           {
               Session["Cus_name"] = Convert.ToString(dt.Rows[0][0]);
               Session["Cus_email"] = Convert.ToString(dt.Rows[0][1]);
               Session["Cus_pass"] = Convert.ToString(dt.Rows[0][2]);
               Session["Cus_phone"] = Convert.ToString(dt.Rows[0][3]);
               Session["Card_num"] = Convert.ToString(dt.Rows[0][4]);
               Session["Card_expmnth"] = Convert.ToString(dt.Rows[0][5]);
               Session["Card_expyr"] = Convert.ToString(dt.Rows[0][6]);
               Session["Card_cvv"] = Convert.ToString(dt.Rows[0][7]);
             

           }


Переместите эту строку в последнюю, чтобы выполнить все необходимые действия перед переходом на другую страницу
Response.Redirect("ProfileC.aspx", false);


Garvin12

Привет, я попробовал этот подход, он все еще пропускает 3-й столбец и говорит, что не может найти столбец 3.

Karthik_Mahalingam

проверьте это

ДТ.Столбцы.Рассчитывать

Garvin12

Спасибо! - адаптер данных сработал.

Karthik_Mahalingam

крутой

Рейтинг:
1

ZurdoDev

1. Не используйте VisibleFieldCount. Это не то, что вы думаете.
2. Справочные данные по имени Поля. Это значительно облегчит отладку. Например:

Session["Cus_name"] = reader["Customer_name"].ToString();