0

odbc ドライバーを介して SQL サーバーに接続する次の接続文字列を考えてみましょう。

"Driver={SQL Server Native Client 10.0};Server=xxx.xx.xx.xx,xxxx;Database=mydata;Uid=xx;Pwd=xxxxxx;"

データベースの種類: SQL サーバー

ドライバー:SQL Server-ODBC ネイティブ クライアント 10.0

プロバイダーの種類: System.Data.Odbc

odbc接続を介して50個のコマンドを実行しています...

その 50 のうち、最初の 25 が接続文字列 1 で、残りの 25 が接続文字列 2 です。

それによって

これらのコマンドを実行しているときに、約35個のコマンドが実行された後、次のようなエラーが発生しました

ERROR [HY000] [Microsoft][SQL Server Native Client 10.0]Unspecified error occurred on SQL Server. Connection may have been terminated by the server. 

その後に実行された残りのすべてのクエリと

スタックトレース:

  at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
   at System.Data.Odbc.OdbcCommand.ExecuteNonQuery()
   at testprovision.CommonDAL.ExecuteNonQuery(String connectionString, CommandType cmdType, String cmdText, OdbcParameter[] commandParameters) in 

私が使用した 非クエリループコードを実行する

public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params OdbcParameter[] commandParameters)
{
    int val = 0;
    OdbcCommand cmd = new OdbcCommand();
    try
    {
       using (OdbcConnection conn = new OdbcConnection(connectionString))
       {
           CommonCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
           val = cmd.ExecuteNonQuery();
           cmd.Parameters.Clear();
           conn.Close();
        }
    }
    catch (Exception ex)
    {
    }
    finally
    {
        cmd.Dispose();
    }
    return val;
}

問題を解決するために今私がしなければならないこと

あなたの応答を待っています..

4

1 に答える 1

1

CommonCommand で conn を開いていますか?
私の考えでは、それは悪い習慣です。
1 か所で開閉します。
今 if ExecuteNonQuery(); 失敗すると Catch になり、conn は閉じられません。

このパターンを試す

OdbcConnection conn = new OdbcConnection(connectionString);
try
{
   conn.Open();
   using (OdbcCommand cmd = conn.CreateCommand)
   {
       // do NOT have CommonCommand open the connection.  
       // change CommonCommand to not even pass the connection
       CommonCommand(cmd, null, cmdType, cmdText, commandParameters);
       val = cmd.ExecuteNonQuery();
       // cmd.Parameters.Clear();   
       // don't need to clear or dipose it will do so when it falls out of scope     
   }
}
catch (Exception ex)
{
}
finally
{
    conn.Close();
}  
于 2013-02-13T12:19:13.040 に答える