Updating a registry value in an MSI database (Modify method)

This blog entry provides an example of updating a registry value in an MSI database using the Modify method and VBScript. It follows on from the previous blog post which provided a tutorial on updating a registry value in an MSI database.

It forms part 6 of an 17-part series that explores how to use VBScript to manipulate MSI relational databases using the Windows Installer API. Throughout this series of tutorials, we identify the common issues that we encounter and the best practises that we use to overcome them.

Similarly to Updating a registry value in an MSI database let’s update the key we inserted earlier and change:

HKLM\Software\AlkaneTest\testName testValue

to

HKLM\Software\AlkaneTest\testName NewTestValue

When using the Modify method, we are modifying a record object (or in other words, a row of data returned from one of our tables). In order to do this, we must first find the record which we want to modify. To do this, we’ll base our script on Reading a registry value from an MSI database but change our SQL statement to:

Dim sql : sql = "SELECT `Value` FROM `Registry` WHERE `Registry` = 'SampleReg'"

Because we are searching for the name of a primary key (‘Registry’), and the primary key is always unique, this query will return one row of data. When we go inside the While…Wend loop we set our new value:

regRecord.StringData(1) = "newTestValue"
regView.Modify msiViewModifyUpdate, regRecord

Note how the value we are modifying is regRecord.StringData(1). The ‘1’ is referencing the column in the select statement above (i.e, the ‘Value’ column).
If our select statement was:

Dim sql : sql = "SELECT `Registry`,`Key`,`Value` FROM `Registry` WHERE `Registry` = 'SampleReg'"

Then our Modify statment would be this (Note how ‘1’ now becomes ‘3’, because ‘Value’ is the third column in our select query):

regRecord.StringData(3) = "newTestValue"
regView.Modify msiViewModifyUpdate, regRecord

Anyway, your script should now look like this:

'create 2 constants - one for when we want to just query the MSI (read) and one for when we want to make changes (write)
Const msiOpenDatabaseModeReadOnly = 0
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyInsert = 1
Const msiViewModifyUpdate = 2
Const msiViewModifyDelete = 6
Const msiViewModifyReplace = 4
'create WindowsInstaller.Installer object
Dim oInstaller : Set oInstaller = CreateObject("WindowsInstaller.Installer")
'open the MSI (the first argument supplied to the vbscript)
Dim oDatabase : Set oDatabase = oInstaller.OpenDatabase(WScript.Arguments(0),msiOpenDatabaseModeTransact) 
Dim sql : sql = "SELECT `Value` FROM `Registry` WHERE `Registry` = 'SampleReg'"
'create a view of the registry we want to see
Dim regView : Set regView = oDatabase.OpenView(sql)
'execute the query
regView.Execute 
'fetch the first row of data (if there is one!)
Dim regRecord : Set regRecord = regView.Fetch
'whilst we've returned a row and therefore regRecord is not Nothing
While Not regRecord Is Nothing
regRecord.StringData(1) = "newTestValue"
regView.Modify msiViewModifyUpdate, regRecord
'go and fetch the next row of data	
Set regRecord = regView.Fetch
Wend
oDatabase.Commit
regView.Close
Set regView = Nothing
Set regRecord = Nothing
Set oDatabase = Nothing
Set oInstaller = Nothing

Thanks for reading about updating a registry value in an MSI database using the Modify method and VBScript. Next you can find out how to update a primary key in an MSI database using the Modify method and VBScript.