创建存储过程与自动增量添加作为它的主要领域? [英] Create stored procedure to add with auto increment as its primary field?

查看:250
本文介绍了创建存储过程与自动增量添加作为它的主要领域?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将数据插入我的SQL Server数据库中,虽然C#。我调用存储过程,然后希望它补充。我不知道什么样的变化作出,但最终我想它在存储过程中完成的。



我的存储过程现在:

  CREATE PROCEDURE [DBO]。 [InsertTagProcdure] 
@TagID INT,
@Value为nvarchar(200),
@TagCount为nvarchar(200)
AS
如果NOT EXISTS(SELECT NULL FROM标签
,其中@TagID = @TagID)
BEGIN
INSERT INTO
标签
(标签识别,价值,TagCount)

(@TagID, @价值@ TagCount)

和我的C#代码:

  INT标签识别= int.Parse(txtTagID.Text); //这应该跌倒所以自动递增。 
字符串值= txtValue.Text;
INT TagCount = int.Parse(txtCount.Text);

使用(VAR康恩=新的SqlConnection(Properties.Settings.Default.DBConnectionString))使用
(VAR CMD = conn.CreateCommand())
{
康恩。打开();
cmd.CommandText =InsertTagProcdure;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(@标签识别标签识别);
cmd.Parameters.AddWithValue(@值,值);
cmd.Parameters.AddWithValue(@ TagCount,TagCount);
cmd.ExecuteNonQuery();
}



表创建我用://不能改变其本什么老板给我的。

  CREATE TABLE [DBO]。[标签](
[标签识别] [INT] IDENTITY(1, 1)NOT NULL,
[超值] [VARCHAR(200)NOT NULL,
[TagCount] [VARCHAR(200)NULL,
约束[PK_Tag] PRIMARY KEY CLUSTERED

[标签识别] ASC
)和(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]
)ON [PRIMARY]


解决方案

在理想情况下,你只想让标签识别的标识字段通过改变表定义。如果你不能做到这一点,下一个最好的将是:



  CREATE PROCEDURE [DBO] [InsertTagProcdure] 
。 @Value为nvarchar(200),
@TagCount为nvarchar(200)
AS
BEGIN
BEGIN TRANSACTION
DECLARE @TagID INT;
选择@TagID = COALESCE((选择MAX(标签识别)+ 1,从标签),1)
COMMIT
INSERT INTO
标签
(标签识别,价值,TagCount )

(@标签识别,@价值@ TagCount)

本次交易将确保你不唯一TagIDs结束和聚结处理所在的表是空的,并给出了1的初始值的特殊情况。



编辑:



根据对改变你原来的问题,该表已经有标识列使您的存储过程应该是:

  CREATE PROCEDURE [DBO]。[InsertTagProcdure] 
@Value为nvarchar(200),
@TagCount为nvarchar (200)
AS
BEGIN
INSERT INTO标签(Value,TagCount)VALUES(@值,@ TagCount)

和C#代码应



INT标签识别= int.Parse(txtTagID.Text); //这应该跌倒所以自动递增。
字符串值= txtValue.Text;
INT TagCount = int.Parse(txtCount.Text);

 使用(VAR康恩=新的SqlConnection(Properties.Settings.Default.DBConnectionString))使用(VAR CMD 
= conn.CreateCommand())
{
conn.Open();
cmd.CommandText =InsertTagProcdure;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(@值,值);
cmd.Parameters.AddWithValue(@ TagCount,TagCount);
cmd.ExecuteNonQuery();
}


I am trying to insert Data into my Sql-Server database though C#. I'm Calling a stored procedure and then would like it to add. I'm not sure what changes to make, but ultimately i would like it done in the stored procedure.

My Stored procedure now:

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

And my C# Code:

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();
                }

The Table Create i used: //Cant change this its what the boss gave me.

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]

解决方案

Ideally you would just make TagID an identity field by changing the table definition. If you can't do that, next best would be:

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

The transaction ensures that you don't end up with unique TagIDs and the coalesce handles the special case where the table is empty and gives an initial value of 1.

EDIT:

Based on the change to your original question, the table already has an identity column so your stored procedure should be:

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

and your C# code should be

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("@Value", Value);
                cmd.Parameters.AddWithValue("@TagCount", TagCount);
                cmd.ExecuteNonQuery();
            }

这篇关于创建存储过程与自动增量添加作为它的主要领域?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