Adicione uma linha a um database sql que tenha uma chave primária de identidade

Eu tenho um database de teste simples que tem uma coluna chamada ID que é uma chave primária com o conjunto de autoidentidade.

Eu estou tentando adicionar uma nova linha para a tabela de dados que criei usando o sqladapter

quando eu deixar a coluna de ID da nova linha vazia pensando que o sql a adicionaria, ela exibe o seguinte erro:

"Column "ID" doesn't not allow nulls 

Eu resolvi isso, mas dando o ID qualquer valor como dr["ID"] = 99999

E funcionou, mas agora, enquanto o database SQL ignora o valor e apenas fornece o número correto, a tabela de dados tem o ID 99999, o que o torna meio confuso e provavelmente lançará erros se eu tentar inserir outro registro

Como posso resolver este problema?

me desculpe por isso:

  DataRow dr = dt.NewRow(); dr["Name"] = "fds";//E.Name; dr["Age"] = 12;// E.Age; dr["DateOfBirth"] = "1-1-1999";// E.DoB; //dr["ID"] = 99999; dt.Rows.InsertAt(dr, dt.Rows.Count - 1); DBOperations.UpdateTable(dt); MessageBox.Show("Record added successfully"); static internal void UpdateTable(DataTable dt) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString); SqlDataAdapter Adapter = new SqlDataAdapter(); Adapter.SelectCommand = new SqlCommand("select * from Emp",con); Adapter.UpdateCommand = new SqlCommandBuilder(Adapter).GetUpdateCommand(); Adapter.InsertCommand = new SqlCommandBuilder(Adapter).GetInsertCommand(); Adapter.DeleteCommand = new SqlCommandBuilder(Adapter).GetDeleteCommand(); Adapter.Update(dt); } 

Script DB:

 USE [HR] GO /****** Object: Table [dbo].[Emp] Script Date: 2/12/2013 8:10:49 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Emp]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](max) NOT NULL, [Age] [int] NOT NULL, [DateOfBirth] [date] NOT NULL, CONSTRAINT [PK_Emp] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO 

Captura de canvas: insira a descrição da imagem aqui

Três coisas que você pode querer verificar:

1) Você poderia tentar

 dt.Rows.Add(dr); 

ao invés de

 dt.Rows.InsertAt(dr, dt.Rows.Count - 1); 

2) O SQL Server cria um novo ID / completa a instrução sem erros se você executar uma instrução INSERT na tabela? Gostar

 INSERT INTO tb_mytable (Name, Age) VALUES ('fds', 12) 

Se não houver algo errado com o campo ID.

3) Você verificou o comando de inserção do adaptador (criado) para correção?

Edit: Você também pode – em vez de usar o CommandBuilder, tente criar manualmente o comando Insert, como este e ver o que acontece – se isso está funcionando ok, então há algo errado com o seu CommandBuilder:

 string sql = "INSERT INTO [dbo].[emp] "; sql += "(Name, Age, DateOfBirth) "; sql += "Values (@Name, @Age, @DateOfBirth)"; SqlCommand insertCommand = new SqlCommand(); insertCommand.CommandText = sql; SqlParameter paramName = new SqlParameter(); paramName.ParameterName = "@Name"; paramName.DbType = DbType.AnsiString; paramName.SqlDbType = SqlDbType.NVarChar; paramName.SourceVersion = DataRowVersion.Current; paramName.SourceColumn = "Name"; SqlParameter paramAge = new SqlParameter(); paramAge.ParameterName = "@Age"; paramAge.DbType = DbType.Int32; paramAge.SqlDbType = SqlDbType.Int; paramAge.SourceVersion = DataRowVersion.Current; paramAge.SourceColumn = "Age"; SqlParameter paramDoB = new SqlParameter(); paramDoB.ParameterName = "@DateOfBirth"; paramDoB.DbType = DbType.Date; paramDoB.SqlDbType = SqlDbType.Date; paramDoB.SourceVersion = DataRowVersion.Current; paramDoB.SourceColumn = "DateOfBirth"; insertCommand.Parameters.Add(paramName); insertCommand.Parameters.Add(paramAge); insertCommand.Parameters.Add(paramDoB); Adapter.InsertCommand = insertCommand; 

O erro está vindo do DataAdapter, tenho certeza, não do database. Consulte http://msdn.microsoft.com/pt-br/library/ms971502.aspx