Форум: "Базы";
Текущий архив: 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ê: 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