SQL存储过程未返回任何值
本文关键字:任何值 返回 存储过程 SQL | 更新日期: 2023-09-27 17:59:00
我必须执行以下存储过程:
USE [CW]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[addCustomer]
@firstname VARCHAR(50) = '',
@lastname VARCHAR(50) = '',
@email VARCHAR(50) = '',
@password VARCHAR(50) = ''
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT * FROM customer WHERE email = @email
IF (@@ROWCOUNT = 0)
BEGIN
-- Add to database.
INSERT INTO customer (firstname, lastname, email, [password])
VALUES (@firstname, @lastname, @email, @password);
SELECT @@IDENTITY;
END
ELSE
BEGIN
-- Don't add already registered
SELECT customer.customerID FROM customer WHERE email = @email;
END
END
它是将一个客户添加到一个表中。如果他们的电子邮件已经在表中,它会返回该客户的id。如果电子邮件不在表中,它会创建它并返回新的id。
问题是,当它创建新记录时,它返回null。但是,当我在Management Studio中执行存储过程时,它会显示正确的返回值。
这是代码:
SqlCommand cmd0 = new SqlCommand();
cmd0.Connection = conn;
cmd0.CommandType = CommandType.StoredProcedure;
cmd0.CommandText = "addCustomer";
cmd0.Parameters.AddWithValue("@firstname", firstname);
cmd0.Parameters.AddWithValue("@lastname", lastname);
cmd0.Parameters.AddWithValue("@email", email);
cmd0.Parameters.AddWithValue("@password", password);
var scaled = cmd0.ExecuteScalar();
customerID = scaled.ToString();
当电子邮件是唯一的时,customerID为null。
您不是在返回标量,而是在表中进行选择,这是不同的。您需要RETURN
语句。另一种选择是使用OUTPUT
参数。您可以将C#中的参数设置为输出参数,运行该过程后,您可以从中读取值。
尝试一下:
ALTER PROCEDURE [dbo].[addCustomer]
@firstname VARCHAR(50) = '',
@lastname VARCHAR(50) = '',
@email VARCHAR(50) = '',
@password VARCHAR(50) = ''
AS
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM customer WHERE email = @email)
INSERT INTO customer (firstname, lastname, email, [password])
VALUES (@firstname, @lastname, @email, @password);
SELECT customer.customerID FROM customer WHERE email = @email;
GO
如果其他语句是多余的,则第一个select语句也会这样做。我认为executescalar使用的是第一个结果集,而不是第二个,因此不是@@identity。
首先使用此查询
选择customer.customerID FROM customer WHERE email=@email;
把其他的都扔掉。然后使用另一个答案所建议的返回值方法。
Grant,
使用@ROWCOUNT不是确保客户尚未被输入的正确方法。它只是告诉您,当您检查时,客户不在表中。
正确的方法是对电子邮件列应用唯一的约束。然后尝试插入客户行。如果行插入,则输入客户。如果您得到一个唯一的违规行为,那么该客户已经存在,您可以选择/返回customerID。
一旦成功,就照尼克说的去做。