2010-07-26 81 views
6

我必須製作一個程序,關閉所有的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

回答

0

您應該檢查字符串沒有相應的UNICODE值的字符,這些通常可以當文字被複制,並從像微軟Word應用程序粘貼的介紹。具體而言,「聰明的引號」通常會導致問題。

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

你能夠遍歷屬性並顯示它們的當前值嗎?