Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Импорт CSV в MySQL Delphi7


Автор: Randomazer 9.12.2012, 17:15
Использую Delphi 7, ADO, ODBC, MySQL

Хочу таблицу из CSV файла импортировать в MySQL средствами Delphi

Делаю следующее

Код

var
FileName,ab,bb,cb,db,eb:String;
begin
if opendialog1.Execute then begin
filename:=opendialog1.FileName;
with adoquery1 do begin
sql.Text:='LOAD DATA INFILE :fn'+chr(13)+chr(10)+
'INTO TABLE `base`.`users`'+chr(13)+chr(10)+
'FIELDS TERMINATED BY :ab ENCLOSED BY :bb ESCAPED BY :cb'+chr(13)+chr(10)+
'LINES STARTING BY :db TERMINATED BY :eb';
ab:=';';
bb:='"';
cb:='';
db:='';
eb:='\r\n';
parameters.ParamByName('fn').Value:=utf8toansi('example.csv');
parameters.ParamByName('ab').Value:=utf8toansi(ab);
parameters.ParamByName('bb').Value:=utf8toansi(bb);
parameters.ParamByName('cb').Value:=utf8toansi(cb);
parameters.ParamByName('db').Value:=utf8toansi(db);
parameters.ParamByName('eb').Value:=utf8toansi(eb);
execsql();


Выдается следующая ошибка

http://s1.ipicture.ru/Gallery/Viewfull/19396441.html

Помогите пожалуйста

Автор: Akella 9.12.2012, 17:56
И что... тебе помочь перевести текст ошибки?

Автор: Randomazer 9.12.2012, 18:05
Я не могу понять в чем ошибка, если делаю  SQL  запрос, то все нормально. Если через программу то выводится ошибка

Автор: Данкинг 9.12.2012, 18:46
А зачем там "chr(13)+chr(10)" нужно?

Автор: Randomazer 9.12.2012, 19:21
 Можно и без "chr(13)+chr(10)", я сделал это для определения в какой строке ошибка

Автор: Данкинг 9.12.2012, 19:36
ИМХО тут с кавычками какой-то косяк.

Автор: Vas 9.12.2012, 20:09
А так что получается?
Код

var
FileName,ab,bb,cb,db,eb:String;
begin
if opendialog1.Execute then begin
filename:=opendialog1.FileName;
with adoquery1 do begin
sql.Text:='LOAD DATA INFILE :fn INTO TABLE `base`.`users` FIELDS TERMINATED BY :ab ENCLOSED BY :bb ESCAPED BY :cb LINES STARTING BY :db TERMINATED BY :eb';
ab:=';';
bb:='"';
cb:='';
db:='';
eb:='\r\n';
parameters.ParamByName('fn').Value:=utf8toansi('example.csv');
parameters.ParamByName('ab').Value:=utf8toansi(ab);
parameters.ParamByName('bb').Value:=utf8toansi(bb);
parameters.ParamByName('cb').Value:=utf8toansi(cb);
parameters.ParamByName('db').Value:=utf8toansi(db);
parameters.ParamByName('eb').Value:=utf8toansi(eb);
execsql();


Добавлено через 6 минут и 50 секунд
Что-то картинку вставить не могу, но смотри в ошибке внимательно на '_cp1251'example.csv' апостроф внутри строки, его экранировать надо, иначе ошибочка будет.

Автор: Randomazer 9.12.2012, 20:23
Тоже самое smile 

Автор: Randomazer 9.12.2012, 20:44
Код

var
FileName,ab,bb,cb,db,eb:String;
begin
if opendialog1.Execute then begin
filename:=opendialog1.FileName;
showmessage(filename);
with adoquery1 do begin
sql.Clear;
sql.Add('LOAD DATA INFILE ,:fn');
sql.Add('INTO TABLE `base`.`users`');
sql.Add('FIELDS TERMINATED BY :ab ENCLOSED BY :bb ESCAPED BY :cb');
sql.Add('LINES STARTING BY :db TERMINATED BY :eb');
ab:=';';
bb:='"';
cb:='';
db:='';
eb:='\r\n';
parameters.ParamByName('fn').Value:=filename;
parameters.ParamByName('ab').Value:=utf8toansi(ab);
parameters.ParamByName('bb').Value:=utf8toansi(bb);
parameters.ParamByName('cb').Value:=utf8toansi(cb);
parameters.ParamByName('db').Value:=utf8toansi(db);
parameters.ParamByName('eb').Value:=utf8toansi(eb);
execsql();
end;
end;



Переделал еще так: таже самая ерезь

Автор: kami 9.12.2012, 21:44
Нескромный вопрос - а на кой тут utf8toansi ???
Не пытались посмотреть, что в итоге получается в каждом параметре?
Если таблица в UTF-8, то Delphi тут ни при чем - преобразование UTF8 - ansi должно настраиваться в ODBC-коннекторе.

Автор: Randomazer 9.12.2012, 21:50
Цитата(kami @  9.12.2012,  21:44 Найти цитируемый пост)
Нескромный вопрос - а на кой тут utf8toansi ???
Не пытались посмотреть, что в итоге получается в каждом параметре?
Если таблица в UTF-8, то Delphi тут ни при чем - преобразование UTF8 - ansi должно настраиваться в ODBC-коннекторе.


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

Автор: kami 9.12.2012, 21:57
Судя про скриншоту, у Вас каждый параметр сопровождается "префиксом" из 
Цитата

_cp1251'

Посмотрите, где он появляется - то ли уже в коде, непосредственно при заполнении параметров, то ли нужно поменять настройки коннектора, потому что он ерундит по незнанию.

Автор: Randomazer 9.12.2012, 22:04
Поменял, коннектор: теперь ерундит _latin1. Хотя запрос на показ всех полей проходит без ошибок

Добавлено через 2 минуты и 25 секунд
Use Connection String

Код

Driver};UID=root;SERVER=localhost;DATABASE=base;PORT=3306;"

Автор: kami 9.12.2012, 22:24
Цитата(Randomazer @  9.12.2012,  22:04 Найти цитируемый пост)
Use Connection String

Интересная строка подключения, у меня выглядит абсолютно по другому, при наличии того же ODBC драйвера 5.1. Можно посмотреть полностью?
Если быть более точным, то у меня так:
Цитата
Provider=MSDASQL.1;Persist Security Info=False;Data Source=mySQLLogistic

где mySQLLogistic - имя пользовательского DSN.
Построено стандартным методом 
Код

ConnString:=ADODB.PromptDataSource(0, OldConnectionString);

Автор: Randomazer 9.12.2012, 22:35
Код

Provider=MSDASQL.1;Persist Security Info=False;User ID=root;Extended Properties="DRIVER={MySQL ODBC 5.1 Driver};UID=root;SERVER=localhost;DATABASE=base;PORT=3306;"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)