使用Python的msilib-UPDATE语句失败,错误2259

时间:2014-01-16 08:30:56

标签: python windows-installer python-2.6

我有以下用于运行数据库语句的类方法:

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语句,但由于某些原因,当我尝试使用 string <运行MSIError 2259语句时,我会收到UPDATE个例外/ strong>作为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类型,AppIdRemoteServerName列为string类型。

它说here 2259错误意味着

  

数据库:[2]表更新失败。查询必须遵守受限制的Windows Installer SQL语法。

因为UPDATE语句的语法接合正确,所以我不知道我做错了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这个网站很神奇:发布问题的那一刻你突然得到答案。

无论如何,我错过了here明确指出

的部分
  

更新查询仅适用于非主要键列

这正是我试图做的事情(AppId是主键列)。毕竟它与字符串类型无关。