• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Импорт из Excel в Mssql посредством С++builder

  • Автор темы Levi
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

LAW

Параметры в SQL строке пишутся с символом ":" например:
INSERT INTO TABLE (FIELD1,FIELD2) values :)VAL1,:VAL2,:VAL3)
 
L

Levi

Почему это всегда вроде @ была, по крайней мере у меня так все работает...
 
P

Pasha

Для: Levi
посмотри что в строке
ADOQuery2->Parameters->ParamByName("@org")->Value = ADOQuery1->Fields->Fields[1]->Value;
в параметр ложится. может быть null?
 
L

Levi

Нет не должно быть нулевых значений, Ексель документ полностью заполнен...
И нормально отображается в DBGride...
Вот он
В БД создал сам таблицу со всеми полями, которые описанны в запросе на вставку, они пустые, таблица без ИД... (тип всех полей варчар)
P.S.
Убрал строку ADOQuery2->Active = true;
Теперь пишет что не найден параметр @org...
 
L

Levi

Все с этим разобрался, теперь работает в одну таблицу пихает все
Код:
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("Insert into perev (Название_орг, Договор, Сотрудники, Адрес, Телефон, Наименование, Срок_работ, Условие) values (:org, :dog, :sotrud, :adres, :tel, :naimen, :srok, :usl)");
AnsiString tmp_org="", tmp_dog="", tmp_sotrud="", tmp_adres="", tmp_tel="", tmp_naimen="", tmp_srok="", tmp_usl=""; //Здесь создаешь
//временные переменные для всех полей которые не должны быть(NB!!!)пустыми
//ADOQuery2->Active = true;
while(!ADOQuery1->Eof){

ADOQuery2->Parameters->ParamByName("org")->Value=ADOQuery1->Fields->Fields[0]->Value;
ADOQuery2->Parameters->ParamByName("dog")->Value=ADOQuery1->Fields->Fields[1]->Value;
ADOQuery2->Parameters->ParamByName("sotrud")->Value=ADOQuery1->Fields->Fields[2]->Value;
ADOQuery2->Parameters->ParamByName("adres")->Value=ADOQuery1->Fields->Fields[3]->Value;
ADOQuery2->Parameters->ParamByName("tel")->Value=ADOQuery1->Fields->Fields[4]->Value;
ADOQuery2->Parameters->ParamByName("naimen")->Value=ADOQuery1->Fields->Fields[5]->Value;
ADOQuery2->Parameters->ParamByName("srok")->Value=ADOQuery1->Fields->Fields[6]->Value;
ADOQuery2->Parameters->ParamByName("usl")->Value=ADOQuery1->Fields->Fields[7]->Value;


ADOQuery2->ExecSQL();
ADOQuery1->Next();
}

Теперь возникло 2 новых вопроса:
1)Мне нужно, чтобы в случае если поля уже заполнены, таже самая информация не вводилась, как это сделать?
2)Необходимо теперь распарсить строки, т.е. у меня в одной ячейке хранится 2 значения через отделенные в
1 случае пробелом
2 случае частицей от
3 случае дефисом
Нужно разбить эту ячейку на 2
 
L

LAW

В коде, неплохо бы, после внесения SQL выражения добавить строку:
Код:
ADOQuery2->Prepare();
А в конце:
Код:
ADOQuery2->Unprepare();
По поводу первого вопроса:
Вариант А
Установить уникальность значений полей в базе (Unicue). Тогда при попытке внесения строки с повторяющимися данными будешь получать исключительную ситуацию (Exception), который нужно будет обработать.
Вариант Б
Поискать перед внесением есть ли такие данные.
Что-то вроде:
Код:
ADOQuery2->IndexName="Название_орг";
ADOQuery2->SetKey();
ADOQuery2->FieldByName("Название_орг")->AsString="Значение которое ищем";
if (ADOQuery2->GoToKey())
{
Нашли
}
else
{
Не нашли
}

По второму вопросу:
Бери поле, анализируй, разделяй, перезаписывай первую половину в то же поле, а вторую ложи в новое.

Для анализа можно использовать метод AnsiString.Pos();
 
L

Levi

Для: LAW
Спасибо за ответы:
1)Только думаю теперь замена не нужна, лучше делать полную очистку таблицу от значений и импортировать новые, ведь документы для импорта могут быть разные, зачем мне хранить все значения - если они только временные....
2)А на стороне сервере с помощью курсоров распарсировку реализовать можно?Или лучше в клиенте делать?
 
L

Levi

Можите пример Распарсировки в МсСКЛ привести, например для такой строки
В таблице есть строка Сотрудники вида:
Директор Иванов Иван Иванович
Можно ли "легким движением руки" встваить ее в эту же таблицу, чтобы получилось следующее (т.е. несколько записей)

Должность Фамилия Имя Отчество
------------- ------------ --------- --------------
Директор Иванов Иван Иванович

пример в виде процедуры в МсСКЛ сервере если можно приведите.
Кроме этих данных в таблице хранится еще информация:
Название Сотрудники Адрес
Все требуют распарсировки, я создал еще одну пустую таблицу в которой хранятся все необходимые поля, куда нужно будет производить распарсировку, всех значений...причем этих значений достаточно много....ИД должен сохранятся...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!