自动填充会导致崩溃

时间:2013-08-21 14:49:26

标签: c# .net sql winforms autocomplete

我有一个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

3 个答案:

答案 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返回)与不同的行数匹配时,我猜它已经破了。

真的很蠢,但在删除重复的条目后,它确实有效。