javascript - 如何获取查询结果的数量以防插入和选择?
问题描述
我正在尝试获取使用选择和插入查询时受影响的记录数
我已经尝试过这个插入查询:
recordSet.rowsAffected
这用于选择查询:
recordSet.length
但他们都没有工作。
这是我的代码:
router.route('/').post((req, res)=> {
var postData = req.body; // get post params
// res.json({"message":req.body.firstName});
connection.connect().then(function(){
var request = new sql.Request(connection);
request.input('email', sql.VarChar(45), postData.email)
.input('password', sql.VarChar(45), postData.password)
.input('category', sql.VarChar(45), postData.category)
.query('select * from Buyer where password = @password and category =
@category and email = @email')
.then((recordSet)=>{
if (recordSet.length == 0) {
request.input('buyerId', sql.VarChar(45), uid.v4())
.input('firstName', sql.VarChar(45), postData.firstName)
.input('lastName', sql.VarChar(45), postData.lastName)
.input('email', sql.VarChar(45), postData.email)
.input('password', sql.VarChar(45), postData.password)
.input('phoneNumber', sql.VarChar(45), postData.phoneNumber)
.input('category', sql.VarChar(45), postData.category)
.query('insert into Buyer(buyer_id, first_name, last_name, email,
password, phone_number, category) values(@buyerId, @firstName, @lastName,
@email, @password, @phoneNumber, @category)')
.then((recordSet)=>{
if(recordSet.rowsAffected == 1){
res.status(buyerCreatedCode).send("Account Created as
Buyer.");
}else{
res.status(buyerNotCreatedCode).send("Account not Created as
Buyer.");
}
connection.close();
}).catch((err)=>{
res.json({"error in adding buyer":err});
connection.close();
});
}else{
res.status(buyerNotCreatedCode).send("This Account already
exists.");
connection.close();
}
}).catch((err)=>{
res.json({"error in checking buyer":err});
connection.close();
});
}).catch((err)=>{
res.json({"error connection":err});
connection.close();
});
});
因此,如果选择查询返回 0 条记录,我希望将买家插入数据库,如果它返回记录,则未插入买家(但无论如何它都会插入)。
我的问题是如何正确获取受影响的行数以便任务正确执行?提前致谢。
解决方案
您应该将代码的大部分功能移动到 SQL 代码中,从中创建一个存储过程,并使用您的值调用它。
例如,您的存储过程可能如下所示:
CREATE PROCEDURE AddBuyer
@email varchar(45), -- too small. up to 100
@password varchar(45),
@category varchar(45),
@firstname varchar(45),
@lastName varchar(45),
@phoneNumber varchar(45) -- Couldn't this be smaller?
AS
BEGIN
DECLARE @buyerId uniqueidentifier
, @error int
-- Recommended - return the message and the ID from this procedure
SELECT @buyerId = BuyerId
FROM Buyer
WHERE email = @email
AND password = @password
AND category = @category
IF @@ROWCOUNT > 0
BEGIN
-- Return the actual existing ID
SELECT @buyerId as BuyerId,
'This Account already exists.' as StatusMsg
END
ELSE
BEGIN
SET @buyerId = NewID() -- Generate UniqueIdentifier
insert into Buyer(
buyer_id,
first_name,
last_name,
email,
password,
phone_number,
category
)
values(
@buyerId,
@firstName,
@lastName,
@email,
@password,
@phoneNumber,
@category
);
SET @error = @@ERROR
IF @error > 0
BEGIN
SELECT CAST(NULL as uniqueidentifier) as BuyerId,
'Account not Created as Buyer. (Status=' + Cast(@error as varchar(10)) + ')' as StatusMsg
END
ELSE
BEGIN
SELECT @buyerId as BuyerId,
'Account Created as Buyer.' As StatusMsg
END
END
END
当您执行此操作时,您将返回一个单行记录集。它由 BuyerId 值(出错时为 NULL)和相应的消息文本组成。
变体包括返回 OUTPUT 变量中的值、TRY...CATCH 错误捕获等。
推荐阅读
- unreal-engine4 - 尝试在启用混沌的情况下打包虚幻引擎 4.23 时出现打包错误
- python - 如何在python中匹配乳胶书目?
- javascript - 如何使用 React Native 在 Firebase 实时数据库中按字段排序
- android - 限制 firebase 数据库以使用 firebase 规则创建新节点
- go - 从 GO 中的父/子对构建树结构
- r - 在R代码中使用样式器将T替换为TRUE,F替换为FALSE
- python - Google Places API 是否可以在用户输入时接受实时文本输入并生成地址/地点(Python)?
- authentication - Identity Server 4 等效于 Identity Server 3 IUserService AuthenticateExternalAsync 和 AuthenticateLocalAsync 方法
- c# - 实体框架不从其他表中删除行
- java - Stream 中是否有办法将 SUM 作为中间操作