Текущий архив: 2007.06.17;
Скачать: CL | DM;
Вниз
SQL-запрос на BDE API Найти похожие ветки
← →
Dmitry_177 (2007-03-26 19:43) [0]делаю SQL-запрос на BDE API..
var
szQuery: string;
i: integer;
iRecCount: Integer;
hCursor: hDBICur;
Props: CURProps;
pRecBuf: PChar;
...
szQuery := "SELECT Name FROM Table.DB"; // считать все имена из таблицы
if DbiQExecDirect(hDB, qrylangSQL, PChar(szQuery), @hCursor) = DBIERR_NONE then
begin
DbiGetExactRecordCount(hCursor, iRecCount);
for i := 0 to iRecCount - 1 do
begin
DbiGetCursorProps(hCursor, Props);
GetMem(pRecBuf, Props.iRecBufSize * SizeOf(BYTE));
DbiGetNextRecord(hCursor, dbiNOLOCK, pRecBuf, nil);
MessageBox(0, pRecBuf, "Test", 0); // к примеру выводить MessageBox-ом..
end;
end;
Вот с именами так работает.. Но если переделать запрос на такой:
szQuery := "SELECT * FROM Table.DB WHERE Name="...."";
Вобщем считать все данные по какому-то имени, то так уже не считывает..=((
полей там около 20, но в переменная iRecCount почему-то равна 1-му.. думаю ладно, поставил в цикле нужное число, сколько полей есть на самом деле, выдает почему-то постоянно одно и тоже, только имя.. Пробовал в запросе вместо звездочки, перечислить все поля, тоже самое..
Помогите пожалуйста..
← →
Dmitry_177 (2007-03-26 21:38) [1]Может это из-за того что поле Name из условия какраз и входит в состав всех полей которые мне нужно считать?
Т.е. szQuery := "SELECT Name, Address, Telephone FROM Table.DB WHERE Name="...""; так можно делать? Я пробовал и убрать Name, т.е. сделал так: szQuery := "SELECT Address, Telephone FROM Table.DB WHERE Name="...""; всеравно не работает...:(
← →
Sergey13 © (2007-03-27 08:41) [2]Я не знаток АПИ, но думаю причина в том, что в первом запросе возвращается много записей с одним полем, а в остальных вариантах возвращается одна запись с многими полями. Чувствуешь разницу?
← →
Dmitry_177 (2007-03-27 09:08) [3]так MessageBox это отобразил бы.. а нет..
← →
ЮЮ © (2007-03-27 09:27) [4]Интересно, какого размера ехешник надеешься получить, если 270K от использования DBTables тебя так напрягают.
З.Ы. Чтобы использлвать BDE API неплохо бы и BDE установить, дистрибутив которого значительно больше 270K
← →
Dmitry_177 (2007-03-27 10:03) [5]мне просто надо на BDE API...
← →
sniknik © (2007-03-27 10:49) [6]> мне просто надо на BDE API...
а, извиняюсь, ты без API можеш? на стандартных компонентах. потому как, раз уж хочеш их заменить то должен повторить сам в них реализованный функционал и значит знать их в совершенстве... и работу с ними и как устроены. а вопросы задаешь...
p.s. все это уже сделано, просто смотри исходники тех самых "всовершенствезнаемых" компонент.
← →
Dmitry_177 (2007-03-27 10:57) [7]Смотрел.. Я уже практически все сделал.. Осталось только это..
← →
sniknik © (2007-03-27 11:11) [8]> Смотрел.. Я уже практически все сделал.. Осталось только это..
ага, верю. именно поэтому у тебя вопрос практически не отличается от того чем закончили неделю назад... того же уровня.
еще смотри, пока не увидишь как там сделано выделение поля из записи, буфер то (судя по названию) возвращается на запись...
← →
Dmitry_177 (2007-03-27 12:28) [9]Сделал я так:
var
hCursor: hDBICur;
pFlds: pFLDDesc;
Blank: LongBool;
pRecBuf: PChar;
FieldString: String;
Props: CURProps;
i: integer;
...
DbiGetCursorProps(hCursor, Props);
GetMem(pRecBuf, Props.iRecBufSize * SizeOf(BYTE));
GetMem(pFlds, Props.iFields * sizeof(FLDDesc));
DbiGetFieldDescs(hCursor, pFlds);
DbiGetNextRecord(hCursor, dbiNOLOCK, pRecBuf, nil);
SetLength(FieldString, pFlds.iUnits1 + 1);
for i := 1 to Props.iFields do
begin
pFlds^.iFldNum := i;
if pFlds.iFldType = fldZSTRING then
begin
DbiGetField(hCursor, i, pRecBuf, pBYTE(PChar(FieldString)), Blank);
MessageBox(0, PChar(FieldString), "", 0);
end;
end;
Теперь вроде работает, выводит каждый раз в MessageBox-е содержание полей.. Но у меня в таблице есть еще поля типа даты, они почему-то тоже определяются как fldZSTRING.. и выводятся в MessageBox-е всякие иероглифы.. Подскажите мне пожалуйста.. очень надо..
Страницы: 1 вся ветка
Текущий архив: 2007.06.17;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.056 c