各位高手:
本人使用了一位老外做的一个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 = 类型无效。
四、结束语
此问题纠缠了整整一天了,一直没找出解决办法,望各位高手不吝赐教!
敬谢!
本人使用了一位老外做的一个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 = 类型无效。
四、结束语
此问题纠缠了整整一天了,一直没找出解决办法,望各位高手不吝赐教!
敬谢!
感谢关注,可能你没有详细看我的需求,主键为Number,数字型,其他的Group_1至Group_100均希望设成“备注”型,但提示类型无效