задание: Исправить ошибку «Access violation at adress 006FF486 in module 'Project101.exe. Read of address 00000000» в предоставленном коде C++. Я выяснил, что ошибка появляется при выполнении функций: OpenConnection(), CreateProductsTable(), LoadDataFromDB().
Реализуйте решение для исправления ошибки «Нарушение прав доступа» в предоставленном коде C++.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include “Unit108.h”
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource “*.dfm”
TForm108 *Form108;
TEdit *Edit1;
TADOQuery *ADOQuery1;
TADOConnection *ADOConnection1;
TEdit *Edit2;
TEdit *Edit3;
TMemo *Memo1;
TImage Image1;
TDataSource DataSource1;
TButton Button1;
TButton Button2;
TButton Button3;
TButton Button4;
TDBGrid DBGrid1;
TOpenDialog OpenDialog1;

// функция создания бд, таблицы
void CreateProductsTable()
{
String s;
s=“CREATE DATABASE IF NOT EXISTS catalog”;
ADOQuery1->SQL->Text=s;
//Добавлена проверка соединения перед выполнением запроса
if (ADOConnection1->Connected) {
ADOQuery1->ExecSQL();
}
s=“CREATE TABLE IF NOT EXISTS catalog.products (ID INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, Temp DOUBLE NOT NULL, price FLOAT(8, 2) NOT NULL, description TEXT NOT NULL, image MEDIUMBLOB NOT NULL, PRIMARY KEY (ID))”;
ADOQuery1->SQL->Text=s;
if (ADOConnection1->Connected) {
ADOQuery1->ExecSQL();
}
}

//Функция для открытия соединения с базой данных
void OpenConnection()
{
String c = “Provider=MSDASQL.1;Persist Security Info=False;Data Source=catalog”; //параметры подключения
try {
ADOConnection1->ConnectionString = c;
ADOConnection1->LoginPrompt = false;
ADOConnection1->Open(); //попытка открыть соединение
}
catch (EBcdException &e) //обработка исключения при ошибке в подключении к БД
{
ShowMessage(“Ошибка подключения к базе данных. Проверьте параметры подключения.”);
}
}

// функция загрузки данных из базы данных
void LoadDataFromDB()
{
if (ADOConnection1->Connected)
{
if (ADOQuery1->Active)
ADOQuery1->Close();

ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(“SELECT * FROM catalog.products”);
if (ADOConnection1->Connected) {
ADOQuery1->Open();
}
}
}

// функция очистки формы после добавления или удаления товара
void ClearData()
{
Edit1->Text = “”;
Edit2->Text = “”;
Memo1->Text = “”;
Image1->Picture->LoadFromFile(“_blank.png”);
}

// функция добавления товара в базу данных
void AddProduct()
{
// проверка, что все поля заполнены
if (Edit1->Text == “” || Edit2->Text == “” || Memo1->Text == “”)
{
ShowMessage(“Заполните все поля!”);
return;
}

// подготовка запроса на добавление товара
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(“INSERT INTO catalog.products(name, price, description, image) VALUES(:name, :price, :description, :image)”);
ADOQuery1->Parameters->ParamByName(“name”)->Value = Edit1->Text;
ADOQuery1->Parameters->ParamByName(“price”)->Value = Edit2->Text;
ADOQuery1->Parameters->ParamByName(“description”)->Value = Memo1->Text;
TMemoryStream stream = new TMemoryStream();
Image1->Picture->Bitmap->SaveToStream(stream);
ADOQuery1->Parameters->ParamByName(“image”)->LoadFromStream(stream, ftGraphic);
ADOQuery1->ExecSQL();

// очистка формы и обновление каталога косметики
ClearData();
ADOQuery1->Close();
LoadDataFromDB();
}

// функция сохранения изменений в базе данных
void UpdateProduct()
{
// Проверка на незаполненость всех полей
if (Edit1->Text == “” || Edit2->Text == “” || Memo1->Text == “”)
{
ShowMessage(“Заполните все поля!”);
return;
}

if (ADOQuery1->State != dsEdit)
ADOQuery1->Edit();

// Сохранение изменений
ADOQuery1->FieldByName(“Name”)->AsString = Edit1->Text;
ADOQuery1->FieldByName(“Price”)->AsFloat = StrToFloatDef(Edit2->Text, 0);
ADOQuery1->FieldByName(“Description”)->AsString = Memo1->Text;

// Обновление изображения, если пользователь выбрал новое
if (Image1->Picture != nullptr)
{

ADOQuery1->FieldByName(“Image”)->Assign(Image1->Picture->Graphic);
}

// Закрытие и обновление данных
ADOQuery1->Post();
ADOQuery1->Close();
LoadDataFromDB();

// Очистка формы
ClearData();
}

// функция удаления товара из базы данных
void DeleteProduct()
{
// проверка, что выбран хотя бы один товар
if (DBGrid1->SelectedRows->Count == 0)
{
ShowMessage(“Выберите товар, который необходимо удалить!”);
return;
}

// удаление выбранных товаров
for (int i = 0; i < DBGrid1->SelectedRows->Count; i++)
{
DBGrid1->DataSource->DataSet->Bookmark = DBGrid1->SelectedRows->Items[i];
DBGrid1->DataSource->DataSet->Delete();
}

// сброс выбранных товаров и обновление каталога косметики
DBGrid1->DataSource->DataSet->First();
LoadDataFromDB();
}

//---------------------------------------------------------------------------
__fastcall TForm108::TForm108(TComponent Owner)
: TForm(Owner)
{
OpenConnection();
// создание таблицы products при запуске программы
CreateProductsTable();

// загрузка данных из базы данных при запуске программы
LoadDataFromDB();
}
//---------------------------------------------------------------------------

void __fastcall TForm108::Button1Click(TObject Sender)
{
AddProduct();
}
//---------------------------------------------------------------------------

void __fastcall TForm108::Button2Click(TObject Sender)
{
DeleteProduct();
}
//---------------------------------------------------------------------------

void __fastcall TForm108::Button3Click(TObject Sender)
{
UpdateProduct();
}
//---------------------------------------------------------------------------

void __fastcall TForm108::Button4Click(TObject Sender)
{
// Открытие диалога выбора файла
OpenDialog1->Filter = "Image Files (.bmp;.jpg;.jpeg;.png)|.bmp;.jpg;.jpeg;.png";
if (OpenDialog1->Execute())
{
// Загрузка выбранного изображения в TImage компонент
Image1->Picture->LoadFromFile(OpenDialog1->FileName);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm108::DBGrid1CellClick(TColumn Column)
{
// Заполнение полей данными выбранного товара
Edit1->Text = ADOQuery1->FieldByName(“Name”)->AsString;
Edit2->Text = FloatToStr(ADOQuery1->FieldByName(“Price”)->AsFloat);
Memo1->Text = ADOQuery1->FieldByName(“Description”)->AsString;

// Отображение изображения выбранного товара
if (ADOQuery1->FieldByName(“Image”)->IsBlob)
{
TMemoryStream stream = new TMemoryStream();
TBlobField field = dynamic_cast<TBlobField>(ADOQuery1->FieldByName(“Image”));
field->SaveToStream(stream);
if (stream->Size > 0)
{
stream->Position = 0;
Image1->Picture->LoadFromStream(stream);
}
delete stream;
}
else
{
Image1->Picture->LoadFromFile(“_blank.png”);
}
}
//------