如何在程序中动态修改access的复合主键(100分)

  • 主题发起人 主题发起人 yclihua
  • 开始时间 开始时间
Y

yclihua

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在程序中动态修改access的复合主键?
 
你可以用SQL语句来添加、删除索引
create index lettersid on letters(id);
drop index lettersid;
也可以用ADOX来操作维护索引
var
Cat: Variant;
begin
Cat := CreateOleObject('ADOX.Catalog');
Cat.ActiveConnection := '......';
Cat.Tables.Indexes.Delete(IndexName);
Cat.Tables.Indexes.Add(IndexName, [Column1, column2...]);

SO EASY。

 
不好意思, 好象有点离题了 [^]
不过,你用ADOX对象的话,没有搞不定的问题
跟主键对应的就是Cat.Keys集合了。
KEY有Append, Delete方法,。。。。
你可以看microsoft ADO的帮助。
 
我看了ado的帮助,但讲的都是VB的例程。敬请指点在delphi如何来实现,假如有一个表test,
有字段(IDA;IDB;IDC;MC),以前是将IDA与IDB二个作为复合主键,现要在delphi程序中
将IDA、IDB及IDC三个作为复合主键,如何实现?

 
有帮助就最好了,其实也不用怎么转, 在Delphi中直接写就行了。
就象我上面写的一样:
var
Cat, aKey: Variant;
begin
Cat := CreateOleObject('ADOX.Catalog');
aKey := CreateOleObject('ADOX.Key');
Cat.ActiveConnection := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:/db1.mdb;'; //连接你的数据源


aKey.Name := 'TestKey';
// aKey.Type :=
aKey.Columns.Append('IDA');
aKey.Columns.Append('IDB');
aKey.Columns.Append('IDC');

//当然,你要在此之前把原有的主键删除,照着这个例子你应该不难做到的
cat.Tables['test'].Keys.Append(aKey);
 
1、我按照你的办法新增主键(在表还没有建立主键的情况下),运行正常,代码如下:
var
Cat, aKey: Variant;
begin
Cat := CreateOleObject('ADOX.Catalog');
aKey := CreateOleObject('ADOX.Key');
Cat.ActiveConnection := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Z:/study/mytest/综合/mytest.mdb;';
aKey.Name := 'TestKey';
// aKey.Type :=adKeyPrimary;
aKey.Columns.Append('IDA');
aKey.Columns.Append('IDB');
aKey.Columns.Append('IDC');
cat.Tables['test'].Keys.Append(aKey);
end;

2、但删除主键(表已经通过上面的方法建立主键后),运行失败,
报错提示为:OLE error 800A0CC1
代码如下:
var
Cat, aKey: Variant;
begin
Cat := CreateOleObject('ADOX.Catalog');
aKey := CreateOleObject('ADOX.Key');
Cat.ActiveConnection := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Z:/study/mytest/综合/mytest.mdb;';
aKey.Name := 'TestKey';
// aKey.Type :=adKeyPrimary;
aKey.Columns.Append('IDA');
aKey.Columns.Append('IDB');
aKey.Columns.Append('IDC');
cat.Tables['test'].Keys.delete(aKey);
end;
敬请指点,非常感谢!!!
 
删就不用这么麻烦啦
把名称传过去就行了:
cat.Tables['test'].Keys.delete('TestKey');
 
非常谢谢。
 
后退
顶部