2015-10-15 29 views
1

我有一個表的SQL Server實例,它看起來像:ADO.net將新行插入到具有IDENTITY列的表中,該如何正確執行該操作?

IF OBJECT_ID(N'dbo.employees', N'U') IS NOT NULL 
    DROP TABLE dbo.Employees; 
GO 

CREATE TABLE dbo.employees 
(
id INT IDENTITY 
     PRIMARY KEY, 
name NVARCHAR(20), 
age TINYINT, 
birthday DATETIME 
); 

我學習ADO.net,我想插入使用新的行插入表。我的代碼如下:

string connectionString = @"Server=.\sql2014;Database=Test;Trusted_connection=True;"; 
SqlConnection connection = new SqlConnection(connectionString); 

SqlDataAdapter adapter = new SqlDataAdapter("select * from dbo.employees", connection); 
new SqlCommandBuilder(adapter); 

DataSet dataSet = new DataSet(); 
adapter.Fill(dataSet, "employees"); 

dataSet.Tables[0].Constraints.Add("pk_employees", dataSet.Tables[0].Columns[0], true); 

DataRow row = dataSet.Tables[0].NewRow(); 
row["id"] = 1; 
row["name"] = "Hi"; 
row["age"] = 33; 
row["birthday"] = "1982-10-09"; 

dataSet.Tables[0].Rows.Add(row); 
adapter.Update(dataSet.Tables[0]); 

MessageBox.Show("Inserted!"); 

表的id列是IDENTITY屬性,這意味着會自動生成其值的。但是,我必須將row["id"]設置爲某個整數值,否則我會收到錯誤「id列不全爲空」。當我使用SQL Server Profiler來捕獲執行的SQL,我發現執行的SQL的樣子:

exec sp_executesql N'INSERT INTO [dbo].[employees] ([name], [age], [birthday]) 
VALUES (@p1, @p2, @p3)', 
N'@p1 nvarchar(4),@p2 tinyint,@p3 datetime',@p1=N'Hi',@p2=33,@p3='1982-10-09 00:00:00' 

我想知道,什麼是插入在這樣一個表中的數據的正確方法是什麼?如果表已經有一些行,並且它的最大id是10.當我將row [「id」]設置爲一些小於10的值時,我會得到另一個錯誤「id列不允許重複值」。這是否意味着我需要在每次向表中插入新行之前獲取最大ID?

回答

0

它使用什麼值並不重要,但它不能重複。在這種情況下,我使用負值。您可以使用此邏輯:

DataTable tblAdded = dataSet.Tables[0].GetChanges(DataRowState.Added) ?? new DataTable(); 
row["id"] = -1 * (tblAdded.Rows.Count + 1); 

在這條路上,你

  • 總是唯一的僞ID的(實際值將由數據庫插入)
  • 可以看到這是隻加行在內存中
  • 保持插入順序,如果在某個地方(調試期間fe)
相關問題