【问题标题】:Settings.Designer file and StaticnessSettings.Designer 文件和静态
【发布时间】:2010-10-29 00:50:30
【问题描述】:

我有一个 DAL 类库,它作为 DLL 包含在我的程序中。下面的行是从 DAL 初始化连接。

DataSet ds = new DataSet("table");
        SqlConnection cnn = new SqlConnection(Settings.CMOSQLConn);

当我运行它时,我得到以下错误:

An unhandled exception of type 'System.StackOverflowException' occurred in CMO.DAL.dll

以下位于 Settings.Designer.cs 文件中,它在 get 调用中显示错误:

        [global::System.Configuration.ApplicationScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
    [global::System.Configuration.DefaultSettingValueAttribute("Data Source=WWCSTAGE;Initial Catalog=CMO;Persist Security Info=True;User ID=CMOWe" +
        "bService;Password=ecivreSbeWOMC")]
    public static string CMOSQLConn {
        get {
            return (CMOSQLConn);
        }
    }

有人知道要寻找什么吗?是因为连接字符串存储在dll而不是我的主应用程序中吗?我真的坚持这一点,将不胜感激任何帮助!

编辑 1

我在下面尝试了 Greg 的 建议:

        public static string CMOSQLConn {
        get {
            return (Settings.CMOSQLConn);
        }
    }

我仍然遇到同样的错误...还有什么想法吗?到目前为止谢谢!

编辑 2

所以我按照下面的建议重新生成设置文件,现在我的设置文件看起来像这样-->

public string CMOSQLConn {
        get {
            return ((string)(this["CMOSQLConn"]));
        }
    }

不幸的是,这不会像我有这个语句的地方那样编译 -->

            SqlConnection cnn = new SqlConnection(Settings.CMOSQLConn);

我现在得到这个错误 -->

Error   1   An object reference is required for the non-static field, method, or property 'CMO.DAL.Properties.Settings.CMOSQLConn.get'  B:\MyDocs\tmpPATRIOT\Projects\VS2008\DisConnectDAL\CMO.DAL\SupportWorker.cs 13  51  CMO.DAL

这是我应该期待的吗?

谢谢!

【问题讨论】:

  • (别难过,我敢打赌,除了 Jon Skeet 本人以外的所有人都至少犯过一两次这个错误。:))
  • CMOSQLConn 是如何成为静态属性的?当我在设置文件中生成连接字符串时,它仍然成为实例属性。
  • 我不知道,这让我快疯了!!!我手动删除了静态,库的其余部分现在正在寻找一个实例......这不是我的原始代码。这是我转换为 C# 类库的 VB 中的 Web 服务。在我的 WinForm 应用程序中使用...感谢您的宝贵时间!
  • (我对转换器怀恨在心。我的经理使用了一个,认为它很容易,将这些东西插入我们的主分支。接下来的几个月,我断断续续地修复了各种问题奇怪的问题。)
  • 为什么不是 Greg D?手动重新生成它应该可以工作 - 属性 > Settings.settings > 右键菜单 > 运行自定义工具 > 验证静态属性是否消失

标签: c# winforms settings data-access-layer


【解决方案1】:

尝试将您的代码更改为:

 public static string CMOSQLConn {
        get {
            return ((string)(this["CMOSQLConn"]));
        }
    }

嗯.. cmets 中的好点。我只是查看了我的 VS 设置文件,然后不假思索地复制和粘贴。您的设置文件有问题...它不应该为设置创建静态属性。

【讨论】:

  • 你能从静态属性中访问它吗?
  • 它说“关键字'this'在静态属性、静态方法或静态字段初始化程序中无效”想法?谢谢你的时间!
【解决方案2】:

这是一个典型的 c# 属性错误。仔细检查您归还的财产 - 您归还财产本身!名称解析将优先选择本地名称而不是外部名称。当CMOSQLConn.get 调用CMOSQLConn.get 时,您遇到了无限递归,导致堆栈溢出。

考虑返回Settings.CMOSQLConn。额外的规范应该清楚地指出你的连接字符串的正确位置。

编辑:

哎呀!我没有注意到您是从设置设计器文件中粘贴的。无限递归显然正在发生,但恐怕您必须进行更多调查才能找出在这种情况下发生这种情况的原因。

您的设计器文件似乎生成不正确 (!!!)。在 VS2008 上,我的设置设计器吸气剂看起来像:

public bool Foo{
    get {
        return ((bool)(this["Foo"]));
    }
    // ...
}

您可能需要做类似的事情。即:

public string CMOSQLConn
    get {
        return ((string)(this["CMOSQLConn"]));
    }
    // ...
}

【讨论】:

  • 关于如何做到这一点的任何提示?调用堆栈似乎并不太有用,因为它显示了我已经发布的内容!
猜你喜欢
  • 2019-08-18
  • 2014-10-13
  • 2017-05-15
  • 2013-01-15
  • 2014-07-30
  • 2016-03-12
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多