Javascript 如何在插入和选择时获取查询结果的编号?
我正在尝试获取使用select和insert查询时受影响的记录数 我已尝试将此用于插入查询:Javascript 如何在插入和选择时获取查询结果的编号?,javascript,sql,node.js,sql-server,Javascript,Sql,Node.js,Sql Server,我正在尝试获取使用select和insert查询时受影响的记录数 我已尝试将此用于插入查询: recordSet.rowsAffected 对于select查询: recordSet.length 但没有一个成功 这是我的代码: router.route('/').post((req, res)=> { var postData = req.body; // get post params // res.json({"message":req.body.firstName}
recordSet.rowsAffected
对于select查询:
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();
});
});
因此,如果select查询返回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)和相应的消息文本组成
变化包括返回输出变量中的值、尝试…捕获错误捕获等。您使用的是什么软件包?我使用的是MSSQL。使用主键、尝试插入、在崩溃已经存在时捕获崩溃并执行其他操作(更新?什么都不做?@CaiusJard这是个坏主意。它假定这三个字段上有一个唯一的键(这是不保证的),最终可能捕获其他错误并将其报告为重复键/“买方已存在”错误。@LaughingVergil-erm。。什么?此代码用于确定是否存在帐户;我的观点是,数据库应该是决定帐户是否已经存在的最终权威,而不是“在潜在的多用户系统中进行选择,然后在几毫秒后进行插入”。正确地做,定义一个好的唯一约束这当然是DBA对很多事情的回答——“使用存储过程”。。我不明白的是,为什么你要倡导重新发明一个“不允许重复记录”的轮子,而数据库已经在使用固有功能方面做得很好了。好吧,有几个可能的原因,其中最主要的原因涉及事务。考虑“必须对隐式或显式事务中的数据修改语句设置XActhApple语句,以防大多数OLE DB提供程序,包括SQLServer。”这意味着,如果需要在事务中执行代码(例如,在表中连贯地更新多个值)。然后,尝试用TRY…CATCH来添加买家记录以处理重复项意味着整个交易将回滚,这可能不是您希望发生的事情。而且,即使现在可以,将来也可能不会。不需要更改存储过程,但需要更改带有TRY…CATCH的代码块。此外,如果出于任何目的需要返回现有ID(而不需要查找该值)的附加功能通常会大大补偿查找的额外开销。最后,对于TRY…CATCH方法,必须对涉及的字段有一个唯一的约束,该约束可能既不存在也不需要。