Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# net在具有标识列的表中插入新行,如何正确执行?_C#_Sql Server_Database_Ado.net - Fatal编程技术网

C# net在具有标识列的表中插入新行,如何正确执行?

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

我在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_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(实际值将由数据库插入)
      • 可以看到哪些行只添加到内存中
      • 保留插入顺序,如果这在某个地方很重要(例如调试期间)