2013-11-20 1 views
3

Я создаю объект DatabaseTarget на C# и использую его для записи данных в базу данных NLog.Создание базы данных программно в nlog для включения с использованием DatabaseTarget

Если база данных не существует, цель nlog завершается с ошибкой. Я хочу проверить, существует ли БД, и если он не создает его и таблицу журналов.

Я вижу, что функция targetDB.Install (installationContext) может выполнять задание, но не может найти никаких примеров. Существует множество примеров с использованием файла конфигурации. Я хочу поместить это в код и не нужно развертывать файл конфигурации во всех приложениях, которые используют DLL, которая будет содержать этот код.

Как я могу проверить и создать базу данных?

ответ

5

Этот код использует метод 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); 
    } 
+1

Awesome, я понятия не имел, SqlConnectionStringBuilder можно было бы использовать в обратном направлении, как это. Я всегда использовал его, как следует из названия. – Jakotheshadows

+0

У меня такая же проблема, но код у меня не работает. Я получаю 'ArgumentNullException', что параметр типа * не должен быть нулевым * из stacktrace, который, как представляется, здесь:' at System.Activator .CreateInstance (Тип типа, Boolean nonPublic) в System.Activator.CreateInstance (Тип типа) в NLog.Targets.DatabaseTarget.OpenConnection (String connectionString) ' Любая идея, почему это так? – Luiso