创建存储过程以添加自动增量作为其主要字段?

时间:2012-05-16 08:04:11

标签: c# sql sql-server sql-server-2008 stored-procedures

我试图通过C#将数据插入我的Sql-Server数据库。我正在调用存储过程,然后希望它添加。我不确定要做什么更改,但最终我希望它在存储过程中完成。

我现在的存储程序:

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @TagID int, 
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
IF NOT EXISTS (SELECT NULL FROM Tag
                WHERE @TagID = @TagID)
BEGIN
    INSERT INTO 
        Tag 
        (TagID,Value,TagCount) 
        VALUES 
        (@TagID,@Value,@TagCount)
END

我的C#代码:

int TagID = int.Parse(txtTagID.Text); //This should fall away so auto increment.
            String Value = txtValue.Text;
            int TagCount = int.Parse(txtCount.Text); 

            using (var conn = new SqlConnection(Properties.Settings.Default.DBConnectionString))
            using (var cmd = conn.CreateCommand())
            {
                    conn.Open();
                    cmd.CommandText = "InsertTagProcdure";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@TagID", TagID);
                    cmd.Parameters.AddWithValue("@Value", Value);
                    cmd.Parameters.AddWithValue("@TagCount", TagCount);
                    cmd.ExecuteNonQuery();
                }

表格创建我使用://不能改变这是老板给我的。

CREATE TABLE [dbo].[Tag](
    [TagID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [varchar](200) NOT NULL,
    [TagCount] [varchar](200) NULL,
 CONSTRAINT [PK_Tag] PRIMARY KEY CLUSTERED 
(
    [TagID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

4 个答案:

答案 0 :(得分:3)

理想情况下,您只需通过更改表定义使TagID成为标识字段。如果你不能那样做,那么最好的是:

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
BEGIN
    BEGIN TRANSACTION
        DECLARE @TagID int;
        SELECT @TagID = coalesce((select max(TagID) + 1 from Tag), 1)
    COMMIT      
    INSERT INTO 
        Tag 
        (TagID,Value,TagCount) 
        VALUES 
        (@TagID,@Value,@TagCount)
END

事务确保您不会以唯一的TagID结束,并且coalesce处理表为空的特殊情况,并给出初始值1。

修改

根据对原始问题的更改,该表已有一个标识列,因此您的存储过程应为:

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
BEGIN
    INSERT INTO Tag (Value,TagCount) VALUES (@Value,@TagCount)
END

并且您的C#代码应为

int TagID = int.Parse(txtTagID.Text); //这应该会消失,所以自动递增。             String Value = txtValue.Text;             int TagCount = int.Parse(txtCount.Text);

        using (var conn = new SqlConnection(Properties.Settings.Default.DBConnectionString))
        using (var cmd = conn.CreateCommand())
        {
                conn.Open();
                cmd.CommandText = "InsertTagProcdure";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Value", Value);
                cmd.Parameters.AddWithValue("@TagCount", TagCount);
                cmd.ExecuteNonQuery();
            }

答案 1 :(得分:1)

您想要设置标记表,以便它使用标识属性。见这里:http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx

然后你可以从过程,过程中的insert语句和c#代码中删除TagId。

然后变成这样:

CREATE PROCEDURE [dbo].[InsertTagProcdure]
       @Value nvarchar(200), 
       @TagCount nvarchar(200) 
AS
BEGIN
    INSERT INTO 
        Tag 
        (Value,TagCount) 
        VALUES 
        (@Value,@TagCount)
END

C#代码:

            String Value = txtValue.Text;
            int TagCount = int.Parse(txtCount.Text); 

            using (var conn = new SqlConnection(Properties.Settings.Default.DBConnectionString))
            using (var cmd = conn.CreateCommand())
            {
                    conn.Open();
                    cmd.CommandText = "InsertTagProcdure";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Value", Value);
                    cmd.Parameters.AddWithValue("@TagCount", TagCount);
                    cmd.ExecuteNonQuery();
                }

答案 2 :(得分:1)

语句WHERE @TagID = @TagID将始终为true,因为您比较相同的值。 我你正在寻找这个(假设TagID是你的AUTO-ID字段);

CREATE PROCEDURE [dbo].[InsertTagProcdure] 
       @TagID int,  
       @Value nvarchar(200),  
       @TagCount nvarchar(200)  
AS 
BEGIN
IF NOT EXISTS (SELECT TagID FROM Tag WHERE TagID = @TagID) 
BEGIN 
    INSERT INTO  
        Tag  
        (Value,TagCount)  
        VALUES  
        (@Value,@TagCount) 
  SET @TagID = @@IDENTITY
END 
ELSE
BEGIN
  UPDATE Tag
    SET Value=@Value,
    TagCount=@TagCount
  WHERE TagID = @TagID
END
RETURN @TagID
END

答案 3 :(得分:0)

您必须启用“身份识别规范”'在SQL Server上的相应列上。转到表格设计模式,选择列,在底部属性屏幕中,有一个名为“身份规范”的属性。

在此之后,您可以省略存储过程中的TagId。 Sql Server将自动为新记录分配一个id。

如果你想知道新插入的id是什么(我假设你是下一个问题),你可以在你的存储过程中使用函数SCOPE_IDENTITY(),它返回新插入记录的id。