![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема вытаскиваниея информации [D6, MySQL]
Separator © (2002-10-21 11:32:00)Я использую zeos компоненты.
У меня в базе есть поля под название Par1..ParX типа char(18). В них хранятся числовые данные, т.е. просто набор чисел. Как мне их вытащить???
Вот кусок кода:
var
Ar: array [1..18] of byte;
begin
ZMySqlQuery1.Sql.Clear;
ZMySqlQuery1.Sql("select Par1 from ArcRecv1 where NZap=1"); //NZap - номер записи
ZMySqlQuery1.Open;
Ar:= //Как вытащить???
ZMySqlQuery1.Close
end;
ЮЮ (2002-10-23 09:10:00) [21]а пробовал, что говорит passm © (21.10.02 12:41) ?
Separator (2002-10-23 08:49:00) [22]Другими прогами все нормально вытаскивается, все уже на 10 раз проверено, даже на c++ под Linux писали тестовую прогу, все везде есть. Да и я сам уже на дельфях проверял только другим методом, с помощью другой библиотеки.
ЮЮ (2002-10-23 08:28:00) [23]Это понятно. А почему ты думаешь, что в БД есть ещё что-то ???
Separator (2002-10-23 08:13:00) [24]Во первых:
move(P^, Par^, 18);
изменяются только первые две переменные, остальные нули.
Во вторых:
for i:= 0 to 255 do
Memo1.Lines.Add("P["+IntToStr(i)+"] = "+IntToStr(Ord(P[i])));
Кроме первых двух, все остальные нули
ЮЮ (2002-10-23 03:46:00) [25]>Почемуто забивает только 2 байта (0 и 1) остальное 0
А откуда уверенность, что заполнено более 2 байтов из 18 ?
Separator (2002-10-22 14:27:00) [26]проблема так и не решена. У кого еще есть какие-либо версии?
Separator (2002-10-22 07:18:00) [27]
> GetCurrentRecord(P);
Почемуто забивает только 2 байта (0 и 1) остальное 0
Separator (2002-10-22 07:09:00) [28]не получается.
var
Par: PPar;
P: pChar;
Ar: array [1..18] of byte;
i: integer;
begin
ZMySqlDatabase1.Connect;
ZMySqlQuery1.Open;
P:= StrAlloc(255);
GetMem(Par, 18);
ZMySqlQuery1.GetCurrentRecord(P);
Memo1.Lines.Clear;
for i:= 0 to 255 do
Memo1.Lines.Add("P["+IntToStr(i)+"] = "+IntToStr(Ord(P[i])));
move(P^, Par^, 18);
Memo1.Lines.Add("flgTS: "+IntToStr(Par^.flgTS));
Memo1.Lines.Add("Ckv: "+FloatToStr(Par^.Ckv));
Memo1.Lines.Add("Vmin: "+FloatToStr(Par^.Vmin));
Memo1.Lines.Add("Vkv: "+IntToStr(Par^.Vkv));
Memo1.Lines.Add("TimeRecv: "+IntToStr(Par^.TimeRecv));
Memo1.Lines.Add("TimeUpd: "+IntToStr(Par^.TimeUpd));
FreeMem(Par, 18);
ZMySqlQuery1.Close;
ZMySqlDatabase1.Disconnect;
end;
Separator (2002-10-22 06:38:00) [29]Length(St) = 0
Сейчас попробую
ЮЮ (2002-10-22 04:17:00) [30]St: ZMySqlQuery1.Fields.Fields[0].asString[1];
move(St, par, 18);
то получается, но с некоректными данными
Естественно, т.к. в St считан только первый символ из БД, а остальное - мусор. Тогда уж
St:= ZMySqlQuery1.Fields.Fields[0].asString;
Кстати, какой длины полуится при этом St, принимая во внимание наличие #0 ?
Если обрезает, то попробуй метод GetCurrentRecord
Separator (2002-10-21 13:58:00) [31]Не получается. если делать:
St: ZMySqlQuery1.Fields.Fields[0].asString[1];
move(St, par, 18);
то получается, но с некоректными данными. А если так как ты пишешь, то AccessViolitate
ЮЮ (2002-10-21 13:50:00) [32]VarType выдает 256.
это varString.
Тогда возвращаемся к
move(ZMySqlQuery1.Fields.Fields[0].asString[1], Par, 18);
Separator (2002-10-21 13:32:00) [33]Запрос выполняется.
VarType выдает 256. Я никогда не работал с вариантами и не заню как.
ЮЮ (2002-10-21 13:25:00) [34]Value типа variant.
A какой VarType ?
ЮЮ (2002-10-21 13:22:00) [35]"не корректные данные или AccessViolitate" - это, похоже, от ADO provider-а. Запрос-то сам выполняется?
Separator (2002-10-21 13:18:00) [36]Неа не корректные данные или AccessViolitate
В Ar тоже не удалось.
Прикол в том, что Value типа variant, а он тока 16 байт.
ЮЮ (2002-10-21 13:05:00) [37]А в Ar загнать удалось ?
Тогда может сразу
move(ZMySqlQuery1.Fields.Fields[0].Value, Par, 18);
Separator (2002-10-21 12:57:00) [38]#0 в самом начале и дальше тоже появляется. Вообще в ячейках хранятся структуры такого типа:
type
PPar= ^TPar;
TPar= packed record
flgTS: byte;
Ckv: single;
Vmin: single;
Vkv: byte;
TimeRecv: cardinal;
TimeUpd: cardinal
end;
Я в дальнейшем буду делать так:
move(Ar, Par, 18);
Кстати база так и заполнялась, тока в обратном порядке и на C++
ЮЮ (2002-10-21 12:55:00) [39]Хотя, можно и с Ord:
str := ZMySqlQuery1.Fields.Fields[0].AsString;
for i:= 0 to Length(str) - 1 do
Ar[i] := Ord(str[i+1]) - Ord("0");
ЮЮ (2002-10-21 12:47:00) [40]C Ord я, конечно, перегнул палку :-)
str := ZMySqlQuery1.Fields.Fields[0].AsString;
for i:= 0 to Length(str) - 1 do
Ar[i] := StrToInt( Copy(str,i,1) );