Русские буквы и несколько вопросов

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Aleksandr
Сообщения: 6
Зарегистрирован: Чт 23 фев 2012 09:11

Русские буквы и несколько вопросов

Сообщение Aleksandr » Вт 28 фев 2012 10:49

Привет.
Облазил все форумы, но не могу найти как записать русские буквы и буквы вида Ẅ в таблицу. То что нашел не работает.
Я недавно стал изучать базы, извините если задаю глупые вопросы, надеюсь на вашу помощь.
Пользуюсь Delphi XE2, Update 3

Создаю базу.

Код: Выделить всё

MyConnection1.ExecSQL('CREATE DATABASE if not exists test_base DEFAULT CHARACTER SET UTF8',[]);
Создаю таблицу

Код: Выделить всё

MyConnection1.ExecSQL('create table if not exists HH (name_id text(20) not null, primary key (name_id(20))) DEFAULT CHARACTER SET UTF8',[]);
Записываю в таблицу

Код: Выделить всё

var ss: string;
ss:=''Петров ы  PS2Ẅ [X]`~&*/%3#!/@@$$$-_ 5.{.}.''5''/|\††µ§??™c e'';
MyQuery1.FieldByName('name_id').AsString:=ss;
Скачал dbForge, программа показывает что в базу записалось
Ïåòðîâ û PS2? [X]`~&*/%3#!/@@$$$-_ 5.{.}.'5'/|\††µ§??™c e

Подскажите пожалуйста что надо сделать?
И еще можно спросить для чего нужны квадратные скобки
MyConnection1.ExecSQL('CREATE DATABASE if not exists test_base DEFAULT CHARACTER SET UTF8',[]);
MyConnection1.ExecSQL('create table if not exists HH (name_id text(20) not null, primary key (name_id(20))) DEFAULT CHARACTER SET UTF8',[]);

Что указывается в этих скобках и можно пример?
Я скачал демо проект, но к сожалению он слишком сложный для меня.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Вт 28 фев 2012 14:04

Здравствуйте,

Для решения проблемы с русскими символами Вам необходимо установить свойство TMyConnection.Options.UseUnicode в True. Например:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  ss: string;
begin
  MyConnection1.Options.UseUnicode := True;
  MyQuery1.SQL.Text := 'select * from hh';
  MyQuery1.Open;
  MyQuery1.Append;
  ss := 'Петров ы  PS2Ẅ [X]`~&*/%3#!/@@$$$-_ 5.{.}.''5''/|\††µ§??™c e';
  MyQuery1.FieldByName('name_id').AsString := ss;
  MyQuery1.Post;
end;
Вторым параметром метода TMyConnection.ExecSQL является массив значений параметров. Если текст запроса не содержит параметров, необходимо передавать пустой массив значений, т.е. [] . В противном случае необходимо передавать значения параметров. Например:

Код: Выделить всё

MyConnection1.ExecSQL('update hh set name_id=:new_name_id where name_id=:old_name_id', ['test1', 'test']);

Aleksandr
Сообщения: 6
Зарегистрирован: Чт 23 фев 2012 09:11

Сообщение Aleksandr » Вт 28 фев 2012 14:36

Большое спасибо, все работает :)

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

Если я хочу добавить строки в таблицу с несколькими колонками, то верно ли составлен код?
И если я использую транзакции, то ничего не упустил?

И можно узнать чем отличается MyQuery1.Append; от MyQuery1.Insert; ?
Вы в своем примере использовали MyQuery1.Append;

ss: string;
i2: integer;

MyQuery1.SQL.Text := 'select data_id, name_id, staty_id from hh';
MyConnection1.StartTransaction;
try
MyQuery1.Open;
for i:= 0 to 500 do
begin
i2:=i2+1;
MyQuery1.Insert;
MyQuery1.FieldByName('data_id').Asinteger:=201202;
MyQuery1.FieldByName('name_id').AsString:=inttostr(i2);
MyQuery1.FieldByName('staty_id').AsString:=ss;
MyQuery1.Post;
end;
MyConnection1.Commit;
MyQuery1.Close;
Except
MyQuery1.RestoreUpdates;
MyConnection1.Rollback;
raise;
end;

