node.js - 使用node.js将数据从Excel加载到sql server表

标签 node.js sql-server

我正在尝试将 Excel 文件加载到 SQL Server 表,但出现错误。我已经分享了相同的代码和错误。请指出这里有什么问题。

Excel 文件由 4 列 ID、日期、型号和计划组成,我想将其插入到 mssql 表中,但无法执行此操作。

 //CODE
var express = require('express');
var http = require('http');
var oracledb = require('oracledb');
//var dbConfig = require('./dbconfig.js');
var app = express();
var bodyParser = require('body-parser');
var XLSX = require('xlsx');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const Cors = require("cors");
app.use(Cors());


jsonArrayToValueArray = (jsonArray) => {
    let valueArray = new Array();
    for (let index = 0; index < jsonArray.length; index++) {
        let object = jsonArray[index];
        let keys = Object.keys(object);
        valueArray.push([object[keys[0]], object[keys[1]], object[keys[2]], object[keys[3]]]);
        console.log(valueArray) ;  
    }
    return valueArray;
  }

app.get('/', function (req, res) {

    var sql = require("mssql");

    // Configuration object for your database
    var config = {
        user: 'sa',
    password: '******',
    database: '*****',
    server: '*******',
    port: 1433,
    //timezone: 'utc',
    //multipleStatements: true 
    };
    // connect to the database
    sql.connect(config, function (err) {
    var workbook = XLSX.readFile(__dirname + '/uploads/delivery_excel.xlsx');
    var sheet_name_list = workbook.SheetNames;

    var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
     console.log();
    let valueArray = jsonArrayToValueArray(xlData);

        if (err) console.log(err);
        // create Request object
        var request = new sql.Request();


        // query to the database and get the records
        request.query("INSERT INTO dbo.plan_excel Values(' + _Id + ', ' + _Date + ', ' + _Model + ', ' + _Plan + ')", [valueArray], function (err, recordset) {
       // request.query("INSERT INTO dbo.plan_excel Values(@Id, @Date, @Model, @Plan) ", [valueArray], function (err, recordset) {

            if (err) console.log(err)
            // send records as a response
            res.send(recordset);
            sql.close();
       });
    });
});
var server = app.listen(5050, function () {
    console.log('Server is running..');
});

我收到的错误如下,一个 38 行数组(excel 数据),后跟一个错误。请帮助我进行此代码工作所需的更改,以便将数据插入到 SQL Server 中。我正在使用该插入查询并引用其他几个链接,如果这不是正确的方法,请告诉我。

我之前已经实现了相同的流程,但它是针对 Mysql 数据库的,因为我是 sql server 的新手,所以对此不太了解。

  [ 28, 43295, 'V45', 200 ],
  [ 29, 43296, 'V45', 200 ],
  [ 30, 43297, 'V45', 200 ],
  [ 31, 43298, 'V45', 200 ],
  [ 32, 43299, 'V45', 200 ],
  [ 33, 43299, 'V30', 213 ],
  [ 34, 43299, 'V26', 220 ],
  [ 35, 43299, 'V22', 200 ],
  [ 36, 43299, 'V34', 233 ],
  [ 37, 42895, 'v35', 123 ],
  [ 38, 42895, 'V32', 122 ] ]
(node:40820) UnhandledPromiseRejectionWarning: RequestError: Conversion failed when converting the varchar value ' + _Id + ' to data type int.
    at handleError (C:\Users\vishruti.pawar\.vscode\mssql_api\node_modules\mssql\lib\tedious.js:566:15)
    at emitOne (events.js:116:13)
    at Connection.emit (events.js:211:7)
    at Parser.tokenStreamParser.on.token (C:\Users\vishruti.pawar\.vscode\mssql_api\node_modules\tedious\lib\connection.js:716:12)
    at emitOne (events.js:116:13)
    at Parser.emit (events.js:211:7)
    at Parser.parser.on.token (C:\Users\vishruti.pawar\.vscode\mssql_api\node_modules\tedious\lib\token\token-stream-parser.js:27:14)
    at emitOne (events.js:116:13)
    at Parser.emit (events.js:211:7)
    at addChunk (C:\Users\vishruti.pawar\.vscode\mssql_api\node_modules\readable-stream\lib\_stream_readable.js:297:12)
(node:40820) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:40820) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate
the Node.js process with a non-zero exit code.

我已经分享了备用代码,它正在将记录发送到数据库,但是一些随机记录正在发送到那里,您能告诉我可能是什么错误吗?我正在使用 for 循环将这些值添加到表中。

var express = require('express');
var http = require('http');
var oracledb = require('oracledb');
var dbConfig = require('./dbconfig.js');
var app = express();
var bodyParser = require('body-parser');
var XLSX = require('xlsx');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const Cors = require("cors");
app.use(Cors());

jsonArrayToValueArray = (jsonArray) => {
    let valueArrayN = new Array();
    let valueArray = new Array();
    let valueArray1 = new Array();
    let valueArray2 = new Array();
    let valueArray3 = new Array();

    for (let index = 0; index < jsonArray.length; index++) {
        let object = jsonArray[index];
        let keys = Object.keys(object);
        valueArray.push([object[keys[0]]])
        valueArray1.push([object[keys[1]]])
        valueArray2.push( [object[keys[2]]])
        valueArray3.push( [object[keys[3]]])
        //valueArrayN.push([object[keys[0]], object[keys[1]], object[keys[2]], object[keys[3]]]);
        console.log(valueArrayN) ;  
    }
        valueArrayN = [valueArray, valueArray1, valueArray2, valueArray3];
      return valueArrayN;
 }

app.get('/', function (req, res) {
    var sql = require("mssql");
    var config = {
    user: 'sa',
    password: '******',
    database: '*****',
    server: 'localhost',
    port: 1433,
    timezone: 'utc',
    multipleStatements: true 
    };
    // connect to the database
    sql.connect(config, function (err) {
    var workbook = XLSX.readFile(__dirname + '/uploads/delivery_excel.xlsx');
    var sheet_name_list = workbook.SheetNames;

    var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);

     console.log();
    let valueArrayN = jsonArrayToValueArray(xlData);

      var i;
      for(i=0; i < 45; i++)
        {

        if (err) console.log(err);
        // create Request object
        var request = new sql.Request();

        //setTimeout(function(){
        request.input('id', sql.Int, valueArrayN[0][da])
        request.input('Date', sql.Int, valueArrayN[1][da])
        request.input('Model', sql.NChar,valueArrayN[2][da])
        request.query("INSERT INTO dbo.plan_excel Values (@id, @Date, @Model)", function (err, recordset) {
           if (err) console.log(err)
           res.send(recordset);
      });

}  //for loop
});
});
var server = app.listen(5010, function () {
    console.log('Server is running..');
});

对于此代码,我收到以下错误,每次运行时都会插入不同的记录,例如有时 11 条记录有时仅 4 条记录。这可能是什么原因?

[]
[]
[]
_http_outgoing.js:494
    throw new Error('Can\'t set headers after they are sent.');
    ^

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:494:11)
    at ServerResponse.setHeader (_http_outgoing.js:501:3)
    at ServerResponse.header (C:\Users\.vscode\MSSQL\oracle_api_working\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\Users\.vscode\MSSQL\oracle_api_working\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\.vscode\MSSQL\oracle_api_working\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (C:\Users\.vscode\MSSQL\oracle_api_working\node_modules\express\lib\response.js:158:21)
    at C:\Users\.vscode\MSSQL\oracle_api_working\example2.js:95:17
    at _query (C:\Users\.vscode\MSSQL\oracle_api_working\node_modules\mssql\lib\base.js:1347:9)
    at Request.tds.Request.err [as userCallback] (C:\Users\.vscode\MSSQL\oracle_api_working\node_modules\mssql\lib\tedious.js:671:15)
    at Request.callback (C:\Users\.vscode\MSSQL\oracle_api_working\node_modules\tedious\lib\request.js:37:27)
PS C:\Users\.vscode\MSSQL\oracle_api_working>

最佳答案

将您的 request.query 行替换为此。

request.query("INSERT INTO dbo.plan_excel Values ${valueArray.join().split(",").map(x => '(' + x + ')').join()}", function (err, recordset) {

关于node.js - 使用node.js将数据从Excel加载到sql server表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57654679/

相关文章:

javascript - 使用nodejs fs 模块将路径添加到文件名中?

javascript - 我如何确定如何寻址一个对象以便对其进行原型(prototype)设计?

sql-server - SQL Server 中可以递归调用存储过程吗?

SQL Server - 停止或中断 SQL 脚本的执行

.net - 在 SQL 或 .NET 中比较复杂字符串的最佳方法

sql-server - 使用 Azure SQL 的 Azure 自动故障转移组中的问题

node.js - 通过nodejs通过ssh用户名/密码连接mongodb

node.js - 使用 restify (node.js) 提供静态文件

node.js - Bcrypt 错误 : illegal arguments String unidentified

c# - 数据读取器跳过第一个结果