ADOX多步骤OLE DB操作产生的错误

问题描述:

我必须制作一个程序,关闭所有的Unicode压缩以及访问数据库(.mdb)中的所有“允许零长度”。ADOX多步骤OLE DB操作产生的错误

关闭允许零长度的方法工作得很好。但是,关闭Unicode压缩的方法完全不起作用,并返回以下异常:

多步骤OLE DB操作生成错误。检查每个OLE DB状态值(如果可用)。没有工作完成。

任何线索如何解决这个问题?

private void TurnOffUnicodeCompressionInField(ADOX.CatalogClass catalogClass, String tableName, String field) 
{   
    ADOX.Column column = catalogClass.Tables[tableName].Columns[field]; 
    ADOX.Property prop = column.Properties["Jet OLEDB:Compressed UNICODE Strings"]; 
    prop.Value = true; 
} 

private void TurnOffAllowZeroLengthInAllFields(ADOX.CatalogClass catalogClass, String tableName) 
{ 
    foreach (ADOX.Column column in catalogClass.Tables[tableName].Columns) 
     column.Properties["Jet OLEDB:Allow Zero Length"].Value = false; 
} 

private void MyButton_Click(object sender, EventArgs e) 
{ 
    String filePath = ""; 
    OpenFileDialog ofd = new OpenFileDialog(); 
    DialogResult result = ofd.ShowDialog(); 

    if (result == DialogResult.OK) 
    { 
     filePath = ofd.FileName; 
     ADOX.CatalogClass catDatabase = new ADOX.CatalogClass(); 
     catDatabase.let_ActiveConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath); 

     // SoftwareTable 
     TurnOffAllowZeroLengthInAllFields(catDatabase,"Software"); 
     TurnOffUnicodeCompressionInField(catDatabase, "Software", "Description"); 
     TurnOffUnicodeCompressionInField(catDatabase, "Software", "Name"); 
    }      
} 
+0

在Access中运行也会发生此问题。你以前的帖子中提到的SQL不适合吗? – Fionnuala 2010-07-27 10:29:41

+0

我必须使用ADOX删除允许零长度,为什么不使用ADOX删除UNICODE压缩?太糟糕了,它不按预期工作..任何想法? – MadSeb 2010-07-27 15:13:25

+1

ADOX是一个非本地数据抽象层,不一定能够操纵任何特定数据库引擎的所有属性。 Jet/ACE是一个特别糟糕的情况,因为它的原生数据接口层DAO在Jet 4发行版的时间框架中的MS ADO无处不在的活动期间受损。不幸的结果是几乎所有的事情都可以使用DAO,但是对于一些事情来说,唯一的支持就是ADO。而且,是的,这是愚蠢的,它真的很糟糕。我不知道Access团队是否打算在ACE中纠正这个问题,或者其中一些问题已经修复。 – 2010-08-05 20:09:21

您应该检查字符串没有相应的UNICODE值的字符,这些通常可以当文字被复制,并从像微软Word应用程序粘贴的介绍。具体而言,“聪明的引号”通常会导致问题。

也看看下面的线程(虽然它是C++)Discussion on ADOX Property Usage in C++

你能够遍历属性并显示它们的当前值吗?