Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.041 c
4-1117717537
AlexTregubov
2005-06-02 17:05
2005.08.07
Плоский ComboBox


1-1121450403
agIle
2005-07-15 22:00
2005.08.07
MDI трабл


6-1114540433
Galiaf
2005-04-26 22:33
2005.08.07
Как отправить при помощи "ServerSocket" Переменную типа массив?


1-1121686069
Salik
2005-07-18 15:27
2005.08.07
StringGrid


1-1119562614
Зипп
2005-06-24 01:36
2005.08.07
Насколько эффективно использование Зип-архивов для сокрытия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский