在调试器中断而不是“工作”..代码执行继续

时间:2013-11-22 20:54:51

标签: c# visual-studio-2010 sql-server-2012

我有一个winforms项目,它取决于自定义库。应用程序的一切工作正常,除了我无法确定的问题。基本上我有一个从另一个表单创建的表单,它将其显示为一个对话框:

DataItems.ImportForm frmImportTextDelimited = new DataItems.ImportForm();
frmImportTextDelimited.ShowDialog();

此对话框表单使用以下函数从SqlServer填充下拉列表,该函数来自解决方案中的类库:

public class AuthorityTypeSearcher
{
    public List<IntValuePair> GetAllAuthorityTypes()
    {
        List<IntValuePair> returnList = new List<IntValuePair>();
        using (var conn = new SqlConnection(Globals.ConnString))
        {
            var cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "SELECT FROM tblAuthorityTypes";
            conn.Open();
            IntValuePair ivp;
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                ivp = new IntValuePair();
                ivp.TheInt = Convert.ToInt32(rdr["ID"]);
                ivp.TheValue = rdr["AuthorityType"].ToString() ;
            }
        }
        return returnList;
    }

此函数永远不会返回值,因此我在行上设置了一个断点:

            conn.Open();

当代码执行时,Visual Studio正确地破坏了这一行。让我疯狂的是当我走上前线时:

            SqlDataReader rdr = cmd.ExecuteReader();

调试器不会向前移动到下一行,代码执行似乎返回到UI(显示表单)。同样奇怪的是,如果我与表单交互(即单击表单上的一个按钮填充另一个字段),调试器再次中断,我返回到visual studio,它正确地“断开”到与该操作相关的行。无论出于什么原因,当我到达创建数据读取器的行时,代码执行只是“离开”库并返回到winforms应用程序。

当代码执行似乎已返回到UI时,如果我返回到visual studio,似乎代码执行仍在继续,至少我无法单击“继续”(播放)。代码执行没有“暂停”。

同样奇怪的是,如果我关闭表单(对话框),它会从行中主表单的行中分解回调试器:

frmImportTextDelimited.ShowDialog();
好像我还在调试。

希望这有道理吗?我无法弄清楚为什么,在调试时,我无法超越我创建数据读取器的行,以及为什么代码执行会返回到UI,但返回到调试器并关闭对话框。不会抛出任何错误。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:4)

此行为的解释在于在Form_Load期间引发异常时64位代码的行为。

您的查询语法错误。您没有列列表,这会引发数据库引擎的语法错误。

但是在64位环境中的Form_Load期间引发的异常不能被调试器捕获。

A more detailed answer could be found here

您可以尝试修改查询,添加相应的字段名称(或所有字段的星号*) 还尝试在Visual Studio IDE外部运行代码。你应该在某处看到Exception。

答案 1 :(得分:1)

尝试将您的代码放在try catch块中,并查看内部异常。也不应该是SELECT * FROM tablename?