Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Как определить тип столбца таблицы?   Найти похожие ветки 

 
Layner ©   (2005-06-30 13:46) [0]

БД, Access, цикл по столбцам, если столбик Integer, то сохраняю в string переменную: IntToStr(ds1..Field[1].AsInteger), если Double, то также, только FloatToStr(..), а вот как узнать, столбик, Integer он, или Memo, или стринговое?


 
Desdechado ©   (2005-06-30 13:47) [1]

FieldByName("x").DataType


 
Layner ©   (2005-06-30 13:52) [2]

Desdechado ©   (30.06.05 13:47), спасибо! Я видел SetFieldType, думаю где же GetFieldType, по аналогии, а оно оказывается вот как называется, благодарю!


 
Плохиш ©   (2005-06-30 13:53) [3]


> Layner ©   (30.06.05 13:46)

Извращенец! .AsString


 
msguns ©   (2005-06-30 14:00) [4]

>Desdechado ©   (30.06.05 13:47) [1]
>FieldByName("x").DataType

Строго говоря, это неточная информация. Мягко выражаясь ;)


 
Layner ©   (2005-06-30 14:03) [5]

Блин, что то не получается
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 ds1.DataSet.FieldCount-1 do
         begin
          if ds1.DataSet.Fields[i].DataType = ftInteger then s:=s + IntToStr(ds1.DataSet.Fields[i].AsInteger);
          if ds1.DataSet.Fields[i].DataType = ftString then s:=s + ds1.DataSet.Fields[i].AsString;
         end;
         s:=s+#13#10;
       q1.Next;
      end; //while
   end;
 q1.Active:=False;
 Showmessage(s);
end;


Код ничего не возвращает, кроме перевода каретки :) В таблице 2 столбика, один - счетчик, второй текст, 255символов.

Может в сравнение не тот формат поля смотрю?


 
Val ©   (2005-06-30 14:10) [6]

Послушайте Плохиша.
P.S. Сладкое  благотворно действует на работу мозга :)


 
msguns ©   (2005-06-30 14:16) [7]

Интересно, а куда потом эту загадочную s,- в файл, на экран, к черту в Магадан ?

И еще вопрос, а если в таблице 200 полей и 10000 записей ?
Или есть данные типа дробей или даты ?


 
Johnmen ©   (2005-06-30 14:22) [8]


> Layner ©   (30.06.05 14:03) [5]


Что за ds1.DataSet ? И причем тут q1 ?


 
Layner ©   (2005-06-30 14:23) [9]

Интересно, а куда потом эту загадочную s,- в файл, на экран, к черту в Магадан ?
При всем уважении, скажи, не все ли равно, куда я ее дену? Да, в таблице именно столько полей и записей, и что? Лучше помоги реализовать, а не влеймить.


 
Layner ©   (2005-06-30 14:24) [10]

ds1 - DataSource1
q1 - ADOQuery1


 
Layner ©   (2005-06-30 14:26) [11]

Или есть данные типа дробей или даты ?
Да, дата тоже есть, но смысла нет перебирать все типы, мне б парочку отловить, дальше сам.


 
Johnmen ©   (2005-06-30 14:27) [12]

>ds1 - DataSource1
>q1 - ADOQuery1

Это что, вся тайная и бесценная инфа ?
:)))


 
Val ©   (2005-06-30 14:29) [13]

>[10] Layner ©   (30.06.05 14:24)
вот пример абсолютно бесполезной информации.
Johnmen © спрашивает одно ли это и то же, потому как бежите по квери, а анализируете набор полей ds1.dataset.


 
Layner ©   (2005-06-30 14:40) [14]

[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:49) [15]

>[14] Layner ©   (30.06.05 14:40)
это намекает на то что, скорее всего, этот датасет и квери - одно и то же :)
почитайте посты еще раз в этой ветке, пожалуйста, и постарайтесь понять, что может помочь:
1. проверьте запросом отдельно, что он возвращает.
2. если он возвращает то что вам нужно, то выкиньте проверки на тип поля и просто присваивайте AsString иначе выкиньте и запрос туда же или разберитесь с данными.
3. пройдитесь пошаговой отладкой и посмотрите, что происходит при выполнении.


 
Johnmen ©   (2005-06-30 15:00) [16]

4. Выкинуть RecordCount, как бессмысленный во всех смыслах :)


 
Layner ©   (2005-06-30 15:01) [17]

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;


 
Плохиш ©   (2005-06-30 15:06) [18]


> Layner ©   (30.06.05 15:01) [17]
> чекнусь скоро

Ну если до сих пор не додумался в отладчике посмотреть значение свойства DataType, то скоро уже прошло.


 
Layner ©   (2005-06-30 15:08) [19]

Точно, посмотрел в отладчике, ftWideString!!! Бывает иногда, прошу простить :)


 
msguns ©   (2005-06-30 15:22) [20]

А ведь вопрос о загадочной s был не спроста. Если надо просто сохранить всю таблицу, например, в текстовом файле (как один из распространенных способов пересылки, причем вне зависимости от формата БД), то тогда вместо всего этого блокбастера с кучей кейсов годилось бы простое AsString на любое поле (кроме битового, конечно). Одна строка вместо кучи совершенно ненужного, а главное, нагоняющего туман, кода.

На что, собственно, и намекал Плохиш в 3-м еще посте.


 
Desdechado ©   (2005-06-30 18:19) [21]

2 msguns ©
А на что намекалось в [4]?
Что неверно в [1]?


 
msguns ©   (2005-07-01 09:22) [22]

>Desdechado ©   (30.06.05 18:19) [21]

Типы полей базового класса дельфишного TField (DataTyp&ecirc;: ftXXXXX) не совсем (очень мягко сказано) совпадают с нативными типами конкретных серверов или локальных СУБД. Есть корректная интерпретация натива в дельфи и наоборот для большинства типов полей. Но иногда можно напороться на непонятки. Как пример-типы полей акцеса, соответствующие ftFloat.


 
Anatoly Podgoretsky ©   (2005-07-01 09:28) [23]

Смысл данного действа какой то смутный, ну будет в результате 123 и что с этой абракадаброй делать? Не могу я понять современных интеллектуалов.


 
Desdechado ©   (2005-07-01 11:09) [24]

[22]
Возможно. Но ведь все равно работать с полями на клиенте как-то надо. И средствами клиента. И то, что FLOAT преобразуется в BCD или FMTBCD, так это нормально, просто такова интерпретация полей. Ведь от этот механизм работает? Просто надо не забывать о тонкостях...


 
mmmm   (2005-07-01 13:03) [25]

Anatoly Podgoretsky ©   (01.07.05 09:28)
Анатолий, я на SQL.ru ваши подобные ответы читать без смеху не могу, ладно тут... Так и впоминаю Черномырдина, так же не мог связать А плюс Б. Прошу не обижаться. ДОСТАЛО.



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.067 c
14-1121262293
Pil
2005-07-13 17:44
2005.08.07
Где взять документацию для XLReport на русском языке?


14-1121706889
Ajax
2005-07-18 21:14
2005.08.07
"Жди меня и я вернусь..."


14-1121271727
Piter
2005-07-13 20:22
2005.08.07
Шлюз fido7.ru


8-1099032887
Dmitrij_K
2004-10-29 10:54
2005.08.07
AVER_GetRemoteData ???


1-1121395233
eXtreme
2005-07-15 06:40
2005.08.07
Обработчик событий компонента NMHTTP