SqlConnection.Open()返回StackOverflow异常

时间:2015-10-22 21:02:27

标签: c# sql sql-server sqlconnection

我试图为此找到解决方案,但无法解决。这就是问题所在:

我正在加载一堆用户的数据并为每个用户创建一个对象。每个用户对象都有许多对象属性。这是结构:

public class City {
    public int ID { get; set; }
    public string Name { get; set; }
    public string Keyword { get; set; }
}

城市课程:

public class Office {
    public int ID { get; set; }
    public string Address { get; set; }
    public int CityID { get; set; }
}

Office类:

//Code to load users
Dictionary<int, User> Users = new Dictionary<int, Users>();
DataTable usersData = new DataTable();

//The Fetch function has two version. The first one; which is mentioned in this post, returns the result as Dictionary<string, object>(). 
//The second version of the function returns the result in the form of the a DataTable and is only used when multiple rows are required from the database. The following returns a set of rows in a DataTable.

Globals.MainDatabase.Fetch("SELECT * FROM users", out usersData);

foreach (DataRow row in usersData.Rows) {
    User user = new User();
    user.ID = Convert.ToInt32(row["id"]);
    user.Name = row["name"].ToString();
    user.City = Cities.Get(Convert.ToInt32(row["city_id"]));
    user.Office = Offices.Get(Convert.ToInt32(row["office_id"]));
    Users.Add(user.ID, user);
}

用户对象有许多其他类似的属性,如City&amp;办公室基本上是类对象。

现在这是主要问题。每当我尝试将所有用户加载到字典集合中时,在SqlCon.Open()处发生StackOverflow异常(参见&#34; Fetch&#34;函数I&#39;我在下面写的)。以下是我如何加载所有内容:

public void Fetch(string query, out Dictionary<string, object> results) {
        var dict = new Dictionary<string, object>();
        try {
            using (SqlConnection SqlCon = new SqlConnection(ConnectionString)) {
                using (SqlCmd = new SqlCommand()) {
                    SqlCmd.Connection = SqlCon;
                    SqlCmd.CommandType = CommandType.Text;
                    SqlCmd.CommandText = query;

                    SqlCon.Open();

                    DataTable temp = new DataTable();
                    using (SqlDataAdapter SqlAdp = new SqlDataAdapter(SqlCmd)) {
                        SqlAdp.SelectCommand = SqlCmd;
                        SqlAdp.Fill(temp);
                    }

                    DataRow row = temp.Rows[0];
                    temp = null;
                    dict = row.Table.Columns
                           .Cast<DataColumn>()
                           .ToDictionary(col => col.ColumnName, col => row.Field<object>(col.ColumnName));
                }
            }
        }
        catch (Exception ex) {
            HandleException(ex, "An error occurred when tried to fetch data.", query);
        }

        results = dict;
        dict = null;
    }

方法&#34; Cities.Get(Int32 id)&#34;和&#34; Offices.Get(Int32 id)&#34;使用以下函数从数据库中获取数据。

SqlCon.Open();

我意识到这个&#34; Fetch&#34;在创建用户对象时多次调用函数。 &#34; StackOverflow&#34;异常发生在这一行:

---
- name: Setup webservers
  hosts: all
  connection: local
  tasks:
    - name: copy test
      sudo: yes
      copy: src=/etc/ansible/app/test  dest=/

    - name: install Apache
      sudo: yes
      yum: name=httpd state=present

如何解决此错误?或者我可能应该用更好的方法来做到这一点?

3 个答案:

答案 0 :(得分:0)

评论有点太长了

  • 您真的需要从数据库加载ALL数据吗?最好只抓住你需要的列和行。
  • 为什么要将DataTables复制到Dictionaries?使用DataTable
  • 有什么问题
  • 99.9%当您在数据库中执行JOIN时表现更佳。
  • 不要尝试推出自己的ORM&#39;。如果您不想要EF或NHibernate的膨胀,请使用类似Dapper的内容。或者,坚持使用ADO(DataTableDataAdapter等。)

答案 1 :(得分:0)

using (SqlConnection SqlCon = new SqlConnection(ConnectionString)) {

您的连接字符串变量是否真的命名为ConnectionString?您是否有可能与该类型发生冲突?由于它未在显示的代码中声明,我假设它是一个类变量,因此您应该遵守传统的命名约定,即_connectionString。您的连接字符串是什么样的?

答案 2 :(得分:0)

好的伙计们,我想通了。这完全是因为整个演示应用程序的架构错误。有些对象有一个或多个其他对象作为属性,并且由于架构中存在一些愚蠢的错误; &#34; fetch&#34;作为从数据库获取数据的基础的操作被递归调用导致StackOverflow异常,实际上是大量的数据库连接被初始化,最终将堆大小增加到导致异常的程度。

我试图总结上面写的段落中的所有内容,因为考虑到大量的代码,发布完整的源代码是没用的。

感谢所有帮助过的人,特别是@Guffa对主帖的评论,这些评论迫使我从头开始调查整个问题,而不是坚持异常堆栈。