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

我试图通过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] 

理想情况下,您只需通过更改表定义使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(); } 

您想要设置标记表,以便它使用标识属性。 请参阅此处: 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(); } 

语句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 

您必须在相应的列上打开SQL Server中的“标识规范”。 转到表设计模式,选择列,在底部属性屏幕中,有一个名为“标识规范”的属性。

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

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