![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить тип столбца таблицы?
Layner © (2005-06-30 13:46:00)БД, Access, цикл по столбцам, если столбик Integer, то сохраняю в string переменную: IntToStr(ds1..Field[1].AsInteger), если Double, то также, только FloatToStr(..), а вот как узнать, столбик, Integer он, или Memo, или стринговое?
mmmm (2005-07-01 13:03:00) [1]
Anatoly Podgoretsky © (01.07.05 09:28)
Анатолий, я на SQL.ru ваши подобные ответы читать без смеху не могу, ладно тут... Так и впоминаю Черномырдина, так же не мог связать А плюс Б. Прошу не обижаться. ДОСТАЛО.
Desdechado (2005-07-01 11:09:00) [2][22]
Возможно. Но ведь все равно работать с полями на клиенте как-то надо. И средствами клиента. И то, что FLOAT преобразуется в BCD или FMTBCD, так это нормально, просто такова интерпретация полей. Ведь от этот механизм работает? Просто надо не забывать о тонкостях...
Anatoly Podgoretsky (2005-07-01 09:28:00) [3]Смысл данного действа какой то смутный, ну будет в результате 123 и что с этой абракадаброй делать? Не могу я понять современных интеллектуалов.
msguns (2005-07-01 09:22:00) [4]>Desdechado © (30.06.05 18:19) [21]
Типы полей базового класса дельфишного TField (DataTypê: ftXXXXX) не совсем (очень мягко сказано) совпадают с нативными типами конкретных серверов или локальных СУБД. Есть корректная интерпретация натива в дельфи и наоборот для большинства типов полей. Но иногда можно напороться на непонятки. Как пример-типы полей акцеса, соответствующие ftFloat.
Desdechado (2005-06-30 18:19:00) [5]2 msguns ©
А на что намекалось в [4]?
Что неверно в [1]?
msguns (2005-06-30 15:22:00) [6]А ведь вопрос о загадочной s был не спроста. Если надо просто сохранить всю таблицу, например, в текстовом файле (как один из распространенных способов пересылки, причем вне зависимости от формата БД), то тогда вместо всего этого блокбастера с кучей кейсов годилось бы простое AsString на любоеполе (кроме битового, конечно). Одна строка вместо кучи совершенно ненужного, а главное, нагоняющего туман, кода.
На что, собственно, и намекал Плохиш в 3-м еще посте.
Layner (2005-06-30 15:08:00) [7]Точно, посмотрел в отладчике, ftWideString!!! Бывает иногда, прошу простить :)
Плохиш (2005-06-30 15:06:00) [8]
> Layner © (30.06.05 15:01) [17]
> чекнусь скоро
Ну если до сих пор не додумался в отладчике посмотреть значение свойства DataType, то скоро уже прошло.
Layner (2005-06-30 15:01:00) [9]Val © (30.06.05 14:49)
Да хз, почему значения не возвращаются, чекнусь скоро :) Переписал все, результат тот же. В выборке 10 строк, так что записи точно есть :) Сейчас пошагово посмотрю.
var
s: string;
i: integer;
v: Variant;
begin
s:='';
q1.SQL.Clear;
q1.SQL.Text:='SELECT * FROM table1';
q1.Active:=True;
q1.First;
while not q1.Eof do
begin
for i:=0 to q1.FieldCount-1 do
begin
if q1.Fields[i].IsNull then s:=s+'null,'
else
case q1.Fields[i].DataType of
ftSmallint, ftInteger, ftWord, ftLargeint:
s:=s+IntToStr(q1.Fields[i].AsInteger)+',';
ftBoolean:
if q1.Fields[i].AsBoolean then s:=s+'1,' else s:=s+'0,';
ftFloat, ftCurrency, ftBCD:
s:=s+q1.Fields[i].AsString+',';
ftDate, ftTime, ftDateTime:
s:=s+''''+FormatDateTime('yyyymmdd',q1.Fields[i].AsDateTime)+''',';
ftVariant:
begin
v:=q1.Fields[i].Value;
case VarType(v) of
varSmallint, varInteger, varBoolean, varShortInt, varByte, varWord, varLongWord:
s:=s+IntToStr(q1.Fields[i].AsInteger)+',';
varSingle, varDouble, varCurrency:
s:=s+q1.Fields[i].AsString+',';
varDate:
s:=s+''''+FormatDateTime('yyyymmdd',q1.Fields[i].AsDateTime)+''',';
else
s:=s+''''+StringReplace(q1.Fields[i].AsString,'''','''''',[rfReplaceAll])+''',';
end;
end;
end;
end;
s:=s+#13#10;
q1.Next;
end; //while
q1.Active:=False;
Showmessage(s);
end;
Johnmen (2005-06-30 15:00:00) [10]4. Выкинуть RecordCount, как бессмысленный во всех смыслах :)
Val (2005-06-30 14:49:00) [11]>[14] Layner © (30.06.05 14:40)
это намекает на то что, скорее всего, этот датасет и квери - одно и то же :)
почитайте посты еще раз в этой ветке, пожалуйста, и постарайтесь понять, что может помочь:
1. проверьте запросом отдельно, что он возвращает.
2. если он возвращает то что вам нужно, то выкиньте проверки на тип поля и просто присваивайте AsString иначе выкиньте и запрос туда же или разберитесь с данными.
3. пройдитесь пошаговой отладкой и посмотрите, что происходит при выполнении.
Layner (2005-06-30 14:40:00) [12]
[13] Val © (30.06.05 14:29)
Подставил вместо ds1 - q1, результат тот же
var
s: string;
i: integer;
begin
s:='';
q1.SQL.Clear;
q1.SQL.Text:='SELECT * FROM table1';
q1.Active:=True;
if ds1.DataSet.RecordCount<>0 then
begin
q1.First;
while not q1.Eof do
begin
for i:=0 to q1.FieldCount-1 do
begin
if q1.Fields[i].DataType = ftInteger then s:=s + IntToStr(q1.Fields[i].AsInteger);
if q1.Fields[i].DataType = ftString then s:=s + q1.Fields[i].AsString;
end;
s:=s+#13#10;
q1.Next;
end; //while
end;
q1.Active:=False;
Showmessage(s);
end;
Val (2005-06-30 14:29:00) [13]>[10] Layner © (30.06.05 14:24)
вот пример абсолютно бесполезной информации.
Johnmen © спрашивает одно ли это и то же, потому как бежите по квери, а анализируете набор полей ds1.dataset.
Johnmen (2005-06-30 14:27:00) [14]>ds1 - DataSource1
>q1 - ADOQuery1
Это что, вся тайная и бесценная инфа ?
:)))
Layner (2005-06-30 14:26:00) [15]Или есть данные типа дробей или даты ?
Да, дата тоже есть, но смысла нет перебирать все типы, мне б парочку отловить, дальше сам.
Layner (2005-06-30 14:24:00) [16]ds1 - DataSource1
q1 - ADOQuery1
Layner (2005-06-30 14:23:00) [17]Интересно, а куда потом эту загадочную s,- в файл, на экран, к черту в Магадан ?
При всем уважении, скажи, не все ли равно, куда я ее дену? Да, в таблице именно столько полей и записей, и что? Лучше помоги реализовать, а не влеймить.
Johnmen (2005-06-30 14:22:00) [18]
> Layner © (30.06.05 14:03) [5]
Что за ds1.DataSet ? И причем тут q1 ?
msguns (2005-06-30 14:16:00) [19]Интересно, а куда потом эту загадочную s,- в файл, на экран, к черту в Магадан ?
И еще вопрос, а если в таблице 200 полей и 10000 записей ?
Или есть данные типа дробей или даты ?
Val (2005-06-30 14:10:00) [20]Послушайте Плохиша.
P.S. Сладкое благотворно действует на работу мозга :)