首页 > 解决方案 > 插入数据库数组缓冲区

问题描述

请告诉我,如何正确地从 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 函数运行此查询。

标签: sqlnode.jssql-serversql-server-2012

解决方案


您应该使用该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]}}]

推荐阅读