C# net在具有标识列的表中插入新行,如何正确执行?
我在SQL Server实例中有一个表,它看起来像:C# net在具有标识列的表中插入新行,如何正确执行?,c#,sql-server,database,ado.net,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 ); exec sp_executes
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
);
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'
我正在学习ADO.net,我想使用insert在表中插入新行。我的代码如下:
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属性,这意味着将自动生成其值。但是,我必须将行[“id”]
设置为某个整数值,否则我将得到一个错误“id列不都为null”。当我使用SQL Server profiler捕获执行的SQL时,我发现执行的SQL如下所示:
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
);
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列不允许重复值”。这是否意味着在每次向表中插入新行之前需要获取max id?使用什么值并不重要,但它不能重复。在这种情况下,我使用负值。您可以使用以下逻辑:
DataTable tblAdded = dataSet.Tables[0].GetChanges(DataRowState.Added) ?? new DataTable();
row["id"] = -1 * (tblAdded.Rows.Count + 1);
在这条路上你
- 始终获取唯一的伪ID(实际值将由数据库插入)
- 可以看到哪些行只添加到内存中
- 保留插入顺序,如果这在某个地方很重要(例如调试期间)
- 使用什么值并不重要,但它不可能是重复的。在这种情况下,我使用负值。您可以使用以下逻辑:
DataTable tblAdded = dataSet.Tables[0].GetChanges(DataRowState.Added) ?? new DataTable();
row["id"] = -1 * (tblAdded.Rows.Count + 1);
在这条路上你
- 始终获取唯一的伪ID(实际值将由数据库插入)
- 可以看到哪些行只添加到内存中
- 保留插入顺序,如果这在某个地方很重要(例如调试期间)