2

解決済み: これは 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())

誰かがこの問題に遭遇しましたか? どうすればこれを修正できますか? アドバイスください、ありがとう!

4

1 に答える 1

1

そこにある行はどういうわけか間違っています。スタック トレースは、次の関数が再帰を実行していることを示しています。

MyProject.Database.GetDateAndTime

仲介なしで自分自身を呼び出しています(デバッグモードで実行していると仮定すると、インライン化によって関数が消えることはありません)。

あなたがそのコードを投稿したら、私は見てみましょう。おそらく、あなたはこれを理解することができます。

于 2013-07-18T21:46:05.000 に答える