各位高手:
    本人使用了一位老外做的一个ADO封装类(http://www.codeproject.com/KB/database/caaadoxclass.aspx  --CADOX  和 http://www.codeproject.com/KB/database/caaadoclass1.aspx --CADO ,相应网页上有相应类源码可下载。他做了两套封装,有兴趣的可以看看,个人觉得还是很不错的)。
    需要说明一下的是,CADO封装了_ConnectionPtr、_RecordsetPtr、_ParameterPtr、_CommandPtr等类。
    而CADOX主要用来实现对数据库或库中表的操作(创建、删除、修改等)
    一、本人已完成的部分:
    (1)使用CADOX创建了一个ACCESS数据库(Test.mdb),并在库中成功创建一个表(Table1),表的中各字段名可通过程序指定,第一列为索引列类型为数字(对应于ADO中为adInteger,对应于CADOX封装类中为typeInteger),其余各列的类型也为数字型。
    (2)使用CADO对Test.mdb中的Table1能进行读取、写入、修改等操作。
    
    二、现在碰到的问题:
    我想使用CADOX在Test.mdb中创建一个表格Table2,同样,第一列也为索引列,其余列为备注型(因为我想在相应字段中存放字母和数字),备注类型对应于与ADO中的adLongVarChar,对应于CADOX中的typeLongVarChar。
    相应代码为:
        CString i = "";
    CString j = "";
    int k = 1;    //使用CADO中的CADOXCatalog类初始化对象
    CADOXCatalog pxcat;
    CString strConnection = _T("");
    strConnection = "Provider=Microsoft.JET.OLEDB.4.0;Data source = "
"e:\\work\\WriteData\\Test.mdb;Jet OLEDB:Engine Type=5;";
    pxcat.Open(strConnection);//打开Test.mdb    //在Test.mdb中创建表格Table2
    CADOXTable pxTable(&pxcat);
    pxTable.Create("Table2");    //创建列“Number”,后面设置它为索引列
    pxTable.AddField("Number", CADOXTable::typeInteger, 0);
    //创建其他列,列名为从“Number_1”至“Number_100”
    for( k = 1; k <= 100; k++)
{
   i.Format("%ld",k);
   j = "Group_" + i;
   pxTable.AddField(j, CADOXTable::typeLongVarChar, 0);
}
    pxcat.AddTable(pxTable);                      //调试至此出错,出错提示详细内容详见第三部分
    
    //设置Number列为主键(索引列)
    CADOXIndex pxInd;
    pxInd.Create("Index1");
    pxInd.AddField("Number", CADOXIndex::typeInteger, 0);
    pxInd.SetPrimarKey();
    pxTable.AddIndex(pxInd);
        三、相关说明:
   (1)从网上资料查明ACCESS->ADO的数据类型映射为:(http://www.cnblogs.com/same/archive/2007/08/29/874790.html)
    Oracle SQL类型 Jet SQL类型     Access显示值       ADO类型常量                 ADO常量值
    Byte                         数字(字节)        adUnsignedTinyInt         17
   SmallInt                      数字(整型)        adSmallInt                2
   Integer,       Long           数字(长整型)       adInteger                3
   Single                        数字(单精度)       adSingle                 4
   Double,        Number         数字(双精度)       adDouble                 5
   Currency                      数字(货币)        adCurrency                6
   VARCHAR(n)    Text[(n)]       文本               adVarChar                 200
   LONG Memo                     备注               adLongVarChar             201
   DateTime                      日期/时间            adDate                  7
   Logical                       是/否               adBoolean                11
   Binary                        二进制             adVarBinary               204
   LONG RAW LongBinary           OLD对象           adLongVarBinary            205
   NUMERIC(a,b)   adNumeric 131   无
   DATE   adDBTimeStamp 135       无   (2)ADOX与ADO类型对应关系(ADOX对ADO中类型名进行了重命名)    
class CADOXTable
{public:
enum DataType
{
typeSmallInt = adSmallInt,
typeInteger = adInteger,
typeUnsignedTinyInt = adUnsignedTinyInt,
typeUnsignedSmallInt = adUnsignedSmallInt,
typeUnsignedInt = adUnsignedInt,
typeUnsignedBigInt = adUnsignedBigInt,
typeSingle = adSingle,
typeDouble = adDouble,
typeCurrency = adCurrency,
typeDecimal = adDecimal,
typeNumeric = adNumeric,
typeBoolean = adBoolean,
typeDate = adDate,
typeDBDate = adDBDate,
typeDBTime = adDBTime,
typeDBTimeStamp = adDBTimeStamp,
typeBSTR = adBSTR,
typeVarChar = adVarChar,
typeLongVarChar = adLongVarChar,
typeWChar = adWChar,
typeVarWChar = adVarWChar,
typeLongVarWChar = adLongVarWChar,
typeBinary = adBinary,
typeVarBinary = adVarBinary,
typeLongVarBinary = adLongVarBinary,
typeChapter = adChapter,
typeFileTime = adFileTime,
typePropVariant = adPropVariant,
typeChar = adChar,                 //本人添加的类型 20080923
                typeUserDefined = adUserDefined,   //本人添加的类型 20080924
typeVarNumeric = adVarNumeric
};
        (3)需要特别说明的是:第二部分附上的源代码,如果把     pxTable.AddField(j, CADOXTable::typeLongVarChar, 0);
改成
     pxTable.AddField(j, CADOXTable::typeInteger, 0);
    不会出现任何问题,能成功创建符合要求的表格Table2,并能通过CADO封装的相应类的相应方法存取数据表中的内容    (4)出错内容:
    CADOXCatalog Error
        Code = 80040e3d
        Code meaning = IDispatch error #3133
        Soure = Microsoft JET Database Engine
        Description = 类型无效。
    四、结束语
    此问题纠缠了整整一天了,一直没找出解决办法,望各位高手不吝赐教!
    敬谢!
         

解决方案 »

  1.   

    同时,我几乎把enum DataType中的类型试了一个遍,有大概有40%的类型,调试时提示“类型无效”出错,20%的提示“长度过长”,只有大概40%的可以成功使用,郁闷ing...
      

  2.   

    编程环境:WindowsXP SP2 +  Visual Studio .NET + ACCESS2003
      

  3.   

    备注,OLE类型,附件等类型,均不能其唯一性。故不能设为主键。
      

  4.   


    感谢关注,可能你没有详细看我的需求,主键为Number,数字型,其他的Group_1至Group_100均希望设成“备注”型,但提示类型无效