У меня небольшая проблема с моим кодом.
Я пытаюсь перехватить все информационные сообщения при запуске обновлений в базе данных SQL Server.Проблема в том, что у меня неправильный вывод в моем файле.
Я использую resources.resx
, который у меня есть все мои скрипты и запускаю их в соответствии с версией клиента.
Мой код:
try
{
string sqlConnectionString = Parameters.Config.ConnectionString;
for (int i = DbVersion + 1; i <= FileDbVersion; i++)
{
string updateScripts = "script_" + i.ToString("D5");
ResourceManager sqLUpdateScripts = new ResourceManager(typeof(SQLUpdateScripts));
string myString = sqLUpdateScripts.GetString(updateScripts);
//string resVal = SQLUpdateScripts.ResourceManager.GetString(updateScripts, Thread.CurrentThread.CurrentCulture);
var sqlqueries = myString.Split(new[] { "\nGO", "\ngo" }, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(updateScripts);
SqlConnection conn = new SqlConnection(sqlConnectionString);
SqlCommand cmd = new SqlCommand("query", conn);
Server server = new Server(new ServerConnection(conn));
conn.Open();
var progressBar = 10;
var line = 0;
foreach (var query in sqlqueries)
{
progressBar += 10;
line +=1;
Console.WriteLine(query);
cmd.CommandText = query;
cmd.ExecuteNonQuery();
conn.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)
{
FileStream ostrm;
StreamWriter writer;
TextWriter oldout = Console.Out;
string _dbUpdateLogPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\DBUpdate" + DateTime.Now.ToString("ddMMyy") + ".txt";
try
{
if (!File.Exists(_dbUpdateLogPath))
{
ostrm = new FileStream(_dbUpdateLogPath, FileMode.OpenOrCreate, FileAccess.Write);
writer = new StreamWriter(ostrm);
Console.SetOut(writer);
Console.WriteLine(DateTime.Now + " - "+line+" - " + e.Message);
Console.SetOut(oldout);
writer.Close();
ostrm.Close();
}
else if (File.Exists(_dbUpdateLogPath))
{
ostrm = new FileStream(_dbUpdateLogPath, FileMode.Append, FileAccess.Write);
writer = new StreamWriter(ostrm);
Console.SetOut(writer);
Console.WriteLine(DateTime.Now + " - " + line + " - " + e.Message);
Console.SetOut(oldout);
writer.Close();
ostrm.Close();
}
}
catch (Exception ex)
{
NLogger.NLogger.LibraryLogClass.Error(ex.ToString());
return;
}
};
}
//server.ConnectionContext.ExecuteNonQuery(script);
conn.Close();
}
}
catch (Exception ex)
{
NLogger.NLogger.LibraryLogClass.Error(ex.ToString());
return;
}
Результат, который я ожидаю, равен
17/3/2019 12:42:07 μμ - 6 - Dropping foreign keys from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:10 μμ - 12 - Altering [dbo].[Diasafisi]
17/3/2019 12:42:12 μμ - 16 - Altering [dbo].[DeltioApostolis]
.
.
.
17/3/2019 12:42:31 μμ - 81 - The database update succeeded
Но вместо этого в моем файле
17/3/2019 12:42:07 μμ - 6 - Dropping foreign keys from [dbo].[NomismataUpdate]
17/3/2019 12:42:07 μμ - 6 - Dropping foreign keys from [dbo].[NomismataUpdate]
17/3/2019 12:42:07 μμ - 6 - Dropping foreign keys from [dbo].[NomismataUpdate]
17/3/2019 12:42:07 μμ - 6 - Dropping foreign keys from [dbo].[NomismataUpdate]
17/3/2019 12:42:07 μμ - 6 - Dropping foreign keys from [dbo].[NomismataUpdate]
17/3/2019 12:42:07 μμ - 6 - Dropping foreign keys from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
17/3/2019 12:42:08 μμ - 9 - Dropping constraints from [dbo].[NomismataUpdate]
и так далее.
Кажется, что он идет внутри файла и печатает одну и ту же строку столько раз, сколько он прошел через "foreach (var query in sqlqueries)"