我试图为此找到解决方案,但无法解决。这就是问题所在:
我正在加载一堆用户的数据并为每个用户创建一个对象。每个用户对象都有许多对象属性。这是结构:
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
如何解决此错误?或者我可能应该用更好的方法来做到这一点?
答案 0 :(得分:0)
评论有点太长了
ALL
数据吗?最好只抓住你需要的列和行。DataTables
复制到Dictionaries
?使用DataTable
?JOIN
时表现更佳。DataTable
,DataAdapter
等。)答案 1 :(得分:0)
using (SqlConnection SqlCon = new SqlConnection(ConnectionString)) {
您的连接字符串变量是否真的命名为ConnectionString?您是否有可能与该类型发生冲突?由于它未在显示的代码中声明,我假设它是一个类变量,因此您应该遵守传统的命名约定,即_connectionString
。您的连接字符串是什么样的?
答案 2 :(得分:0)
好的伙计们,我想通了。这完全是因为整个演示应用程序的架构错误。有些对象有一个或多个其他对象作为属性,并且由于架构中存在一些愚蠢的错误; &#34; fetch&#34;作为从数据库获取数据的基础的操作被递归调用导致StackOverflow异常,实际上是大量的数据库连接被初始化,最终将堆大小增加到导致异常的程度。
我试图总结上面写的段落中的所有内容,因为考虑到大量的代码,发布完整的源代码是没用的。
感谢所有帮助过的人,特别是@Guffa对主帖的评论,这些评论迫使我从头开始调查整个问题,而不是坚持异常堆栈。