2014-01-16 47 views
0

我有以下類方法,是爲了運行數據庫語句:在使用Python的msilib- UPDATE語句失敗,錯誤2259

class CDatabaseModifier(object): 
    def __init__(self, database): 
     """ Constructor gets database 
     """ 
     self._database = database 
    def RunStatement(self, statement): 
     """ Runs statement on database 
     """ 
     view = self._database.OpenView(statement) 
     view.Execute(None) 
     view.Close() 
     self._database.Commit() 

這適用於INSERT INTODELETE語句,但由於某種原因,我不斷收到MSIError 2259例外,當我嘗試運行UPDATE語句字符串作爲參數SET。例如:

import msilib 
db = msilib.OpenDatabase(r'C:\some\path\to\msi\bar.msi', msilib.MSIDBOPEN_DIRECT) 
m = CDatabaseModifier(db) 
m.RunStatement("UPDATE AppId SET ActivateAtStorage = 66 WHERE AppId = 'aaa'") # works OK 
m.RunStatement("UPDATE AppId SET AppId = 'ccc' WHERE AppId = 'bbb'") # throws MSIError: 1: 2259 2 
m.RunStatement("INSERT INTO AppId (AppId, RemoteServerName) VALUES ('foo', 'bar')") # works OK 

更多信息: 在AppIdActivateAtStorage列是short類型,AppIdRemoteServerNamestring類型。

它說here該2259錯誤意味着

數據庫:[2]表(一個或多個)更新失敗。查詢必須遵守受限制的Windows Installer SQL語法。

因爲UPDATE語句的語法接合權,我不知道我在做什麼錯。任何幫助,將不勝感激。

回答

1

這個網站很神奇:你發佈一個問題的那一刻你突然得到答案。

無論如何,我錯過了部分來自here,明確指出

更新查詢僅在非主鍵列工作。

這正是我想要做的(AppId是主鍵列)。它與字符串類型畢竟無關。