0

让我们考虑以下通过 odbc 驱动程序连接 sql server 的连接字符串为

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

数据库类型:Sql server

驱动:sql server-ODBC原生客户端10.0

提供者类型:System.Data.Odbc

我正在通过 odbc 连接执行 50 个命令...

在连接字符串 1 中的 50 前 25 和连接字符串 2 中的其余 25 中。

那里有

当我执行这些命令时,大约执行了 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 ?
在我看来,这是一种不好的做法。
在一个地方打开和关闭。
现在如果 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 回答