首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将数据类型“格式化”的值插入到MSI数据库中

如何将数据类型“格式化”的值插入到MSI数据库中
EN

Stack Overflow用户
提问于 2016-01-15 13:42:18
回答 2查看 117关注 0票数 0

我试图在CustomAction表中添加一个自定义操作,问题是,由于请求的类型是格式化的,所以当我试图向列中插入字符串时,列名msi.The是数据类型的Formatted.It失败。

代码语言:javascript
复制
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();   

它总是抛出异常,我能够在Action中添加值,而不会出现任何problem.The问题,而目标是格式化的数据类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-15 19:55:10

如果抛出异常的是view.Execute,那么可以这样说,只是为了显式。另外,在异常本身(或内部异常)的某个地方,应该有一个与MSI相关的错误号或文本,它用MSI术语说明了异常的细节。

总之,Target是格式化的,这是文本。文本字符串的最大长度为255个字符,根据我的计算,文本长度超过255个字符。这很可能是问题所在。您可以用一个非常小的字符串进行测试以验证。您的替代方法是将脚本插入二进制表并相应地更改自定义操作。

票数 1
EN

Stack Overflow用户

发布于 2016-01-21 12:32:08

我没有重新格式化字符串,所以在使用它之前检查它:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34812422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档