PRIMARY KEY 違反、制約 'PK_T2': オブジェクト 'T2' には重複したキーは挿入できません。/r/nステートメントは終了されました。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
分析:上述問題是說往表T2中進行插入時候,主鍵重複插入。因為一個表可能有1個或多個主鍵,但是不論有幾個,資料庫中的表對主鍵而言都要唯一。
①
首先建立一個學生表,SNO為主鍵
CREATE TABLE Student_Info
(
SNO INT CONSTRAINT S1 PRIMARY KEY,
SNAME CHAR(6) CONSTRAINT S2 NOT NULL,
SEX CHAR(2) CONSTRAINT S3 CHECK(SEX IN ('0','1')),
BIRTHDAY DATETIME
)
②向該表中插入3條資料
INSERT INTO Student_Info
SELECT 1,'TOM','1','1983/04/15'
UNION ALL
SELECT 2,'HERRY','0','1983/04/16'
UNION ALL
SELECT 3,'JIM','1','2008/10/17'
③如果我們使用經常用到的SQL 來再一次把 姓名是TOM的這條資訊插入一次。
Insert Into Student_Info (SNO,SNAME,SEX,BIRTHDAY)
Values( 1,'TOM','1','1983/04/15')
就會出現我們上述所說的錯誤。即主鍵重複不能重複插入。
④下面我們不用第三步的SQL 而是利用程式碼形式以DataSet方式在DataSet表中添加一行,同樣把新添的該行賦值為上述TOM資訊,然後利用Update 方法更新回資料庫。看看會如何呢。
string strConn="Data Source=.;Initial Catalog=Test;User ID=sa;Password=";
SqlConnection conn=new SqlConnection (strConn);
SqlCommand cmd=new SqlCommand ("select * from Student_Info", conn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
//自動產生用於資料集更新的命令
SqlCommandBuilder cb=new SqlCommandBuilder(sda);
//填充資料集
DataSet public_ds =new DataSet();
sda.Fill (public_ds,"Student_Info");
//修改資料集—此處把TOM資訊再次插入
DataRow drRow = public_ds.Tables[0].NewRow();
drRow["SNO"]=1;
drRow["SNAME"]="TOM";
drRow["SEX"]="1";
drRow["BIRTHDAY"]="1983/04/15";
public_ds.Tables[0].Rows .Add(drRow);
//用更改後的資料集更新資料庫
sda.Update(public_ds,"Student_Info");