Неверный выходной файл при захвате SQL InfoMessage - PullRequest
0 голосов
/ 17 марта 2019

У меня небольшая проблема с моим кодом.

Я пытаюсь перехватить все информационные сообщения при запуске обновлений в базе данных 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)"

...