0

我正在尝试通过 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

4 回答 4

4

理想情况下,您只需通过更改表定义使 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,并且合并处理表为空的特殊情况并给出初始值 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); //这应该会自动增加。字符串值 = 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();
            }
于 2012-05-16T08:12:11.710 回答
1

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

然后,您可以从过程、过程中的插入语句和 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();
                }
于 2012-05-16T08:10:26.133 回答
1

语句 WHERE @TagID = @TagID 将始终为真,因为您比较相同的值。我认为您正在寻找这个(假设 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
于 2012-05-16T08:10:36.820 回答
0

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

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

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

于 2012-05-16T08:11:24.273 回答