[英]How to insert a value of data type 'Formatted' into the MSI database
我试图在MSI的CustomAction表中添加一个自定义操作。问题是列名称Target的数据类型为Formatted。由于请求的类型为Formatted,因此我尝试向该列中插入字符串时失败。
WindowsInstaller.Installer ins = (WindowsInstaller.Installer)new Installer();
string strFileMsi = @"D:\Pack.msi";
Database db3 = ins.OpenDatabase(strFileMsi, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeDirect);
System.Console.WriteLine("testing 1");
WindowsInstaller.View vw3 = db3.OpenView("INSERT INTO CustomAction (Action,Type,Target) VALUES ('DeleteAction',3174,'\'Option Explicit\n\n'On Error Resume Next\nDim objFSO, strappfolder, WshShell, strprogramfiles, WshProcessenv\nDim intFilesCount, intSubFolderCount, intFileCount, objGetFolder, ObjFolder\nSet objFSO = CreateObject(\"Scripting.FileSystemObject\") \nset WshShell = CreateObject(\"Wscript.Shell\")\nset WshProcessenv = WshShell.Environment(\"Process\")\nstrprogramfiles = WshProcessenv(\"PROGRAMFILES(x86)\")\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\err.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\err.txt\"\nEnd If\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\out.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\out.txt\"\nEnd If\n\n If ObjFSO.FolderExists(strprogramfiles & \"\\datavision -BMS\") Then\n\n Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\n Set objGetFolder = objFSO.GetFolder(strprogramfiles & \"\\datavision -BMS\")\n\n ObjFSO.DeleteFolder strprogramfiles & \"\\datavision -BMS\"\n End If')");
vw3.Execute(null);
System.Console.WriteLine("testing");
db3.Commit();
vw3.Close();
它总是抛出异常。我能够毫无问题地将值添加到操作类型中。问题来自于格式化数据类型的目标。
如果是view.Execute抛出异常,那么就这么明确地说。 此外,在异常本身(或内部异常)中的某处,应该有一个与MSI相关的错误号或文字,其中用MSI术语说明了有关异常的详细信息。
无论如何,目标是格式化的,即文本。 文字字符串的最大长度为255个字符,根据我的计算,您的文字长度超过255个字符。 这很可能是问题所在。 您可以使用很小的字符串进行测试以进行验证。 您的替代方法是将脚本插入Binary表并相应地更改自定义操作。
我不重新格式化字符串,所以在使用前先检查一下:
WindowsInstaller.View vw3 = db3.OpenView("SELECT * FROM CustomAction");
vw3.Execute(null);
Record record = ins.CreateRecord(4);
record.StringData[1] = "DeleteAction";
record.IntegerData[2] = 3174;
record.StringData[4] = "Option Explicit\n\n'On Error Resume Next\nDim objFSO, strappfolder, WshShell, strprogramfiles, WshProcessenv\nDim intFilesCount, intSubFolderCount, intFileCount, objGetFolder, ObjFolder\nSet objFSO = CreateObject(\"Scripting.FileSystemObject\") \nset WshShell = CreateObject(\"Wscript.Shell\")\nset WshProcessenv = WshShell.Environment(\"Process\")\nstrprogramfiles = WshProcessenv(\"PROGRAMFILES(x86)\")\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\err.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\err.txt\"\nEnd If\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\out.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\out.txt\"\nEnd If\n\n If ObjFSO.FolderExists(strprogramfiles & \"\\datavision -BMS\") Then\n\n Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\n Set objGetFolder = objFSO.GetFolder(strprogramfiles & \"\\datavision -BMS\")\n\n ObjFSO.DeleteFolder strprogramfiles & \"\\datavision -BMS\"\n End If";
vw3.Modify(MsiViewModify.msiViewModifyInsert, record);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.