Sql server 未使用TypeScript和mssql NodeJS包执行准备好的语句

Sql server 未使用TypeScript和mssql NodeJS包执行准备好的语句,sql-server,node.js,typescript,Sql Server,Node.js,Typescript,我正在使用TypeScript和mssql(v4)NodeJS包将我的应用程序连接到SQL Server数据库。 我面临的是,似乎没有调用为sql.ConnectionPool定义的代码,我无法找出原因。 基本上,我想使用一个准备好的语句执行一个INSERT操作。 以下是我的CRUD.ts文件代码: var sql = require('mssql'); var config = { server: 'localhost', database: 'MyDB', user:

我正在使用TypeScript和mssql(v4)NodeJS包将我的应用程序连接到SQL Server数据库。 我面临的是,似乎没有调用为sql.ConnectionPool定义的代码,我无法找出原因。 基本上,我想使用一个准备好的语句执行一个INSERT操作。 以下是我的CRUD.ts文件代码:

var sql = require('mssql');
var config = {
    server: 'localhost',
    database: 'MyDB',
    user: 'MyUser',
    password: '*******',
    port: '1433'
};

export async function newItem(someValue1: string, someValue2: string) {
    try {
        const db = new sql.ConnectionPool(config, err => {
            console.info("Checking for errors...");
            if (err) {
                console.error("Connection failed: " + err);
            } else {
                console.info("Connected")
                const insertStatement = 'INSERT INTO [dbo].[MyData]([SomeValue1],[SomeValue2])VALUES(@SomeValue1, @SomeValue2)';
                const ps = new sql.PreparedStatement(db);
                ps.input('SomeValue1', sql.String)
                ps.input('SomeValue2', sql.String)
                ps.prepare(insertStatement, err => {
                    if (err) {
                        console.error(err);
                    } else {
                        ps.execute({
                            SomeValue1: someValue1,
                            SomeValue2: someValue2
                        }, (err, result) => {
                            if (err) {
                                console.error(err);
                            } else {
                                ps.unprepare(err => {
                                    if (err) {
                                        console.error(err);
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });     
    }catch (e) {
        console.error(e);
    }

}
我尝试了以下几个文档示例,但没有成功

任何形式的帮助都将不胜感激


提前感谢。

我从未使用过这个特定的库,但我认为重写代码以使用
async/await
会有很大帮助,特别是您已经将函数本身标记为async。如果这样做,那么对
wait newItem(…)
的调用将等待所有处理完成,而不是在触发任何回调之前立即返回

我认为您的代码可能是这样的(但未经测试,因此可能会有一些错误):

注意,我在池中添加了对
.connect()
的调用,因为文档似乎暗示这是必需的。当您使用
await
时,任何错误都应作为
Promise
拒绝返回,
await
将其转化为异常。这意味着,您不需要检查每个调用是否有错误代码,而只需要一个
try…catch
(实际上,这里有两个用于保存用于连接错误的不同消息)


我还重新抛出了错误,以向调用方表明代码失败。如果您只是想让错误冒泡到调用方,那么您也可以完全删除错误处理:当错误变成承诺拒绝或异常时,它们会向上传播。

我从未使用过这个特定的库,但我认为将代码重写为使用
async/wait
会有很大帮助,特别是您已经将函数本身标记为异步。如果这样做,那么对
wait newItem(…)
的调用将等待所有处理完成,而不是在触发任何回调之前立即返回

我认为您的代码可能是这样的(但未经测试,因此可能会有一些错误):

注意,我在池中添加了对
.connect()
的调用,因为文档似乎暗示这是必需的。当您使用
await
时,任何错误都应作为
Promise
拒绝返回,
await
将其转化为异常。这意味着,您不需要检查每个调用是否有错误代码,而只需要一个
try…catch
(实际上,这里有两个用于保存用于连接错误的不同消息)


我还重新抛出了错误,以向调用方表明代码失败。如果您只是想让错误冒泡到调用方,那么您也可以完全删除错误处理:当错误变成拒绝承诺或异常时,它们会向上传播。

您使用的是
async
函数,因此您确实应该重写代码,使用
wait
而不是回调。e、 g.
result=await ps.prepare(insertStatement)
这样就可以避免许多级别的嵌套回调。您使用的是
async
函数,因此您确实应该重写代码以使用
await
而不是回调。e、 g.
result=wait ps.prepare(insertStatement)
这样你就可以避免很多级别的嵌套回调。谢谢你的回答,邓肯!我按照你的建议实施了它,然后我面临另一个问题。但我能解决它。我有另一个异步函数调用前面提到的函数:return await new Promise(函数(resolve,reject){DBOperations.newItem(someValue1,someValue2);}),我刚刚添加了async和await关键字,如下所示:return await new Promise(异步函数(resolve,reject){await DBOperations.newItem(someValue1,someValue2);}@danielcode7异步函数已经返回了一个
承诺
,因此删除
新承诺
,直接返回调用:
返回DBOperations.newItem(someValue1,someValue2);
您甚至不必等待结果,因为您只需返回承诺。感谢您强调这一点,但我使用的是
new Promise
,因为调用函数(另一个异步函数)将使用
resolve()返回另一个不同的承诺
method。谢谢你的回答,Duncan!我按照你的建议实现了它,然后我遇到了另一个问题。但是我能够解决它。我有另一个异步函数调用前面提到的函数:return wait new Promise(function(resolve,reject){DBOperations.newItem(someValue1,someValue2);})我刚刚添加了async和await关键字,如下所示:return await new Promise(异步函数(resolve,reject){await DBOperations.newItem(someValue1,someValue2);})@danielcode7异步函数已经返回了一个
承诺
,因此删除
新承诺
,直接返回调用:
返回DBOperations.newItem(someValue1,someValue2);
您甚至不必等待结果,因为您只需返回承诺。感谢您强调这一点,但我使用的是
new Promise
,因为调用函数(另一个异步函数)将使用
resolve()
方法返回另一个不同的承诺。
var sql = require('mssql');
var config = {
    server: 'localhost',
    database: 'MyDB',
    user: 'MyUser',
    password: '*******',
    port: '1433'
};

export async function newItem(someValue1: string, someValue2: string) {
    let db;
    try {
      db = await new sql.ConnectionPool(config).connect();
    }
    catch(err) {
      console.error("Connection failed: " + err);
      throw(err);
    }
    try {     
      console.info("Connected")
      const insertStatement = 'INSERT INTO [dbo].[MyData]([SomeValue1],[SomeValue2])VALUES(@SomeValue1, @SomeValue2)';
      const ps = new sql.PreparedStatement(db);
      ps.input('SomeValue1', sql.String)
      ps.input('SomeValue2', sql.String)
      await ps.prepare(insertStatement);
      await ps.execute({
            SomeValue1: someValue1,
            SomeValue2: someValue2
        });
      await ps.unprepare();
    } catch (e) {
        console.error(e);
        throw(e);
    }
}