да то самое. поэтому удалил нафиг эти юниты и поставил ZEOS для MySQL
о чудо тестовое приложение подключилось таки к моей базе
однако ввиду полного незнания SQL , остуствия документации к ZEOS немогу понять как же мне считать данные оттуда.
по моим догадкам нужно юзать компоненту ZQuery но невтыкаю как она работает. с компонтентом мудак (MyDAC) поддержки и примеров больше, вот тока она коммерческая
Добавлено через 20 минут
проверил, мудак тоже успешно подключаетса в БД
теперь осталось научитса считывать поля из БД) с чего начать?
TMyConnection, TMyQuery, пишешь в TMyConnection хост, пароль, базу, юзера, в TMyQuery.SQL - в него пишешь запрос, TMyQuery.Execute - выполняет запрос, читаешь по TMyQuery.Fields или TMyQuery.FieldByName и соответственно у полей методы .AsInteger, .AsString. собсна всё
Вот общий вариант чтения данных из БД с перебором полученных значений:
PHP код:
MyQuery1.SQL.Text:= 'SELECT * FROM skills WHERE skillId = 100500'; MyQuery1.Open; MyQuery1.First; for i:= 0 to MyQuery1.RecordCount - 1 do begin skillLevel:= MyQuery1.FieldByName('level').AsInteger; ... MyQuery1.Next;//важно для перехода к следующей записи end; MyQuery1.Close;
есть класс прослойка.позволяющий юзать квери с любой нити без последствий.
delphi Код:
TZQueryWrapper = classprivate
Z : TZQuery;
function getsql: tstrings;
procedure setsql(const Value: tstrings);
protectedProcedure SynchCreate;
Procedure SynchDestroy;
procedure SynchOpen;
procedure SynchClose;
procedure SynchExecSql;
procedure SynchNext;
publicprocedure Open;
procedureClose;
procedure ExecSql;
procedure next;
Function RowsAffected : integer;
FunctionEof : boolean;
function GetBlobFieldData(FieldNo: Integer; var Buffer: TBlobByteData): Integer;
Function FieldByName(const name : string):Tfield;
property sql : tstrings read getsql write setsql;
Constructor Create;
Destructor destroy; override;
end;
{ TZQueryWrapper }procedure TZQueryWrapper.Close;
beginif GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchClose)else
SynchClose;
end;
constructor TZQueryWrapper.Create;
begin
z := nil;
if GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchCreate)else
SynchCreate;
end;
destructor TZQueryWrapper.destroy;
beginif GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchDestroy)else
SynchDestroy;
inherited;
end;
function TZQueryWrapper.Eof: boolean;
begin
result := z.Eof;
end;
procedure TZQueryWrapper.ExecSql;
beginif GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchExecSql)else
SynchExecSql;
end;
function TZQueryWrapper.FieldByName(const name: string): Tfield;
begin
Result := z.FieldByName(name);
end;
function TZQueryWrapper.GetBlobFieldData(FieldNo: Integer;
var Buffer: TBlobByteData): Integer;
begin
result := z.GetBlobFieldData(FieldNo,Buffer);
end;
function TZQueryWrapper.getsql: tstrings;
begin
result := Z.SQL;
end;
procedure TZQueryWrapper.next;
beginif GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchNext)else
SynchNext;
end;
procedure TZQueryWrapper.Open;
beginif GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchOpen)else
SynchOpen;
end;
function TZQueryWrapper.RowsAffected: integer;
begin
Result := z.RowsAffected;
end;
procedure TZQueryWrapper.setsql(const Value: tstrings);
begin
Z.SQL := Value;
end;
procedure TZQueryWrapper.SynchClose;
begin
z.Close;
end;
procedure TZQueryWrapper.SynchCreate;
beginifnot dmDB.SqlConnection.Connectedthen
dmDB.SqlConnection.Connect;
Z := TZQuery.Create(nil);
z.Connection := dmDB.SqlConnection;
end;
procedure TZQueryWrapper.SynchDestroy;
begin
z.free;
end;
procedure TZQueryWrapper.SynchExecSql;
begin
z.ExecSQL;
end;
procedure TZQueryWrapper.SynchNext;
begin
z.Next;
end;
procedure TZQueryWrapper.SynchOpen;
begin
z.Open;
end;
есть глобально обьявленная функция.
delphi Код:
Function NewUpdateQuery(sQuesry : string):TZQueryWrapper;
begin
result := TZQueryWrapper.Create;
result.sql.Text := sQuesry;
end;
ну. и в итоге, юзаем как то так.
delphi Код:
with NewUpdateQuery(format('select id from build_parsers where buildnum = %d',[NewBuild]))dobegin
open;
whilenoteofdobeginDeleteFile(pchar(format('%s\%d.bin',[OutputDir,FieldByName('id').AsInteger])));
next;
end;
Close;
Destroy;
end;
public static final int TYPE1_WEAPON_RING_EARRING_NECKLACE = 0;
public static final int TYPE1_SHIELD_ARMOR = 1;
public static final int TYPE1_OTHER = 2;
public static final int TYPE1_ITEM_QUESTITEM_ADENA = 4;
public static final byte TYPE2_WEAPON = 0;
public static final byte TYPE2_SHIELD_ARMOR = 1;
public static final byte TYPE2_ACCESSORY = 2;
public static final byte TYPE2_QUEST = 3;
public static final byte TYPE2_MONEY = 4;
public static final byte TYPE2_OTHER = 5;
public static final byte TYPE2_PET_WOLF = 6;
public static final byte TYPE2_PET_HATCHLING = 7;
public static final byte TYPE2_PET_STRIDER = 8;
public static final byte TYPE2_NODROP = 9;
public static final byte TYPE2_PET_GWOLF = 10;
public static final byte TYPE2_PENDANT = 11;
public static final byte TYPE2_PET_BABY = 12;
public static final int SLOT_NONE = 0x00000;
public static final int SLOT_UNDERWEAR = 0x00001;
public static final int SLOT_CLOAK = 0x0003; //TODO:????
public static final int SLOT_R_EAR = 0x00002;
public static final int SLOT_L_EAR = 0x00004;
public static final int SLOT_NECK = 0x00008;
public static final int SLOT_R_FINGER = 0x00010;
public static final int SLOT_L_FINGER = 0x00020;
public static final int SLOT_HEAD = 0x00040;
public static final int SLOT_R_HAND = 0x00080;
public static final int SLOT_L_HAND = 0x00100;
public static final int SLOT_GLOVES = 0x00200;
public static final int SLOT_CHEST = 0x00400;
public static final int SLOT_LEGS = 0x00800;
public static final int SLOT_FEET = 0x01000;
public static final int SLOT_BACK = 0x02000;
public static final int SLOT_LR_HAND = 0x04000;
public static final int SLOT_FULL_ARMOR = 0x08000;
public static final int SLOT_HAIR = 0x10000;
public static final int SLOT_FORMAL_WEAR = 0x20000;
public static final int SLOT_DHAIR = 0x40000;
public static final int SLOT_HAIRALL = 0x80000;
public static final int SLOT_R_BRACELET = 0x100000;
public static final int SLOT_L_BRACELET = 0x200000;
public static final int SLOT_DECO = 0x400000;
public static final int SLOT_SIGIL = 0x000000; // TODO: fix
public static final int SLOT_BELT = 0x10000000;
public static final int SLOT_WOLF = -100;
public static final int SLOT_HATCHLING = -101;
public static final int SLOT_STRIDER = -102;
public static final int SLOT_BABYPET = -103;
public static final int SLOT_GWOLF = -104;
public static final int SLOT_PENDANT = -105;
Добавлено через 3 минуты
Цитата:
Сообщение от mira
Добавлено через 13 минут
типы вепонов в цифрах тоже ненашол. например какая цифра соответствует dualsword
про какие именно цифры идёт речь?
__________________ Начало.
Последний раз редактировалось supernewbie, 12.06.2012 в 19:14.
Причина: Добавлено сообщение