2012-05-16 48 views
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] 
+1

如果你打開自動增量在SQL Server的主鍵,你將不再需要通過標籤識別,它會自動遞增並分配給你。 – ThePower

回答

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 

該交易可確保您不具有獨特TagIDs結束和聚結處理這樣的表是空的特殊情況,並給出了一個初始值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(); 
      } 
+0

我得到這個異常:當IDENTITY_INSERT設置爲OFF時,無法在表'Tag'中爲標識列插入顯式值。 – Pomster

+1

@Pomster - 我的答案是一個/或選項。如果您已將列設置爲身份標識,那麼問題就解決了 - 只需刪除處理TagID的原始存儲過程的位。我在這裏給出的SP是爲了防止你無法更改表格模式。 HTH – Dave

+0

我不允許更改數據庫設置的任何東西,所以我tyred你的代碼,並得到該錯誤。我不確定你告訴我要做什麼? – Pomster

1

您想要設置標記表以便它使用標識屬性。見這裏:http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx

然後你可以從程序中刪除TagId,在程序中插入語句和c#代碼。

然後它變成像這樣:

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

語句的WHERE @TagID = @TagID將永遠是正確的,因爲你比較相同的值。 I 認爲你在找這個(假設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 [email protected], 
    [email protected] 
    WHERE TagID = @TagID 
END 
RETURN @TagID 
END 
+0

無法創建存儲過程錯誤:消息102,級別15,狀態1,過程InsertTagTest,行23 'END'附近的語法錯誤。 – Pomster

+0

我在存儲過程開始時忘記了BEGIN - 但我建議你閱讀Dave的評論。 – riffnl

0

您在SQL Server中打開「身份說明」相應的列。轉到表設計模式,選擇列,並在底部的屬性屏幕中有一個屬性稱爲'身份規範'。

之後,您可以省略存儲過程中的TagId。 Sql Server會自動爲新記錄分配一個id。

如果您想知道新插入的標識是什麼(我認爲是您的下一個問題),您可以在存儲過程中使用函數SCOPE_IDENTITY(),該函數返回新插入記錄的標識。