И еще я не могу понять как сделать апдейт :(

UPDATE Persons
SET Address='Nissestien 67', City='Sandnes'
WHERE LastName='Tjessem' AND FirstName='Jakob'

На таком примере подскажите что надо сделать?

MyQuery1.SQL.Text := 'UPDATE Persons SET Address="Nissestien 67",City="Sandnes" WHERE LastName="Tjessem" AND FirstName="Jakob"';

Я так понимаю что сам запрос пишется так.
А что дальше нужно если я хочу сделать обычный UPDATE?
И если я хочу сделать SELECT FOR UPDATE, то Вы можете привести пример?

Мне очень неловко спрашивать, хочу научиться, приобрести и пользоваться вашими компонентами.
Это единственное что я не могу понять.
Буду рад подарить за потраченное время $20 moneybookers

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Вт 28 фев 2012 15:59

Метод Append создает новую пустую запись в конце датасета, а метод Insert создает новую пустую запись на месте текущей записи в датасете.
Если Вы не установили свойство MyQuery1.CachedUpdates в True, то Вам не нужно использовать метод RestoreUpdates. Вот пример более корректного кода:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  MyQuery1.SQL.Text := 'select data_id, name_id, staty_id from hh';
  try
    MyQuery1.Open;
    MyConnection1.StartTransaction;
    for i := 0 to 500 do begin
      MyQuery1.Insert;
      MyQuery1.FieldByName('data_id').Asinteger := 201202;
      MyQuery1.FieldByName('name_id').AsString := IntToStr(i + 1);
      MyQuery1.FieldByName('staty_id').AsString := IntToStr(i + 1);
      MyQuery1.Post;
    end;
    MyConnection1.Commit;
    MyQuery1.Close;
  except
    if MyConnection1.InTransaction then
      MyConnection1.Rollback;
    raise;
  end;
end;

Aleksandr
Сообщения: 6
Зарегистрирован: Чт 23 фев 2012 09:11

Сообщение Aleksandr » Ср 29 фев 2012 06:49

Спасибо большое :)
Подскажите, пожалуйста, как сделать UPDATE и SELECT FOR UPDATE в моем сообщении выше :oops:
Я за последнию неделю просмотрел всю документацию и так и не могу понять как это сделать.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Ср 29 фев 2012 14:59

Код: Выделить всё

MyQuery1.SQL.Text := 'SELECT * FROM Persons WHERE LastName="Tjessem" AND FirstName="Jakob" FOR UPDATE';
MyQuery1.Execute;
MyQuery1.SQL.Text := 'UPDATE Persons SET Address="Nissestien 67", City="Sandnes" WHERE LastName="Tjessem" AND FirstName="Jakob"';
MyQuery1.Execute;

Aleksandr
Сообщения: 6
Зарегистрирован: Чт 23 фев 2012 09:11

Сообщение Aleksandr » Чт 01 мар 2012 13:36

AndreyZ, огромное спасибо!!!
В ближайшие дни куплю компоненты. :)

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Пт 02 мар 2012 08:19

Я рад что смог помочь Вам. Если возникнут дальнейшие вопросы, напишите нам.

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Сообщение imobile » Пн 19 мар 2012 10:46

А что делать если Unicode было false. Я думал что если таблица в уникодах, то ничего делать не надо. Когда поставил DBForge, понял, что ошибался. теперь новые таблицы в уникоде, а старые не уникоде. Как старые данные таблиц перевести в уникод без потерь? чтоб 'Иванов'='Иванов'(уникод)
Builder XE2

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Сообщение imobile » Пн 19 мар 2012 11:39

и еще, раньше были проблемы mybackup с mysql 5.5, сообщалось что будут решены в следующих релизах,(английском форуме) они решены?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Вт 20 мар 2012 11:28

Если Вы хотите увидеть корректные данные в dbForge, Вам надо установить опцию соединения Encoding в "default->Current Windows Code Page". Если же Вы хотите преобразовать данные, Вы можете использовать для этого компонент TMyDump. Например:

Код: Выделить всё

MyDump.Connection.Close;
MyDump.Connection.Options.Charset := '';
MyDump.Connection.Options.UseUnicode := False;
MyDump.TableNames := 'tablenames';
MyDump.BackupToFile('filename');
MyDump.Connection.Close;
MyDump.Connection.Options.UseUnicode := True;
MyDump.RestoreFromFile('filename');

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Вт 20 мар 2012 11:29

Уточните пожалуйста проблемы которые должны были быть решены с компонентом TMyBackup и MySQL 5.5. Если Вы имеете ввиду проблему с режимом bmBinary, то мы добавили генерацию ошибки c корректным сообщением.

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Сообщение imobile » Вт 20 мар 2012 12:06

Спасибо огромное.
Еще не разу не пользовался дампом.
А Backup нельзя пользоваться значит binary режимом начиная с 5.5? И еще, надо было отключать уникоды при сохранении в текстовом режиме, как на счет этого?
Я так понимаю дамп выполняет тоже резервное копирование, а что лучше использовать?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Ср 21 мар 2012 09:38

Да, bmBinary режимом нельзя пользоваться в MySQL 5.5. При этом режиме используется конструкция BACKUP TABLE которая является устаревшей и которая убрана в MySQL 5.5 ( http://dev.mysql.com/doc/refman/5.1/en/ ... table.html ). В режиме bmText, MyDAC использует конструкцию SELECT ... INTO OUTFILE ( http://dev.mysql.com/doc/refman/5.0/en/select-into.html ).
Column values are dumped using the binary character set. In effect, there is no character set conversion. If a table contains columns in several character sets, the output data file will as well and you may not be able to reload the file correctly.
Эта конструкция выгружает данные используя binary кодировку, поэтому свойства Charset и UseUnicode могут иметь любые значения, это не повлияет на результат бэкапа.
Компоненты TMyDump и TMyBackup имеют разное назначение. TMyBackup создает копию данных таблицы на сервере, а TMyDump создает SQL скрипт который содержит и структуру таблиц и их данные. Этот скрипт можно использовать для восстановления базы данных. Поэтому для создания резервных копий мы рекомендуем использовать TMyDump.

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Сообщение imobile » Ср 21 мар 2012 10:23

Спасибо за разъяснение.

Закрыто