如何使用Node.js的mssql模块直接向SQL Server插入对象?
当然有!mssql模块虽然语法和mysql模块不一样,但同样支持安全、便捷的对象式插入,核心是用参数化查询来实现,既避免了SQL注入,又不用手动拼接繁琐的SQL语句。下面给你两种常用的实现方式:
方式一:明确指定列名的插入(推荐,更清晰)
这种方式适合你提前知道表结构的场景,代码可读性更高:
const sql = require('mssql'); // 数据库配置 const dbConfig = { user: 'your_username', password: 'your_password', server: 'cccc.net', // 你的SQL Server地址 database: 'your_database_name', options: { encrypt: true // 如果是Azure SQL或者需要加密连接的话开启,根据实际情况调整 } }; // 封装插入函数 async function insertMessage(messageData) { try { // 建立数据库连接 await sql.connect(dbConfig); // 创建请求对象 const request = new sql.Request(); // 把对象的每个属性绑定为SQL参数 request.input('srcUserID', messageData.srcUserID); request.input('destUserID', messageData.destUserID); request.input('messageContent', messageData.messageContent); request.input('messageSendDate', messageData.messageSendDate); // 执行插入语句,用@前缀引用参数 const result = await request.query(` INSERT INTO messages (srcUserID, destUserID, messageContent, messageSendDate) VALUES (@srcUserID, @destUserID, @messageContent, @messageSendDate) `); console.log(`插入成功,共影响 ${result.rowsAffected[0]} 行`); } catch (err) { console.error('插入操作失败:', err); } finally { // 无论成功失败,都关闭连接 await sql.close(); } } // 准备要插入的对象 const post = { srcUserID: userSrcID, destUserID: msg.userid, messageContent: msg.txt, messageSendDate: sendDate }; // 调用插入函数 insertMessage(post);
方式二:动态生成SQL(适合通用插入场景)
如果你需要一个可以复用在不同表的通用插入函数,可以动态提取对象的键作为列名,自动绑定参数:
async function insertIntoTable(tableName, dataObj) { try { await sql.connect(dbConfig); const request = new sql.Request(); // 提取对象的键作为列名,生成参数占位符 const columns = Object.keys(dataObj).join(', '); const paramPlaceholders = Object.keys(dataObj).map(key => `@${key}`).join(', '); // 批量绑定参数 Object.entries(dataObj).forEach(([key, value]) => { request.input(key, value); }); // 执行动态生成的插入语句 const result = await request.query(` INSERT INTO ${tableName} (${columns}) VALUES (${paramPlaceholders}) `); console.log(`插入到${tableName}成功,影响行数:${result.rowsAffected[0]}`); } catch (err) { console.error('通用插入失败:', err); } finally { await sql.close(); } } // 使用通用函数插入messages表 insertIntoTable('messages', post);
注意事项
- 确保你的对象的键名和数据库表的列名完全一致,否则会出现列不存在的错误。
- 如果涉及特殊数据类型(比如日期、二进制、自定义类型),可以在
request.input里显式指定类型,比如request.input('messageSendDate', sql.DateTime, sendDate),mssql提供了sql.Int、sql.VarChar等多种内置类型。 - 这两种方式都是参数化查询,和mysql的
SET ?一样,能有效防止SQL注入,安全性拉满。
内容的提问来源于stack exchange,提问作者Nick Div
相关产品推荐
相关产品推荐

