c# - SQL Server 2012 升级 : StackOverflowException with ExecuteReader()

标签 c# sql-server ado.net sql-server-2012 stack-overflow

已解决:这不是 SQL Server 的问题,而是一个不断调用自身的递归函数。/手掌

我目前正在运行 SQL Server 2005 并使用下面的代码。它所做的只是从 SQL Server 获取日期和时间,并且可以正常工作。

protected internal static string GetDateAndTime()
{
string strDate = null;
string strSQL = null;
// connect to the database and execute our SQL command
strSQL = "SELECT GETDATE() AS THEDATE";
using (SqlConnection sqlConn = new SqlConnection(Constants.CONNECTION_STRING))
{
       using (SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn))
       {
              sqlConn.Open();
              using (SqlDataReader sqlReader = sqlCmd.ExecuteReader())
              {
                     if (sqlReader.HasRows)
                         {
                         while (sqlReader.Read())
                         {
                                // assign query returned row values
                                strDate = sqlReader["THEDATE"].ToString();
                         }
                     }
              }
        }
}
}

升级到 SQL Server 2012,现在它出错了。 (惊喜!)代码在此行停止运行。

using (SqlDataReader sqlReader = sqlCmd.ExecuteReader())

错误是:

-StackOverflowException was unhandled
-An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll
-Make sure you do not have an infinite loop or infinite recursion.

请注意,除了将连接字符串指向新的 SQL Server 2012 数据库外,我没有更改任何代码。

请求的信息,堆栈跟踪:

[External Code] 
     MyProject.exe!MyProject.Database.GetDateAndTime() Line 173 C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.Database.GetDateAndTime() Line 189 + 0x8a bytes C#
MyProject.exe!MyProject.frmSwitchboard.VerifyUserExists() Line 230 + 0x9 bytes  C#
MyProject.exe!MyProject.frmSwitchboard.MyProjectPreLoad() Line 136 + 0xd bytes  C#
MyProject.exe!MyProject.frmSwitchboard.frmSwitchboard_Load(object sender = {MyProject.frmSwitchboard}, System.EventArgs e = {System.EventArgs}) Line 68 C#
[External Code] 
MyProject.exe!MyProject.Program.Main() Line 18  C#
[External Code] 

请求的信息,Constants.CONNECTION_STRING: *尝试同时使用...

1. protected internal static string DATABASE_CONNECTION_STRING = @"Data Source=DBSTEST;Initial Catalog=restored 02-04-2013;User ID=sa; UID=sa;PWD=blah;Persist Security Info=True";
2. protected internal static string DATABASE_CONNECTION_STRING = @"Data Source=DBSTEST;Initial Catalog=restored 02-04-2013;User ID=sa;UID=sa;PWD=blah;Connect Timeout=300";

请求的信息,函数 VerifyUserExists():

private DataTable VerifyUserExists()
{
        string strSQL = null;
        DataTable dt = null;
            strSQL = "SELECT DISTINCT [Employees].EmployeeID FROM [Employees] WHERE [Employees].Logon = 'User1'";
            dt = new DataTable();
            dt = Database.RunQueryAndReturnAsDataTable(strSQL);
}

请求的信息,RunQueryAndReturnAsDataTable():

protected internal static DataTable RunQueryAndReturnAsDataTable(string strSQL)
    {
        DataTable dt = null;
            // put our query into a datatable and return it
            using (SqlConnection sqlConn = new SqlConnection(Constants.DATABASE_CONNECTION_STRING))
            {
                using (SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn))
                {
                    sqlConn.Open();
                    using (SqlDataReader sqlReader = sqlCmd.ExecuteReader())
                    {
                        if (sqlReader.HasRows)
                        {
                            dt = new DataTable();
                            dt.Load(sqlReader, LoadOption.OverwriteChanges);
                        }
                    }
                }
            }
    }

当我玩弄代码时,代码也停止在同一行运行,产生相同的错误。

using (SqlDataReader sqlReader = sqlCmd.ExecuteReader())

有人遇到过这个问题吗?我怎样才能解决这个问题?请指教,谢谢!

最佳答案

你得到的线路不知何故是错误的。堆栈跟踪显示以下函数正在执行递归:

MyProject.Database.GetDateAndTime

它在没有中介的情况下调用自己(假设你在 Debug模式下运行,没有函数会因为内联而消失)。

如果您发布其代码,我会看一看。也许,您现在可以弄清楚这一点。

关于c# - SQL Server 2012 升级 : StackOverflowException with ExecuteReader(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17733626/

相关文章:

c# - 使用 C# 的 Windows 服务和性能信息

c# - SQL Server中如何查询XML列中的数据

c# - MySQL ADO.Net 嵌套数据读取器

c# - 返回的数据类型因表中的数据而异

c# - DataTable 问题列的 ADO.Net DataType

c# - WPF C# DataGrid 绑定(bind)不同类型的列表

c# - 如何在 WPF 应用程序中捆绑 View、ViewModel 和 DataTemplate 以便于重用?

sql-server - 如何查找sql​​ server ro14中的死锁原因?

sql-server - sequelize 十六进制列值自动转换为缓冲区

c# - FK 约束可能会导致循环或多个级联路径