【发布时间】:2011-06-09 22:04:15
【问题描述】:
我必须关注 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 中执行存储过程时,它会显示正确的返回值。
代码如下:
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 为空。
【问题讨论】:
-
或者通过电子邮件发送 PK :D 并放弃 identitycol
-
与您的问题无关,但在几乎所有情况下
@@IDENTITY都是错误的,请改用scope_identity()。如果每个触发器都添加到您的表中,@@IDENTITY不会返回您期望的结果。@@IDENTITY:msdn.microsoft.com/en-us/library/ms187342.aspxscope_identity():msdn.microsoft.com/en-us/library/ms190315.aspx
标签: c# .net sql sql-server stored-procedures