User98743 Ответов: 1

Консольное приложение не пишет для отладки.writeline и не заполняющие свойства в моем классе


У меня есть библиотека методов и методов расширения, которые я добавляю в проекты в течение последних 10 месяцев, так как я действительно изучаю C#, написав его. Но на этот раз я добавил его в проект консольного приложения.

Последние два дня я борюсь с исследованием того, почему либо (1) отлаживается.WriteLine не выводит ни одного из моих отчетов об ошибках и отладочного кода на экран вывода, когда все, что я читаю, говорит, что это должно быть или (2) мой код не выполняется в моем внешнем классе, и поэтому Отладочному коду нечего писать.

Не получая ничего от своих часов или от регистрации ошибок на выходном экране, я лечу вслепую.

Я не знаю, отличаются ли консольные приложения от, скажем, windows forms или это одна из новых конструкций, которые я пытаюсь использовать в C#, но я читал и перечитывал разделы о классах в моей книге C# 7 в двух словах и, наверное, был ошеломлен.

Может ли кто-нибудь предложить мне что-нибудь почитать или исследовать?

Я не знаю, какой код опубликовать, потому что я не знаю, что имеет отношение к этому, но вот какой-то код, который определенно не работает так, как ожидалось:

Примечание: Я уверен, что мой код ужасный для большинства из вас! Любые предложения приветствуются.

Это часть класса, который устанавливает мое соединение с базой данных OleDb:
	public class RBDataOleDb
	{

		private string nl = Environment.NewLine;

		public string DbPassword { get; }
		public string DbUser { get; }
		public string DbType { get; }
		public string DbServer { get; }
		public string DbName { get; }
		public string DbDataSource { get; }
		public string DbPath { get; }


		/// <summary>
		/// Connect to SQLServer or Oracle with windows auth
		/// NOTE: Add User and Password via overloaded constructors below
		/// </summary>
		/// <param name="dbserver">Server EX: @"(localdb)\MSSQLLocalDB"</param>
		/// <param name="dbname">Database name</param>
		public RBDataOleDb ( string server , string database)
		{
			DbType = "MDF";
			DbServer = server;
			DbName = database;
			DbDataSource = database;
		}


		/// <summary>
		/// Connect to SQLServer or Oracle with password
		/// NOTE: Add User and Password seperately
		/// </summary>
		/// <param name="dbserver">Server name in @"(localdb)\MSSQLLocalDB" format or null</param>
		/// <param name="dbname">Database name</param>
		public RBDataOleDb ( string server , string database, string username, string password )
		{
			DbType = "MDF";
			DbServer = server;
			DbName = database;
			DbUser = username;
			DbPassword = password;
			DbDataSource = database;
		}


		/// <summary>
		/// Use this for connections to files, such as MS ACCESS, EXCEL, etc.
		/// </summary>
		/// <param name="file_path">Path to Database</param>
		public RBDataOleDb ( string file_path )
		{
			DbType = System.IO.Path.GetExtension ( file_path ).Replace ( "." , "" ).ToUpper ( );
			DbPath = file_path;
			DbDataSource = file_path;
		}


		/// <summary>
		/// Use this for connections to files, such as MS ACCESS, EXCEL, etc.
		/// </summary>
		/// <param name="file_path">Path to Database</param>
		public RBDataOleDb ( string file_path, string username, string password)
		{
			DbType = System.IO.Path.GetExtension( file_path ).Replace(".","").ToUpper ( );
			DbPath = file_path;
			DbUser = username;
			DbPassword = password;
			DbDataSource = file_path;
		}

		public string GetProvider ( )
		{
			string result = "";
			switch ( DbType )
			{
				case "MDF":
					result = "SQLNCLI11";
					break;
				case "MDB":                  
				case "ACCDB":
				case "XLSX":
				case "XLS":
				case "DBF":
					result = "Microsoft.ACE.OLEDB.12.0";
					break;
				default:
					result = "!!UNABLE TO DETERMINE PROVIDER!!";
					throw new ArgumentException ( $"DbType has a value of {DbType}, which is not valid.  RBDataOleDb clould not determine what database provider to use when connecting to database" );				
			}
			return result;
		}

		/// <summary>
		/// NOTE: Provider: "Microsoft.ACE.OLEDB.12.0" is the 2010 Office System Driver, which has both 32 bit and 64 bit versions that let your app connect 
		/// to Access, Excel and Text file in a 64bit environment.
		/// </summary>
		/// <returns></returns>
		public string GetConnString ( )
		{
			string conn = "";


			if ( DbServer != null )
			{
				conn = $"Provider=SQLNCLI11;Data Source={DbServer};Initial Catalog=[{DbName}];";
				if ( !string.IsNullOrEmpty ( DbPassword ) )
					conn += $"User ID={DbUser};Password={DbPassword};";
				else
					conn += $"Integrated Security=SSPI;";             
			}
			else if ( DbType == "MDB" || DbType == "ACCDB" )
			{
				conn = $"Provider=Microsoft.ACE.OLEDB.12.0;data source=[{DbPath}];";
				if ( !string.IsNullOrEmpty ( DbPassword ) ) conn += $"Jet OLEDB:Database Password={DbPassword};";

			}
			else if ( DbType == "MDB" )
			{
				conn = $@"Provider=Microsoft.Jet.OLEDB.4.0;data source=""{DbPath}"";";
				if ( !string.IsNullOrEmpty ( DbPassword ) ) conn += $"User Id={DbUser};Jet OLEDB:Database Password={DbPassword};";
			}
			else if ( DbType == "XLSX" )
			{
				conn = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[{DbPath}];Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'";
			}
			else if ( DbType == "XLS" )
			{		conn = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[{DbPath}];Extended Properties='Excel 8.0;HDR=YES'";                    
			}
			else
			{
				conn = "* * * NO DbType WAS SET SO RBDataOleDb.getConnString() UNABLE TO CREATE CONNECTION STRING * * *";
			}
			return conn;
		}
}


