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