ADO.net在具有IDENTITY列的表中插入一个新行,如何正确地执行此操作?

时间:2015-10-15 14:32:51

标签: c# sql-server database ado.net

我在SQL Server实例中有一个表,它看起来像:

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探查器捕获执行的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.当我将行[" id"]设置为某些小于10的值时,我会得到另一个错误" id列不允许重复值"。这是否意味着我需要在每次向表中插入新行之前获取最大ID?

1 个答案:

答案 0 :(得分:0)

使用什么价值并不重要但它不能重复。在这种情况下我使用负值。你可以使用这个逻辑:

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

通过这种方式

  • 始终获得唯一的伪ID(数据库将插入实际值)
  • 可以看到哪些行只在内存中添加
  • 保留插入顺序,如果这在某处很重要(例如,在调试期间)