Вот как я создаю экземпляры и возвращаю значения из некоторых его свойств и методов:

RBDataOleDb ole = new RBDataOleDb ( Globals.dbpath );
string provider = ole.GetProvider();
string ds = ole.DbDataSource;
string constring = ole.GetConnString();

Globals.Log ( ds );
Globals.Log ( provider );
Globals.Log ( constring );


Это мои глобалы.Метод журнала, который был отредактирован для записи в консоль.

public static void Log ( string message )
{
    string output = Environment.NewLine + message + Environment.NewLine;
    Console.WriteLine ( output );
}


Что я уже пробовал:

Я переписал некоторые из моих отладочных журналов в своем локальном проекте, чтобы я мог писать в консоль вместо отладки, но я не могу сделать это из классов в моей библиотеке, иначе это повлияет на другие мои проекты, которые его используют.

Что касается получения значений обратно из моего класса, я пробовал использовать методы, различные способы использования геттеров и сеттеров и несколько раз менял модификаторы доступа. То, что вы видите, если результат этих итеративных усилий.

1 Ответов

Рейтинг:
0

David_Wimbley

Я отвечаю на этот вопрос в предположении, что вы хотите отладить.WriteLine для вывода на консоль. Вот как я понял ваш вопрос. Если вам нужно вывести данные в другом месте, кроме консоли, прочтите о Прослушивателях отладки (ссылка ниже).

Цитата:
Последние два дня я борюсь с исследованием того, почему либо (1) отлаживается.WriteLine не выводит ни одного из моих отчетов об ошибках и отладочного кода на экран вывода, когда все, что я читаю, говорит, что это должно быть или (2) мой код не выполняется в моем внешнем классе, и поэтому Отладочному коду нечего писать.


Это вероятные причины для вашей отладки.код writeline не выводит никаких данных.

1) конфигурация вашего решения настроена не на "отладку", а на что-то другое, например на выпуск.
2) Вам нужно установить свою отладку на НЕ перенаправить весь вывод. Сделайте это в visual studio, перейдя в Меню -> Tools -> Options -> всплывающее окно -> прокрутите до Debugging -> General -> найдите "перенаправить весь текст выходного окна в ближайшее окно" и убедитесь, что это не так'
ти проверил. Чтобы было понятно, не проверяется.
3) у вас нет настройки прослушивателя для отладки.метод WriteLine. Смотрите эту ссылку для получения дополнительной информации: Отлаживать.Собственность Слушателей (Системы.Диагностика)[^]

По сути вам просто нужно включить что-то вроде

var dbglistener = new TextWriterTraceListener(Console.Out);
Debug.Listeners.Add(dbglistener);


Для вашего Debug.WriteLine чтобы начать вывод в окно консоли.

Если вам нужно вывести отладочные сообщения на что-то другое, кроме консоли, вы можете вывести эти сообщения на Stream а потом от этого Stream запишите данные в файл.

Также. Консольные приложения сильно отличаются от winforms с точки зрения использования/назначения. Если бы вы продолжали записывать выходные данные на консоль с помощью TextWriterTraceListener класс он, по-видимому, не работает в winforms, так как winforms не использует консольное окно для вывода. Для winforms вам нужно будет либо сделать то, что я уже упоминал, то есть записать вывод в поток, либо заглянуть в систему ведения журнала, такую как nlog или log4net...что-то в этом роде.


[no name]

Я возился с отладкой против Отпустите настройку один раз раньше, но проверил ее, и она настроена на отладку... ИЛИ МНЕ ТАК ПОКАЗАЛОСЬ! Типичный Microsoft, экран конфигурации решения показывает отладку везде и только один контекст проекта, который настроен на отладку, когда я просто нажал на кнопку Configuration Manager, я вижу, что это текущая, активная конфигурация release. Что ж, это прекрасно. Я разорвал на части половину своей программы и все, с чем я не был полностью знаком. Тьфу. Спасибо за вашу помощь. Я немного обескуражен в данный момент, но посмотрю на ваши другие предложения, просто чтобы знать, как устранить этот тип проблемы.