Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Добавление столбца в Access


Автор: GePo 1.8.2006, 23:01
Такая проблема: 
Использую ADO для подключения к базе Access.
В базе уже есть некая таблица tTest. Пусть в ней есть столбец ttName_en некоего типа( например - ftWideString ). Программно нужно создать столбец ttName_ru такого же типа, что и ttName_en в этой же таблице.
1) При использовании TADOTable.FieldDefs.Add я так понимаю, нужный столбец создается в памяти и в базе не создается. CreateField ведет себя аналогично.
2) Я бы с радостью использовал ALTER TABLE, если бы не одно но - в ADO типы нумеруется, а в запросе мне нужно их текстовое представление, которого нет.

Итак, как же можно создать такой столбец? Желательно средствами ADO.

Автор: Golden Hands 1.8.2006, 23:58
Цитата(GePo @  2.8.2006,  02:01 Найти цитируемый пост)
 в ADO типы нумеруется, а в запросе мне нужно их текстовое представление, которого нет.

Не понял.

Автор: Mephisto 2.8.2006, 09:46
Я так понял ты хочешь динамически подставлять тип поля?

Автор: GePo 2.8.2006, 13:19
Golden Hands, В ADO поле типа в классе TField имеет тип TFieldType. Это перечислимый тип => число.
В запросе:
Код

ALTER TABLE tTest ADD COLUMN ttName_ru sometype

Вот как sometype должно писаться, я не знаю
Mephisto, мне нужно создать поле с определенным типом, текстового названия которого я не знаю, только его значение TFieldType ( как ftWideString, ftInteger)

Автор: Vit 2.8.2006, 15:33
Цитата(GePo @  1.8.2006,  14:01 Найти цитируемый пост)
2) Я бы с радостью использовал ALTER TABLE, если бы не одно но - в ADO типы нумеруется, а в запросе мне нужно их текстовое представление, которого нет.



c:\Program Files\Common Files\Microsoft Shared\OFFICE11\1033\JETSQL40.CHM 

Автор: GePo 2.8.2006, 21:47
Vit, 
вот, что наделал после соединения хелпа по Jet SQL и ADO. В Access, как я понял некоторые типы не поддерживаются. Вот, может кому понадобится:
Код

function FieldTypeToStr(const F : TFieldType) : String;
begin
  case F of
  ftUnknown: // Unknown or undetermined
    result := '';
  ftBytes, // Fixed number of bytes (binary storage)
  ftVarBytes: // Variable number of bytes (binary storage)
    result := 'BINARY'; {
     1 byte per character
     Any type of data may be stored in a field of this type.
     No translation of the data (for example, to text) is made.
     How the data is input in a binary field dictates how it
     will appear as output.
    }

  ftFixedChar, // Fixed character field
  ftString, // Character or string field
  ftWideString: // Wide string field
    result := 'CHARACTER'; {
     2 bytes per character
     Zero to 255 characters
    }

  ftMemo, // Text memo field
  ftWideMemo:
    result := 'TEXT'; {
     2 bytes per character
     Zero to a maximum of 2.14 gigabytes.
    }

  ftSmallint: // 16-bit integer field
    result := 'SMALLINT'; {
    2 bytes
    A short integer between  – 32,768 and 32,767.
    }

  ftWord, // 16-bit unsigned integer field
  ftInteger: // 32-bit integer field
    result := 'INTEGER'; {
    4 bytes
    A long integer between  – 2,147,483,648 and 2,147,483,647.
    }
  
  ftBoolean: // Boolean field
    result := 'BIT'; {
     1 byte
     Yes and No values and fields that contain only one of two values. 
    }

  ftFloat: // Floating-point numeric field
    result := 'FLOAT'; {
    8 bytes
    A double-precision floating-point value with
    a range of  – 1.79769313486232E308 to  – 4.94065645841247E-324
    for negative values,
    4.94065645841247E-324 to 1.79769313486232E308
    for positive values, and 0.
    }

  ftCurrency: // Money field
    result := 'MONEY'; {
    8 bytes
    A scaled integer between
     – 922,337,203,685,477.5808 and 922,337,203,685,477.5807.
    }

  ftDate, // Date field
  ftTime, // Time field
  ftDateTime, // Date and time field
  ftTimeStamp: // Date and time field accessed through dbExpress
    result := 'DATETIME'; {
    8 bytes
    A date or time value between the years 100 and 9999.
    } 

  ftGraphic, // Bitmap field
  ftParadoxOle, // Paradox OLE field
  ftDBaseOle, // dBASE OLE field
  ftBlob, // Binary Large OBject field
  ftOraBlob,  // BLOB fields in Oracle 8 tables
  ftADT: // Abstract Data Type field
    result := 'IMAGE'; {
    As required
    Zero to a maximum of 2.14 gigabytes. Used for OLE objects.
    }

  ftGuid: // globally unique identifier (GUID) values
    result := 'UNIQUEIDENTIFIER'; {
    128 bits
    A unique identification number used with remote procedure calls.
    }

  ftBCD, // Binary-Coded Decimal field that can be converted to Currency type without a loss of precision.
  ftFMTBcd: // Binary-Coded Decimal field that is too large for ftBCD.
    result := 'DECIMAL';  {
    17 bytes
    An exact numeric data type that holds
    values from 1028 - 1 through - 1028 - 1.
    You can define both precision (1 - 28) and
    scale (0 - defined precision). The default
    precision and scale are 18 and 0, respectively.
    }

  ftAutoInc: // Auto-incrementing 32-bit integer counter field
    result := 'COUNTER';

  ftLargeint, // Int64 large integer field
  ftFmtMemo, // Formatted text memo field
  ftTypedBinary, // Typed binary field
  ftCursor, // Output cursor from an Oracle stored procedure (TParam only)
  ftArray, // Array field
  ftReference,  // REF field
  ftDataSet, // DataSet field
  ftOraClob, // CLOB fields in Oracle 8 tables
  ftVariant,  // Data of unknown or undetermined type
  ftInterface, // References to interfaces (IUnknown)
  ftIDispatch: // References to IDispatch interfaces
    raise EDatabaseError.Create('Not supported');
  end;
end;

Автор: Vit 2.8.2006, 22:37
  ftFixedChar  - char

  ftWord - int 

  ftOraBlob - image  


Теоретичеки, всё что не влазит в описанные типы можно попробовать заткнуть в Image

Автор: GePo 3.8.2006, 21:45
ok, код в соотвествии с этими замечаниями отредактировал. Спасибо. В этом коде, все нужные мне типы работают.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)