sql - 插入数据库数组缓冲区
问题描述
请告诉我,如何正确地从 Node.js 代码向数据库发送查询,以便成功插入值?
我需要的请求结构(来自 SQL Server Management Studio):
INSERT INTO [db].[Employee]([ID], [NAME], [TYPE])
VALUES (<ID, MICBINID>, <NAME nvarchar(120)>, <TYPE, MICBINID>)
来自数据库的现有行示例:
0x002554778996547896555558745734852612 Mike Ross 0x00179314626849513971917683426984
NEWID()
我想通过使用命令将新行的 ID 创建转移到基础。
我需要从现有的请求中传递类型的标识符(数组)。
我的 sql 请求:
let TYPE = "CONVERT(VARBINARY(MAX)," + type + ")";
let sql = "INSERT INTO [db].[Employee] (ID, NAME, TYPE) VALUES (NEWID(), '" + NAME + "', '" + TYPE + "')";
但是无论我如何更改类型ID转换的变化,错误总是一样的
不允许从数据类型 varchar 到 varbinary 的隐式转换。使用 CONVERT 函数运行此查询。
解决方案
您应该使用该request.input()
函数来指定输入参数、它们的类型和它们的值。
对于mssql
要提供sql.VarBinary(sql.MAX)
类型为 Buffer 对象的模块,如下所示:
pool.request()
.input("data", sql.VarBinary(sql.MAX), binaryData)
.query("insert dbo.Demo (BinaryData) values (@data)");
一个完整的例子:
const sql = require('mssql');
const config = {
database: "StackOverflow",
options: {
encrypt: false,
enableArithAbort: true
},
password: "YourP4ssw0rdHere",
port: 1433,
server: "YourServerNameOrIpAddress",
user: "YourSqlLogin"
};
const binaryData = Buffer.from([
0x00, 0x25, 0x54, 0x77, 0x89, 0x96, 0x54, 0x78,
0x96, 0x55, 0x55, 0x58, 0x74, 0x57, 0x34, 0x85,
0x26, 0x12
]);
let pool = null;
console.log("Connecting...");
sql.connect(config)
.then((newpool) => pool = newpool)
.then(() => {
console.log("Dropping...");
return pool.request()
.query("drop table if exists dbo.Demo");
})
.then(() => {
console.log("Creating...");
return pool.request()
.query("create table dbo.Demo ( ID int not null identity(1,1), BinaryData varbinary(max) )");
})
.then(() => {
console.log("Inserting...");
return pool.request()
.input("data", sql.VarBinary(sql.MAX), binaryData)
.query("insert dbo.Demo (BinaryData) values (@data)");
})
.then(() => {
console.log("Selecting...");
return pool.request()
.query("select * from dbo.Demo");
})
.then((select) => {
console.dir(select);
console.log(`${JSON.stringify(select.recordset)}`);
})
.then(() => pool.close())
.catch((err) => {
console.error(`ERROR: ${JSON.stringify(err)}`);
pool.close();
});
结果是:
% node stackoverflow.js
Connecting...
Dropping...
Creating...
Inserting...
Selecting...
{
recordsets: [ [ [Object] ] ],
recordset: [ { ID: 1, BinaryData: [Buffer [Uint8Array]] } ],
output: {},
rowsAffected: [ 1 ]
}
[{"ID":1,"BinaryData":{"type":"Buffer","data":[0,37,84,119,137,150,84,120,150,85,85,88,116,87,52,133,38,18]}}]
推荐阅读
- html - HTML 中的“EventTarget”类型上不存在属性“值”
- amazon-web-services - 在 AWS QuickSight 中创建显示当前突出显示的值的动态表名称?
- c++ - 带有 Eigen::Ref 的临时对象是否在复制时被丢弃并且是否支持移动语义?
- powershell - 获取用户所属的特定 AD 组
- json - 将角度 http 客户端获取请求的响应映射到 Typescript 类对象
- neo4j - 使用 Neo4j Admin 从 CSV 导入自定义日期时间格式
- python - Pandas:删除缺少数据的行并在 UDF 中应用二进制编码
- angular - Angular - 如何根据 API 响应中的角色将登录重定向到仪表板
- mysql - MySQL 中的 AVG 查询
- c# - 自定义价格过滤器的正则表达式