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