紧急求救,关于用AdoX创建主键的问题。
由于使用ADO(非DotNet)时涉及大量的try语句和指针创建问题,小弟近日努力尝试自己包装一个具有基本功能的数据库类。
在编写一个根据现有的table在新文件创建一个完全相同的table的函数时遇到了问题:
调用_TablePtr::Keys::Append( const _variant_t & Item, enum KeyTypeEnum Type, const _variant_t & Column, _bstr_t RelatedTable, _bstr_t RelatedColumn )这个方法时,第一个参数Item只可以用_bstr_t传递字符串,当赋以一个转换为(_variant_t)(IDispatch *)的_KeysPtr对象会发生异常。
这样的话我就只可以创建以类型为_bstr_t的第三个参数Column为列名的主键,无法创建由多列构成的主键。
微软关于ADOX的帮助内容如下:
语法
Keys.Append Key [, KeyType] [, Column] [, RelatedTable] [, RelatedColumn]
参数
Key
要追加的 Key 对象或要创建并追加的键的名称。
KeyType
可选。Long 值,指定键的类型。Key 参数对应于 Key 对象 Type 属性。
Column
可选。String 值,指定要索引的列的名称。Columns 参数对应于 Column 对象的 Name 属性的值。
RelatedTable
可选。String 值,指定相关表的名称。RelatedTable 参数对应于 Table 对象的 Name 属性的值。
RelatedColumn
可选。String 值,指定外键的相关列的名称。RelatedColumn 参数对应于 Column 对象的 Name 属性的值。
说明
Columns 参数可使用列名或列名的数组。
由上述说明可见,key应可为键名或Key对象,这也在微软提供的VB代码中得到证明:' BeginCreateKeyVB
Sub Main()
On Error GoTo CreateKeyError
Dim kyForeign As New ADOX.Key
Dim cat As New ADOX.Catalog
' Connect the catalog
cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
"Data Source='c:\Program Files\Microsoft Office\" & _
"Office\Samples\Northwind.mdb';"
' Define the foreign key
kyForeign.Name = "CustOrder"
kyForeign.Type = adKeyForeign
kyForeign.RelatedTable = "Customers"
kyForeign.Columns.Append "CustomerId"
kyForeign.Columns("CustomerId").RelatedColumn = "CustomerId"
kyForeign.UpdateRule = adRICascade
' Append the foreign key
cat.Tables("Orders").Keys.Append kyForeign
'Delete the Key as this is a demonstration
cat.Tables("Orders").Keys.Delete kyForeign.Name
'Clean up
Set cat.ActiveConnection = Nothing
Set cat = Nothing
Set kyForeign = Nothing
Exit Sub
CreateKeyError:
Set cat = Nothing
Set kyForeign = Nothing
If Err <> 0 Then
MsgBox Err.Source & "-->" & Err.Description, , "Error"
End If
End Sub
' EndCreateKeyVB
但是在VC中我却无法找到方法作相同的实现,而帮助最后提到的“Columns 参数可使用列名或列名的数组”则更令我奇怪,如何用_variant_t包含文字数组?望各位高手不吝赐教。