Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить тип столбца таблицы?


Страницы:   1 2

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. Сладкое  благотворно действует на работу мозга :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо