繁体   English   中英

如何在MSI数据库中插入“格式”数据类型的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM