Member 14083059 Ответов: 3

Ссылка на объект не устанавливается на экземпляр объекта. Пожалуйста, помогите мне


Я создаю пользовательский метод определения в asp.net в C#
я получаю ошибку:ССЫЛКА на объект не установлена на экземпляр объекта.
диалоговое окно ошибки показать здесь-
String query = "insert into saveCart(sno,BkName,BkLanguage,BkStd,BkQty,BkPrice,TotalPrice) values(" + sno + ",'" + Session["Name"].ToString() + "','" + BkName + "','" + BkLanguage + "','" + BkStd + "','" + BkQty + "','" + BkPrice + "','" + TotalPrice + "')";


Мой таблицы базы данных
sno    int Checked
Name   nvarchar(10)    Checked
BkName nvarchar(100)   Unchecked
BkLanguage nvarchar(100)   Checked
BkStd  nvarchar(100)   Checked
BkQty  nvarchar(100)   Checked
BkPrice    nvarchar(100)   Checked
TotalPrice nchar(10)   Checked
       Unchecked


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

private void saveCart(int sno,  String BkName, String BkLanguage, String BkStd, String BkQty,String BkPrice, String TotalPrice)
      {
          String query = "insert into saveCart(sno,BkName,BkLanguage,BkStd,BkQty,BkPrice,TotalPrice) values(" + sno + ",'" + Session["Name"].ToString() + "','" + BkName + "','" + BkLanguage + "','" + BkStd + "','" + BkQty + "','" + BkPrice + "','" + TotalPrice + "')";
          String mycon = "Data Source=HOME-PC\\SQLEXPRESS;Initial Catalog=NoveltySystem;Integrated Security=True;Pooling=False";
          SqlConnection con = new SqlConnection(mycon);
          con.Open();
          SqlCommand cmd = new SqlCommand();
          cmd.CommandText = query;
          cmd.Connection = con;
          cmd.ExecuteNonQuery();
      }

Richard Deeming

Наиболее вероятной причиной исключения является то, что Session["Name"] является null Отладьте свой код, чтобы выяснить, почему.

Member 14083059

ошибка снова показывает здесь-String query = "insert into saveCart(sno,BkName,BkLanguage,BkStd,BkQty,BkPrice,TotalPrice) values(" + sno + ",'" + Session["Name"].ToString() + "','" + BkName + "','" + BkLanguage + "','" + BkStd + "', '" + BkQty + "', '" + BkPrice + "', '" + TotalPrice + "')";

он показывает "ссылка на объект не указывает на экземпляр объекта"

3 Ответов

Рейтинг:
2

Prasad Nikumbh

your query is as below:->

 String query = "insert into saveCart(sno,BkName,BkLanguage,BkStd,BkQty,BkPrice,TotalPrice) values(" + sno + ",'" + Session["Name"].ToString() + "','" + BkName + "','" + BkLanguage + "','" + BkStd + "','" + BkQty + "','" + BkPrice + "','" + TotalPrice + "')";

Remove :->  Session["Name"].ToString() 

your query should be like below:->

 String query = "insert into saveCart(sno,BkName,BkLanguage,BkStd,BkQty,BkPrice,TotalPrice) values('" + sno + "','" + BkName + "','" + BkLanguage + "','" + BkStd + "','" + BkQty + "','" + BkPrice + "','" + TotalPrice + "')";


But i think the error is due to Session["Name"] having null value.
It is always better to use Convert.toString(Session["Name"]) instead of Session["Name"].toString().


Richard Deeming

Этот код все еще уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Member 14083059

сэр не могли бы вы привести какой нибудь пример

Prasad Nikumbh

Да, я знаю abt SQL injection.Но если проект старый, то иногда в старом проекте они могли бы использовать это везде.поэтому я предоставил это решение.
Но переутверждаются вы можете использовать.Так будет лучше.вы должны изменить его в eveywhere, где вы использовали sql-запросы.
И еще одна вещь, которую я только что привел в качестве основной причины этой проблемы.

Member 14083059

спасибо Вам за то, что вы дали свою сутулость. поскольку я использовал сеанс["имя"], я хочу сохранить данные сеанса мудрого входа пользователя.

Richard Deeming

Отсутствие исправления критической уязвимости безопасности, потому что это было бы слишком много работы, не является хорошим оправданием.

Рейтинг:
1

Richard Deeming

Чтобы исправить уязвимость SQL-инъекции:

private void saveCart(int sno,  String BkName, String BkLanguage, String BkStd, String BkQty,String BkPrice, String TotalPrice)
{
    // TODO: Load this from your config file:
    const string mycon = "Data Source=HOME-PC\\SQLEXPRESS;Initial Catalog=NoveltySystem;Integrated Security=True;Pooling=False";
    
    const string query = "insert into saveCart (sno, BkName, BkLanguage, BkStd, BkQty, BkPrice, TotalPrice) values (@sno, @BkName, @BkLanguage, @BkStd, @BkQty, @BkPrice, @TotalPrice)";
    
    using (SqlConnection con = new SqlConnection(mycon))
    using (SqlCommand cmd = new SqlCommand(query, con))
    {
        cmd.Parameters.AddWithValue("@sno", sno);
        cmd.Parameters.AddWithValue("@BkName", BkName);
        cmd.Parameters.AddWithValue("@BkLanguage", BkLanguage);
        cmd.Parameters.AddWithValue("@BkStd", BkStd);
        cmd.Parameters.AddWithValue("@BkQty", BkQty);
        cmd.Parameters.AddWithValue("@BkPrice", BkPrice);
        cmd.Parameters.AddWithValue("@TotalPrice", TotalPrice);
        
        // TODO: Which column are you inserting Session["Name"] into?
        
        con.Open();
        cmd.ExecuteNonQuery();
    }
}

Тогда становится очевидным, что вы указываете больше значений в VALUES предложение, чем столбцы в INSERT INTO пункт - как уже упоминалось в решении №1.

Вам также необходимо обернуть объекты подключения и команды в using блоки, так что они очищены должным образом. С вашим текущим кодом у вас в конечном итоге закончатся соединения, и вы начнете получать ошибки при попытке открыть новое соединение.
использование инструкции - Справочник по C# | Microsoft Docs[^]

Вы также должны посмотреть на загрузку строки подключения из файла конфигурации вашего приложения, а не жестко кодировать ее по всему коду.
Строки подключения и файлы конфигурации | Microsoft Docs[^]


Рейтинг:
0

RickZeeland

У вас слишком много полей для BkName, удалите их:

Session["Name"].ToString()
или добавьте поле Имя.

Кроме того, лучше использовать параметризованные запросы, чтобы избежать риска SQL-инъекции.