切换模式
查询SqlServer数据库
安装 mssql 包
要在 Node.js 中使用 mssql 库,首先需要安装 mssql 包。
bash
npm install mssql
npm install mssql
创建连接池
在 Node.js 中,可以使用 mssql 库创建一个连接池,以便在应用程序中重用数据库连接。
pool.js
javascript
const sql = require('mssql');
const config = {
user: 'yourUsername',
password: 'yourPassword',
server: 'yourServer', // 可以是服务器地址或实例名称
database: 'yourDatabase',
options: {
encrypt: false, // 启用 SSL 连接 生产环境 建议设置为 true
trustServerCertificate: true, // 生产环境 建议设置为 false
pool: {
max: 10, // 池中最大连接数
min: 0, // 池中最小空闲连接数
idleTimeoutMillis: 30000 // 连接在被回收前可空闲的时间(毫秒)
}
}
};
// 创建连接池
const poolPromise = new sql.ConnectionPool(config);
poolPromise.connect().catch(err => {
console.error("创建连接池失败", err);
});
// 把poolPromise暴露出去
module.exports = poolPromise;
const sql = require('mssql');
const config = {
user: 'yourUsername',
password: 'yourPassword',
server: 'yourServer', // 可以是服务器地址或实例名称
database: 'yourDatabase',
options: {
encrypt: false, // 启用 SSL 连接 生产环境 建议设置为 true
trustServerCertificate: true, // 生产环境 建议设置为 false
pool: {
max: 10, // 池中最大连接数
min: 0, // 池中最小空闲连接数
idleTimeoutMillis: 30000 // 连接在被回收前可空闲的时间(毫秒)
}
}
};
// 创建连接池
const poolPromise = new sql.ConnectionPool(config);
poolPromise.connect().catch(err => {
console.error("创建连接池失败", err);
});
// 把poolPromise暴露出去
module.exports = poolPromise;
封装通用查询方法
utils/dataAccess.js
js
const poolPromise = require('../pools.js');
/**
* 执行通用数据库查询并返回结果
* @param {string} sqlStatement - SQL 查询语句
* @returns {Promise<Object>} - 包含查询结果的 Promise 对象
*/
const executeQuery = async (sqlStatement) => {
const pool = await poolPromise;
const request = pool.request();
try {
const result = await request.query(sqlStatement);
return result.recordset;
} catch (error) {
throw error; // 抛出错误以便调用者处理
} finally {
// 在 mssql 库中,通常不需要手动调用 request.close() 来关闭请求,因为 mssql 的连接池会自动管理连接的生命周期。一旦请求完成,无论是成功还是失败,连接都会自动返回到连接池中,准备被其他请求重用
}
};
module.exports = { executeQuery };
const poolPromise = require('../pools.js');
/**
* 执行通用数据库查询并返回结果
* @param {string} sqlStatement - SQL 查询语句
* @returns {Promise<Object>} - 包含查询结果的 Promise 对象
*/
const executeQuery = async (sqlStatement) => {
const pool = await poolPromise;
const request = pool.request();
try {
const result = await request.query(sqlStatement);
return result.recordset;
} catch (error) {
throw error; // 抛出错误以便调用者处理
} finally {
// 在 mssql 库中,通常不需要手动调用 request.close() 来关闭请求,因为 mssql 的连接池会自动管理连接的生命周期。一旦请求完成,无论是成功还是失败,连接都会自动返回到连接池中,准备被其他请求重用
}
};
module.exports = { executeQuery };
使用通用查询方法
js
const { executeQuery } = require('../utils/dataAccess');
exports.getUserList = async (req, res, next) => {
const sqlStatement = `select * from sys_user`;
try {
const data = await executeQuery(sqlStatement);
res.json({
status: 200,
message: '查询成功',
data: data
});
} catch (error) {
next(error);
}
};
const { executeQuery } = require('../utils/dataAccess');
exports.getUserList = async (req, res, next) => {
const sqlStatement = `select * from sys_user`;
try {
const data = await executeQuery(sqlStatement);
res.json({
status: 200,
message: '查询成功',
data: data
});
} catch (error) {
next(error);
}
};
封装分页查询方法
js
/**
* 执行通用分页数据库查询并返回结果
* @param {string} sqlStatement - SQL 查询语句
* @param {number} qpageSize - 每页数量
* @param {number} qpageNo - 当前页码
* @param {string} qsortName - 排序字段名
* @returns {Promise<Object>} - 包含分页结果的 Promise 对象
*/
const executePagedQuery = async (sqlStatement, qpageSize, qpageNo, qsortName) => {
const pool = await poolPromise;
const pageSize = parseInt(qpageSize) || 10;
const pageNo = parseInt(qpageNo) || 1;
const sortName = qsortName || 'create_time';
if(!sqlStatement) throw new Error(`SQL语句不能为空`)
// 计算总记录数的查询
const countSql = `SELECT COUNT(*) AS total FROM (${sqlStatement}) AS tmp`;
const offset = (pageNo - 1) * pageSize;
// 准备参数化查询
const pageSql = `SELECT * FROM (${sqlStatement}) AS pagedResult
ORDER BY ${sortName} OFFSET ${offset} ROWS
FETCH NEXT ${pageSize} ROWS ONLY`;
try {
// 获取总记录数
const countResult = await pool.request().query(countSql);
const totalRows = countResult.recordset[0].total;
// 计算总页数
const totalPages = Math.ceil(totalRows / pageSize);
// 设置参数
const request = pool.request();
// 执行分页查询
const pageResult = await request.query(pageSql);
const pageData = pageResult.recordset;
return {
data: pageData,
totalRows,
totalPages,
pageNo,
pageSize
};
} catch (error) {
throw error; // 抛出错误以便调用者处理
} finally {
}
};
/**
* 执行通用分页数据库查询并返回结果
* @param {string} sqlStatement - SQL 查询语句
* @param {number} qpageSize - 每页数量
* @param {number} qpageNo - 当前页码
* @param {string} qsortName - 排序字段名
* @returns {Promise<Object>} - 包含分页结果的 Promise 对象
*/
const executePagedQuery = async (sqlStatement, qpageSize, qpageNo, qsortName) => {
const pool = await poolPromise;
const pageSize = parseInt(qpageSize) || 10;
const pageNo = parseInt(qpageNo) || 1;
const sortName = qsortName || 'create_time';
if(!sqlStatement) throw new Error(`SQL语句不能为空`)
// 计算总记录数的查询
const countSql = `SELECT COUNT(*) AS total FROM (${sqlStatement}) AS tmp`;
const offset = (pageNo - 1) * pageSize;
// 准备参数化查询
const pageSql = `SELECT * FROM (${sqlStatement}) AS pagedResult
ORDER BY ${sortName} OFFSET ${offset} ROWS
FETCH NEXT ${pageSize} ROWS ONLY`;
try {
// 获取总记录数
const countResult = await pool.request().query(countSql);
const totalRows = countResult.recordset[0].total;
// 计算总页数
const totalPages = Math.ceil(totalRows / pageSize);
// 设置参数
const request = pool.request();
// 执行分页查询
const pageResult = await request.query(pageSql);
const pageData = pageResult.recordset;
return {
data: pageData,
totalRows,
totalPages,
pageNo,
pageSize
};
} catch (error) {
throw error; // 抛出错误以便调用者处理
} finally {
}
};
使用分页查询
js
const { executePagedQuery } = require('../utils/dataAccess');
exports.getUserList = async (req, res, next) => {
const sqlStatement = `select * from sys_user`;
const { pageSize, pageNo} = req.body;
try {
const data = await executePagedQuery(sqlStatement, pageSize, pageNo, 'user_id');
res.json({
status: 200,
message: '查询成功',
data: data
});
} catch (error) {
next(error);
}
};
const { executePagedQuery } = require('../utils/dataAccess');
exports.getUserList = async (req, res, next) => {
const sqlStatement = `select * from sys_user`;
const { pageSize, pageNo} = req.body;
try {
const data = await executePagedQuery(sqlStatement, pageSize, pageNo, 'user_id');
res.json({
status: 200,
message: '查询成功',
data: data
});
} catch (error) {
next(error);
}
};