0

SQL データベース操作を管理するための次の単純なクラスがあります。

public class DatabaseManager
    {


        private string CommandString
        {
             set { CommandString = GetCommandString(commandtype); }
             get { return CommandString; }
        }
        public string commandtype
        {
            set;
            get;
        }



        public DatabaseManager(string commandtype)
        {
            commandtype = this.commandtype;
            CommandString = GetCommandString(commandtype);
        }

        public DatabaseManager()
        {

        }       


        public static SqlConnection CreateConnection()
        {
            return new SqlConnection(Properties.Settings.Default.connectionString);
        }




        //returns a datatable if the command requires a dataadapter
        public DataTable ExecuteSelect()
        {
            var x = new DataTable();
            using (var da = new SqlDataAdapter(CommandString, DatabaseManager.CreateConnection()))
                {
                    da.Fill(x);
                }

            return x;
        }




        private string GetCommandString(string commandtype)
        {


            switch (commandtype)
            {
                // select commands
                case ("SELECTMARGINS"): CommandString = "select * from margins"; break;
                case ("SELECTRANKS"): CommandString = "select * from ranks"; break;
                /...and other commands

            return CommandString;
        }

    }

Stackoverflow 例外が発生していますget { return CommandString; }

4

4 に答える 4

5

プロパティ自体を返すことはできません (無限ループが作成されます)。

    private string _CommandString;
    public string CommandString
    {
         set { _CommandString = GetCommandString(commandtype); }
         get { return _CommandString; }
    }
于 2013-03-07T18:51:27.200 に答える
5

get関数はあなたの問題です

 get { return CommandString; }

これは、次の士気と同等です

public string GetCommandString() { 
  return GetCommandString();
}

これは無限再帰を作成するだけで、最終的に aStackOverflowExceptionがスローされます。getandを変更しsetて、実際の値を保持するバッキングフィールドを操作し、代わりにそれを使用する必要があります

private string _commandString;
public string CommandString {
  get { return _commandString; }
  set { _commandString = GetCommandString(commandtype); }
}
于 2013-03-07T18:53:21.593 に答える
1

CommandStringこの場合、プライベート変数を作成する必要があります。

private string _commandString;
public string CommandString
{
     set { _commandString = GetCommandString(commandtype); }
     get { return _commandString; }
}

現在のコードで起こっていることは、次のようなことをしていることです。

CommandString = "x";

呼び出す

CommandString = GetCommandString(type);

呼び出す

CommandString = GetCommandString(type);

など....オーバーフローするまでループし続けます。プライベート変数を使用すると、同じプロパティを何度も設定できなくなります

valueまた、セット関数に渡された関数を実際に使用していないように見えますが、これはバグのようです

于 2013-03-07T18:51:22.887 に答える
1

Get 関数がそれ自体を返すようにすることはできません。スタックがオーバーフローするまで、それ自体を無限に取得しようとするだけです。

取得して設定するプライベート変数を作成します。

private string _CommandString;
private string CommandString
{
    //Also you probably want to change commandtype to value, since you will be
    //discarding whatever you attempt to set the variable as
    set { _CommandString = GetCommandString(commandtype); } 
    get { return _CommandString; }
}
于 2013-03-07T18:51:33.540 に答える