白木耳 2023-05-23 16:29 采纳率: 76.5%
浏览 12
已结题

Node.js tedious

第一次执行不会出错,但再执行会出现
ConnectionError: .connect can not be called on a Connection in Final state.
问题出在connection.connect();要怎么修改


/* filename: dbseConfig.js */
var config = {  
    server: '192.168.5.111',
    authentication: {
        type: 'default',
        options: {
            userName: 'sa',
            password: 'p@ssw0rd'
        }
    },
    options: {
        // If you are on Microsoft Azure, you need encryption:
        encrypt: false,
        database: 'TEST',
        port:1433,
        trustServerCertificate: true        
    }
}     ;

module.exports = config;
var Request = require('tedious').Request;

const executeSQL = (connection,strgSql,strgOpt) => 
    new Promise((resolve, reject) => {
       
        var result =[];    
     
        connection.on('connect', err => {
            if (err) {
                console.log(err);
                reject(err);
            }
            else{

        const request = new Request(strgSql, (err,rowCount) => {
            if (err) {
                reject(err);
            } else {
                console.log("rowCount:",rowCount);
                if ((result == "" || result == null || result == "null")) result = "[]";  
               
                resolve(result);
            }


     request.on('row', columns => { 
            if (strgOpt=="array"){
                var arry=[]
                columns.forEach(column => {
                    arry.push(column.value);
                });
                result.push(arry);
                //console.log(result);  
            }
            if (strgOpt=="object"){
                var objt={}
                columns.forEach(column => {
                    objt[column.metadata.colName]=column.value;
                });
                result.push(objt);
                //console.log(result);  
            }        
        });
            console.log("connection.close");   
            connection.close();    
        });    
                connection.execSql(request);
            }
        });  

connection.connect();

    }


    );

module.exports ={executeSQL};

  • 写回答

1条回答 默认 最新

  • 27-1994 2023-05-23 17:48
    关注

    在每次执行完 SQL 后,需要显示地关闭连接。这样,下一次执行 SQL 的时候,就可以重新创建连接和连接池。

    以下是一个示例代码:

    const Connection = require('tedious').Connection;
    const Request = require('tedious').Request;
    
    // 根据需要配置连接信息
    const config = {
      server: 'your-server-name',
      authentication: {
        type: 'default',
        options: {
          userName: 'your-username',
          password: 'your-password',
        },
      },
      options: {
        database: 'your-database-name',
        encrypt: true,
      },
    };
    
    const executeSql = (sql, callback) => {
      const connection = new Connection(config);
    
      connection.on('connect', (err) => {
        if (err) {
          callback(err);
          return;
        }
    
        const request = new Request(sql, (err, rowCount) => {
          connection.close(); // 执行完 SQL 后,关闭连接
          if (err) {
            callback(err);
            return;
          }
          
          callback(null, rowCount);
        });
    
        connection.execSql(request);
      });
    
      connection.on('error', (err) => {
        connection.close(); // 在连接错误的时候,也关闭连接
        callback(err);
      });
    };
    
    // 示例:执行 SQL
    executeSql('SELECT * FROM your-table', (err, rowCount) => {
      if (err) {
        console.log('Error:', err);
      } else {
        console.log('Row count:', rowCount);
      }
    });
    

    在上述代码中,我们在每次执行 SQL 后,使用 connection.close() 显示地关闭连接。这样,在下一次执行 SQL 之前,就可以重新创建连接和连接池。

    需要注意的是,在连接错误的时候,也需要关闭连接,在 connection.on('error') 回调中处理错误和关闭连接。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 创建了问题 5月23日