2013-02-12 49 views
1

我有一個簡單的測試數據庫,它有一個名爲ID的列,它是一個帶有自動設置的主鍵。向具有身份主鍵的sql數據庫添加一行

我想一個新的行添加到我使用sqladapter

當我離開新行的ID列空想着SQL會增加它,它會顯示以下錯誤創建的數據表:

"Column "ID" doesn't not allow nulls 

我解決了,但給人ID喜歡dr["ID"] = 99999

任何價值和它的工作,但現在當SQL數據庫忽略該值,只是給它正確的號碼錶具有的99999 ID,這使得它有點CON如果我嘗試插入另一條記錄,可能會發生錯誤

我該如何解決這個問題?

比較遺憾的是:

  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); 
    } 

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 

截圖:你可能想 enter image description here

+4

請顯示您的代碼。如果我們看不到它,我們怎麼能說出你做錯了什麼? – 2013-02-12 17:37:25

+0

創建/返回InsertCommand的代碼在哪裏? – Tim 2013-02-12 18:06:12

+2

您確定ID列是標識列嗎?如果您嘗試插入標識列,你應該得到一個'表無法插入的標識列顯式值「的Emp」當IDENTITY_INSERT設置爲OFF.'錯誤 – shf301 2013-02-12 18:06:32

回答

3

三件事來檢查:

1)你可以嘗試

dt.Rows.Add(dr); 

代替

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

2)是否SQL Server中創建一個新的ID /完成語句W/O錯誤,如果你對錶運行的INSERT語句?像

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

如果不是,那麼ID字段可能有問題。

3)您是否檢查過適配器(創建的)插入命令的正確性?

編輯:你也可以 - 而不是使用CommandBuilder的,儘量手動創建INSERT命令,這樣,看看會發生什麼 - 如果這是正常的工作,然後有什麼不對您的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; 
相關問題