我在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?
答案 0 :(得分:0)
使用什么价值并不重要但它不能重复。在这种情况下我使用负值。你可以使用这个逻辑:
DataTable tblAdded = dataSet.Tables[0].GetChanges(DataRowState.Added) ?? new DataTable();
row["id"] = -1 * (tblAdded.Rows.Count + 1);
通过这种方式