在 nlog 中以编程方式创建数据库以启用 DatabaseTarget

2023-12-08

我正在 C# 中创建一个 DatabaseTarget 对象,并使用它将数据记录到 NLog 数据库中。

如果数据库不存在,nlog 目标将失败。我想检查数据库是否存在,以及是否没有创建它和日志表。

我可以看到 targetDB.Install(installationContext) 函数似乎能够完成这项工作,但找不到任何示例。有许多使用配置文件的示例。我想将其放入代码中,而不必在使用包含此代码的 DLL 的所有应用程序中部署配置文件。

如何检查和创建数据库?


此代码使用 Install() 方法创建日志记录数据库和表(如果它们尚不存在):

private static void GetDBLogger(string strConnectionString)
    {
        StringBuilder sb = new StringBuilder();
        InstallationContext installationContext = new InstallationContext();

        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
        builder.ConnectionString = strConnectionString;
        string strDatabase = builder.InitialCatalog;

        NLog.Targets.DatabaseTarget targetDB = new NLog.Targets.DatabaseTarget();

        targetDB.Name = "db";
        targetDB.ConnectionString = strConnectionString;

        NLog.Targets.DatabaseParameterInfo paramDB;

        paramDB = new NLog.Targets.DatabaseParameterInfo();
        paramDB.Name = string.Format("@Message");
        paramDB.Layout = string.Format("${{message}}");
        targetDB.Parameters.Add(paramDB);
        targetDB.CommandText = string.Format("INSERT INTO Logs(Message) VALUES (@message);");

        // Keep original configuration
        LoggingConfiguration config = LogManager.Configuration;
        if (config == null)
            config = new LoggingConfiguration();

        config.AddTarget(targetDB.Name, targetDB);

        LoggingRule rule = new LoggingRule("*", LogLevel.Debug, targetDB);
        config.LoggingRules.Add(rule);

        LogManager.Configuration = config;

        SqlConnectionStringBuilder builder2 = new SqlConnectionStringBuilder();
        builder2.ConnectionString = strConnectionString;
        builder2.InitialCatalog = "master";

        // we have to connect to master in order to do the install because the DB may not exist
        targetDB.InstallConnectionString = builder2.ConnectionString;

        sb.AppendLine(string.Format("IF NOT EXISTS (SELECT name FROM master.sys.databases WHERE name = N'{0}')", strDatabase));
        sb.AppendLine(string.Format("CREATE DATABASE {0}", strDatabase));

        DatabaseCommandInfo createDBCommand = new DatabaseCommandInfo();
        createDBCommand.Text = sb.ToString();
        createDBCommand.CommandType = System.Data.CommandType.Text;
        targetDB.InstallDdlCommands.Add(createDBCommand);

        // create the database if it does not exist
        targetDB.Install(installationContext);

        targetDB.InstallDdlCommands.Clear();
        sb.Clear();
        sb.AppendLine("IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND  TABLE_NAME = 'Logs')");
        sb.AppendLine("RETURN");
        sb.AppendLine("");
        sb.AppendLine("CREATE TABLE [dbo].[Logs](");
        sb.AppendLine("[LogId] [int] IDENTITY(1,1) NOT NULL,");
        sb.AppendLine("[Message] [nvarchar](max) NULL,");
        sb.AppendLine(" CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ");
        sb.AppendLine("(");
        sb.AppendLine("[LogId] ASC");
        sb.AppendLine(")WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]");
        sb.AppendLine(") ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]");

        DatabaseCommandInfo createTableCommand = new DatabaseCommandInfo();
        createTableCommand.Text = sb.ToString();
        createTableCommand.CommandType = System.Data.CommandType.Text;
        targetDB.InstallDdlCommands.Add(createTableCommand);

        // we can now connect to the target DB
        targetDB.InstallConnectionString = strConnectionString;

        // create the table if it does not exist
        targetDB.Install(installationContext);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 nlog 中以编程方式创建数据库以启用 DatabaseTarget 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • 无法通过 Flutter 中的 API 调用呈现 DropdownMenu 中的数据

    我正在尝试在我的项目中创建一个下拉菜单 其中需要在列表中显示的数据源自 API 调用 其响应如下所示 但是 我收到以下错误消息 并且我不知道如何解决此问题 There should be exactly one item with Drop
  • 将 CString 转换为 CTime

    In 智能设备MFC应用 我已成功转换CTime to CString 现在我想把它转换回来 CString to CTime 我怎样才能做到这一点 Use COleDateTime ParseDateTime CString 然后将其转换
  • PrimeFaces 数据表滚动条位于所需位置

    当我添加新记录 在默认可视区域之外 并更新数据表时 我有一个包含 100 多条记录的可滚动数据表 数据表从记录 0 加载 而我需要前一个位置的数据表视图 我的数据表代码
  • App.xaml 的 EventSetter 上出现错误 CS1061

    我试图通过我的代码创建一个元素并为其关联一个样式 还关联其 EventSetter 该样式工作完美 但当我尝试运行该函数时它不起作用 App xaml
  • 窗函数的确定性排序顺序

    I ve a status表 我想获取最新的详细信息 Slno ID Status date 1 1 Pass 15 06 2015 11 11 00 this is inserted first 2 1 Fail 15 06 2015 1
  • 这是否需要显式同步?

    我有两个线程 我想确保我在 LinkedBlockingQueue 上正确执行同步 这是正确的吗 或者 messageToCommsQueue 上的显式同步不需要吗 宣言 private LinkedBlockingQueue
  • 使用 python 2.5 将 zip 文件下载到本地驱动器并将所有文件解压到目标文件夹

    我正在尝试将 zip 文件下载到本地驱动器并将所有文件提取到目标文件夹 所以我想出了解决方案 但它只是将文件从一个目录 下载 到另一个目录 但它不适用于下载文件 对于提取 我可以让它在 2 6 中工作 但不能在 2 5 中工作 因此 我绝对
  • 错误:“stod”未在此范围内声明

    我正在开发一个 C 项目 我需要将字符串转换为双精度数 但我不断收到错误 stod 未在此范围内声明 仓促答复将不胜感激 include
  • 使用react-native切换手电筒(世博会)

    我正在尝试从我的反应本机导出应用程序切换手电筒 这Plugin不起作用 因为我正在使用 expo flashMode 属性世博相机组件允许我在拍照时切换闪光灯 有没有办法以其他方式切换手电筒 解决了React Native Expo 项目中
  • 单元测试 typescript 指令模板 karma-jasmine,html 未定义

    最近 我开始使用 karma jasmine 对我的打字稿代码进行单元测试 在为服务和简单 指令创建并运行测试用例后 我为自定义指令创建了一个测试用例 该测试用例有一个控制器 正在注入一项服务 并使用 4 个作用域变量与外界通信 这是一个简
  • Google Apps 脚本 - 从 HTML 创建 PDF 时不显示图像

    我正在尝试编写一个脚本 该脚本将输出带有已输入表单的值的 PDF 在此 PDF 中 我想在页面顶部添加一个徽标 该徽标是 Google Drive 文件夹中的图像 基于这个问题 和其他 图像需要转换为 base64 然后添加到 HTML 我
  • 泛型类型的实例[重复]

    这个问题在这里已经有答案了 我的问题是这样的 为什么不能用 new T 实例化泛型类型 而用类 Class 的 newInstance 就可以呢 您需要使用反射 newInstance 因为在编译时 需要链接其构造函数的类是未知的 所以编译
  • 如何使用JavaScript函数重定向到Struts2中的另一个jsp页面

    我想在打开时使用 JavaScript 函数将 JSP 重定向到另一个页面BeforeLogin页 但我收到以下错误消息 找不到 Struts 调度程序 这通常是由于使用 Struts 标签而没有关联的过滤器造成的 Struts 标签仅在请
  • 如何将 eval() 函数与变量列表一起使用?

    我有一个字符串形式的函数列表 y x 3 x 2 y 2 17 2 functions in list 我有一个清单Sympy Symbol对象 基本上是变量 whos name属性对应于函数字符串中的变量名称 Symbol x Symbo
  • 客户可配置的 ASP.NET 网站安全性,用于对页面和按钮访问进行细粒度控制

    我有一个 ASP NET 2 0 还没有 ajax 网站 将以编译的形式部署在多个客户站点上 通常该站点仅是 Intranet 一些客户信任他们的所有人 并且不关心限制对网站和 或页面功能的访问 另一些客户不信任任何人 只希望某些人和 或组
  • 哪个 Visual Studio 组件包含 MSVC Hostx 文件? [复制]

    这个问题在这里已经有答案了 My NET溶液含有一个editbin命令输入PostBuild events 我们尝试创建一个Docker容器用于编译我们的解决方案 为此 我们安装了VS17与安装人员 我们找不到哪个成分我们应该选择得到edi
  • 在Python中读取JSON格式的字符串

    我在 python 中有一个简单的 Websockets 服务器 它从 Android 应用程序客户端接收消息 我尝试以 JSON 格式从客户端生成消息负载 但我觉得 仅当它在字符串中时才起作用 我发现的一种解决方案是保留消息字符串 但采用
  • PHP中检查变量是否为数字和正整数?

    例如 说 如何检查变量是否存在 post id是一个数字 并且是一个正整数 即 0 9 不是浮点数 分数或负数 EDIT 无法使用is int cause GET返回一个字符串 认为我需要使用intval or ctype digit 后者
  • Windows 上的 Eclipse 上的 OpenCV

    我正在尝试在 Windows 上安装 opencv 这是我的步骤 从网站下载opencv 2 4 3 运行exe 将文件夹解压到同一路径中 打开eclipse 之前设置并配置了MinGW 创建了新项目 XYZ 添加了新文件夹 src 添加了
  • 在 nlog 中以编程方式创建数据库以启用 DatabaseTarget

    我正在 C 中创建一个 DatabaseTarget 对象 并使用它将数据记录到 NLog 数据库中 如果数据库不存在 nlog 目标将失败 我想检查数据库是否存在 以及是否没有创建它和日志表 我可以看到 targetDB Install