当前位置: 首页 > 面试题库 >

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

谢宸
2023-03-14
问题内容

我正在尝试通过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结尾,并且合并处理特殊情况,即表为空并给出初始值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();
            }


 类似资料:
  • 我尝试使用 DB2 存储过程更改表。以下是我的代码。我在更改查询中发现了问题。但是同样的查询在 DB2 命令行编辑器中完美地执行了。我想使用存储过程运行相同的查询。请帮帮我。 错误:在“NTITY(以 69 开头)”之后发现意外的标记“语句结尾”。预期的令牌可能包括:“)”...SQLCODE=-104,SQL 状态=42601,驱动程序=3.58.81

  • 问题内容: 我使用的是与开源Parse Server集成在一起的PostgreSQL 9.5 X64。我的表具有以下结构。 由于使用了Parse Server,因此是主键。它由Parse Server自动生成。该不是主键。我想在创建新记录时自动增加1。如何在创建表中实现? 问题答案: 您可以尝试制作专栏文章。我不知道是否可以更改当前列以使其为串行,因此我们可能必须删除该列,然后将其添加回去,如下所

  • MySQL 存储过程是一些 SQL 语句的集合,比如有时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL 语句的过程中需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程。 编写存储过程并不是件简单的事情,但是使用存储过程可以简化操作,且减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此应该尽可能的学会使用存储过程。 下面主要介绍如何创建存储过程。 可以使用

  • 问题内容: 在MySQL中,是否可以在自动递增前面附加一个字母。我的数据库中有几个表,其中一些表具有通过自动增量创建的唯一ID。我希望能够通过前面的字母来区分自动生成的数字。 这不是绝对必需的功能,但只会帮助简化小型任务。 问题答案: 不幸的是你不能那样做。至少不是在sql中。自动增量字段是整数类型,因此在其中添加字母会违反约束。 我希望这可以引导您朝正确的方向发展。

  • 问题内容: 我正在使用SQL 2000数据库。 我正在使用无法更改表或存储过程的类型的数据库。我需要调用的存储过程之一期望使用’text’参数。我可以进入文本字段,但是我无法弄清楚是谁将其存储在变量中或以其他任何方式将其传递到存储过程中? 如果尝试创建文本变量,SQL不会允许我-如果将其转换为varchar,则只能从文本字段中获取第一个字符。 任何花招来解决这个非常感谢!谢谢! 问题答案: 声明类

  • 问题内容: 我正在使用一个存储过程,在其中发送数据库中其类型为的存储过程,并且还声明parameter 。 当我将列名传递为float时,它给出了错误: 消息8114,将数据类型nvarchar转换为float时出错。 这是我的测试查询 当我将参数类型更改为时,它给了我这个错误: 消息8117,操作数数据类型varchar对avg运算符无效。 我该如何解决? 更新 : 这是我的存储过程: 问题答案