使用 ADOX 将 Table 添加到 Catalog 时报“类型无效”的原因和解决方法

http://blog.csdn.net/kfhzy/article/details/6020283

http://blog.csdn.net/kfhzy/article/details/6020545

李维的代码,原来链接的是MS SQL,改成ACCESS后,创建Table时报 类型无效 错误

原因:

除了

adDBTimeStamp 这样的Access 明显不支持的数据类型外,一般的,也有区别,adVarChar 在ACCESS里是adVarWChar
procedure TfrmCreateTable.btnCreateTableClick(Sender: TObject);
begin
  // create table
  with FCatalog do
  begin
    FTable := CoTable.Create;
    FTable.ParentCatalog := FCatalog;
    FTable.Name := edtTableName.Text;

    FTable.Columns.Append('ISBN', adVarWChar, 20);
    FTable.Columns.Append('BookName', adVarWChar, 60);
    FTable.Columns.Append('Publisher', adVarWChar, 60);
    FTable.Columns.Append('Author', adVarWChar, 10);
//    FTable.Columns.Append('PDT', adDBTimeStamp, 8); //MS SQL Server
    FTable.Columns.Append('Price', adInteger, 4);

    // create index
    FIndex := CoIndex.Create;
    with FIndex do
    begin
      Name := 'ISBN';
      PrimaryKey := True;
      Unique := True;
      Columns.Append('ISBN', adVarWChar, 20);
    end;
    FTable.Indexes.Append(FIndex, EmptyParam);
    Tables.Append(FTable);
  end;
end;
使用 ADOX 将 Table 添加到 Catalog 时报“类型无效”的原因和解决方法
作者:孟宪会 发表于:2010-10-21 11:12:18

使用 ADOX 创建 adDBTimeStamp 类型的字段时,会产生“类型无效”的错误提示,产生这种错误的原因是,数据库引擎 Provider 只能接受已知类型的数据类型,下面是可以接受的类型对照表:

ADOX.DataTypeEnum 类型枚举常量ValueJet 3.51Jet 4.0SQL 7.0
adBinary 128 Yes Yes Yes
adBoolean 11 Yes Yes Yes
adChar 129 Yes No Yes
adCurrency 6 Yes Yes Yes
adDate 7 Yes Yes No
adDouble 5 Yes Yes Yes
adGUID 72 Yes Yes Yes
adInteger 3 Yes Yes Yes
adLongVarBinary 205 Yes Yes Yes
adLongVarChar 201 Yes No Yes
adLongVarWChar 203 No Yes Yes
adNumeric 131 No Yes (with info)* Yes (with info)*
adSingle 4 Yes Yes Yes
adSmallInt 2 Yes Yes Yes
adUnsignedTinyInt 17 Yes Yes Yes
adVarBinary 204 Yes Yes Yes
adVarChar 200 Yes No Yes
adVarWChar 202 No Yes Yes
adWChar 130 No Yes Yes
adDBTimeStamp 135 No No Yes
* 在Microsoft Jet 4.0 和 Microsoft SQL Server 7.0 中使用 adNumeric 数据类型时,必须设置精度(precision)。
 
 

ADO 数据类型

下面的表格列出了 Access、SQL Server 与 Oracle 之间的数据类型映射:

DataType EnumValueAccessSQLServerOracle
adBigInt 20   BigInt (SQL Server 2000 +)  
adBinary 128   Binary
TimeStamp
Raw *
adBoolean 11 YesNo Bit  
adChar 129   Char Char
adCurrency 6 Currency Money
SmallMoney
 
adDate 7 Date DateTime  
adDBTimeStamp 135 DateTime (Access 97 (ODBC)) DateTime
SmallDateTime
Date
adDecimal 14     Decimal *
adDouble 5 Double Float Float
adGUID 72 ReplicationID (Access 97 (OLEDB)), (Access 2000 (OLEDB)) UniqueIdentifier (SQL Server 7.0 +)  
adIDispatch 9      
adInteger 3 AutoNumber
Integer
Long
Identity (SQL Server 6.5)
Int
Int *
adLongVarBinary 205 OLEObject Image Long Raw *
Blob (Oracle 8.1.x)
adLongVarChar 201 Memo (Access 97)
Hyperlink (Access 97)
Text Long *
Clob (Oracle 8.1.x)
adLongVarWChar 203 Memo (Access 2000 (OLEDB))
Hyperlink (Access 2000 (OLEDB))
NText (SQL Server 7.0 +) NClob (Oracle 8.1.x)
adNumeric 131 Decimal (Access 2000 (OLEDB)) Decimal
Numeric
Decimal
Integer
Number
SmallInt
adSingle 4 Single Real  
adSmallInt 2 Integer SmallInt  
adUnsignedTinyInt 17 Byte TinyInt  
adVarBinary 204 ReplicationID (Access 97) VarBinary  
adVarChar 200 Text (Access 97) VarChar VarChar
adVariant 12   Sql_Variant (SQL Server 2000 +) VarChar2
adVarWChar 202 Text (Access 2000 (OLEDB)) NVarChar (SQL Server 7.0 +) NVarChar2
adWChar 130   NChar (SQL Server 7.0 +)  

* 在 Oracle 8.0.x 中 - decimal 和 int 等于 number 和 number(10)。

原文地址:https://www.cnblogs.com/CodeGear/p/4280346.html