SQL存储过程不返回任何值

时间:2011-06-09 22:04:16

标签: c# .net sql sql-server stored-procedures

我必须关注sproc:

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中执行sproc时,它会显示正确的返回值。

以下是代码:

            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为空。

4 个答案:

答案 0 :(得分:4)

你没有返回一个标量,你从一张桌子中选择,这是不同的。您需要RETURN语句。另一种方法是使用OUTPUT参数。您可以将C#中的参数设置为输出参数,并在运行该过程后,可以从中读取该值。

答案 1 :(得分:2)

else是多余的,第一个select语句也是如此。我认为executecalar使用的是第一个结果集而不是第二个结果集,因此不是@@ identity。

首先使用此查询

SELECT customer.customerID FROM customer WHERE email = @email;

并摆脱其他。然后使用其他答案建议的返回值方法。

答案 2 :(得分:2)

尝试一下:

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

答案 3 :(得分:0)

格兰特,

使用@@ ROWCOUNT不是确保客户尚未输入的正确方法。它只会告诉您检查时客户不在表中。

正确的方法是在电子邮件列上应用唯一约束。然后尝试插入客户行。如果行插入则输入客户。如果您获得了唯一的违规,那么客户已经存在,您可以选择/返回customerID。

一旦尼克斯已经说过那就行了。