我有一个Windows窗体应用程序,其中包含一些字段,包括“公司”字段和“联系人”字段。当您在公司字段中键入项目并单击按钮时,它会向SQL数据库进行查询,以在“联系人”字段中填写该公司的联系信息。我在“公司”字段中包含了非常基本的自动填充功能,主要是为了方便起见。
问题是当我加载表单时,只要在“公司”字段中输入任何内容,程序就会崩溃。键击时没有其他调用,我将其缩小为自动完成导致问题。
管理它的代码如下:
public void GetRowCount()
{
try
{
_DbRows = db.CountRows();
tContact.Text = _DbRows.ToString();
}
catch (Exception tEx)
{
MessageBox.Show("Exception in GetRowCount. Exception: " + tEx.Message);
}
}
private void GetCustomerList()
{
String customerQuery = "SELECT DISTINCT Name FROM Customers";
try
{
_CustomerList = db.ReturnCustomers(customerQuery, _DbRows);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void PopulateAutofillList()
{
try
{
tCompany.AutoCompleteSource = AutoCompleteSource.CustomSource;
tCompany.AutoCompleteCustomSource.AddRange(_CustomerList);
MessageBox.Show(_CustomerList.Length.ToString());
tCompany.AutoCompleteMode = AutoCompleteMode.Append;
}
catch (Exception tEx)
{
MessageBox.Show("Exception On Autocomplete. Exception: " + tEx.Message);
}
}
这些都是在OnLoad方法中单独调用的,如下所示:
private void Form1_Load(object sender, EventArgs e)
{
try
{
GetRowCount();
GetCustomerList();
PopulateAutofillList();
}
catch (Exception ex)
{
MessageBox.Show("Initial Connection to the Database Failed.");
}
}
数据库查询自己:
public String[] ReturnCustomers(string sqlQuery, int size)
{
createConnectionString();
StreamWriter file = new StreamWriter("dbCustomerList");
int i = 0;
String[] results = new String[size];
SqlConnection myConnection = new SqlConnection(_ConnectionString);
{
myConnection.Open();
SqlCommand cmd = new SqlCommand(sqlQuery, myConnection);
{
SqlDataReader reader;
reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
results[i] = reader.GetString(0);
//file.WriteLine(i ": " + results[i]);
i++;
}
return results;
}
}
}
public int CountRows()
{
createConnectionString();
int rows;
SqlConnection myConnection = new SqlConnection(_ConnectionString);
{
myConnection.Open();
SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Customers;", myConnection);
rows = Convert.ToInt32(cmd.ExecuteScalar());
Console.Write("Row Count: " + rows);
}
return rows;
}
我不完全确定破碎了什么。我沿途出现的所有小支票都表明事情是正确的。为了测试,我把所有这些都运行在SQLite上,它很好。当我把它移到SQL时它就崩溃了。
-
编辑:
Windows Small Business Server 2011提供的完整例外:
问题签名: 问题事件名称:APPCRASH
应用程序名称:SSLP.exe
应用版本:1.0.0.0
申请时间戳:5213d1b8
故障模块名称:shell32.dll
故障模块版本:6.1.7600.17038
故障模块时间戳:4fd2d370
例外代码:c0000005
异常偏移:000ac2c5
操作系统版本:6.1.7600.2.0.0.305.9
区域设置ID:1033
附加信息1:a7aa
其他资料2:a7aa91f17ea749d42a4de3b390fa5b3d
附加信息3:a7aa
其他资料4:a7aa91f17ea749d42a4de3b390fa5b3d
答案 0 :(得分:2)
这段代码不仅有点时髦。最大的问题是没有使用动态列表。然后你不需要两个DB调用。您不需要计数等。您还应该使用using
来表示这些对象。像这样:
public String[] ReturnCustomers(string sqlQuery, int size)
{
createConnectionString();
StreamWriter file = new StreamWriter("dbCustomerList");
List<string> results = new List<string>();
using (SqlConnection myConnection = new SqlConnection(_ConnectionString))
{
myConnection.Open();
using(SqlCommand cmd = new SqlCommand(sqlQuery, myConnection))
{
using(SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
results.Add(reader.GetString(0));
}
}
}
myConnection.Close();
}
return results.ToArray();
}
答案 1 :(得分:2)
我遇到了类似的问题 - 从数据库中获取数字列表以用作自动完成源。特别是,我使用Linq to SQL并返回一个不同的列表。
该不同列表中的一个值为null,这导致我的程序在使用自动完成源在文本框中输入值时崩溃。但是,无法找到捕捉任何异常的方法,所以调试它有点麻烦。
只需添加&#34;其中number!= null&#34;我的Linq to SQL查询为我解决了这个问题。
答案 2 :(得分:0)
好吧,所以这是最愚蠢的事情:
绝望之下,我浏览了整个数据库,寻找可以将其抛弃的内容。数据库中有一个重复的条目,当总行数(由CountRows返回)与不同的行数匹配时,我猜它已经破了。
真的很蠢,但在删除重复的条目后,它确实有效。