2013-10-01 132 views
0

每當我嘗試向該表中插入新行時,它都會給我提供我無法修改該列(因爲它是主鍵)的錯誤。所以我排除它的查詢,但它然後返回查詢和列數是不同的。我如何使用主鍵添加一行?在SQL數據庫中插入新行無法因爲主鍵

下面的代碼中插入:

var getmessages = new SqlCeCommand("Insert into chat values('" + txtSend.Text + "', '" + Environment.UserName + "', '" + user + "', '" + Environment.UserName + "', '" + DateTime.Now.ToShortTimeString() + "', '" + DateTime.Now.ToString() + "', '"+UID+"')", con); 

下面是我通過查詢添加(因爲它是一個更新到數據庫)中的主鍵...

alter table chat add c_id int identity primary key 

然後它拋出我的錯誤enter image description here

如果我刪除插入查詢我得到這個錯誤(UID)...

enter image description here

+0

你需要使用SQL參數,如果有人輸入'''進入聊天框,它將導致程序失敗。 –

回答

5

你需要正是你所插入到哪些列告訴SQL CE。

第一個問題不是因爲它是主鍵。這是因爲關鍵是一個識別字段,併爲您自動生成。所以,讓我們繼續前進。

第二個問題就是您沒有指定要插入的列。

插入應該是這樣的:

insert into chat(field1, field2, field3) values('val1', 'val2', 'val3') 

通知的字段名。你必須把實際的字段名稱放在那裏。

這就是說,代碼仍然很糟糕。雖然上述工作,你真的真的應該參數化您的查詢。即使假設這個程序從來沒有真正發佈到真實世界中,並且假設有人對它進行了攻擊,那麼您可以不那麼關心......以正確的方式做事情仍然是一個好習慣。哦..你不會有'分數的問題..這會導致你的應用程序崩潰。

+0

確實應該是'values(@ val1,@ val2 ...)',但我相信你正在編輯它。 –

+0

@ScottChamberlain:好吧..你不需要刻度標記..;) – NotMe

+0

Tick分數?我沒有看到任何刻度標記! (從來沒有批評5分鐘標誌:)) –

1

您需要從查詢中的主鍵除了指定的所有列:

Insert into chat (column1, column2, ...) values (...) 
0

您的代碼中存在嚴重的SQL錯誤;您必須使用參數並指定每一列:

var insert = new SqlCeCommand("Insert into chat (sendCol, firstNameCol, secondNameCol, firstTimeCol, secondTimeCol, uidCol) values (@send, @name, @name, @time, @time, @uid)"; 
insert.Parameters.Add(new SqlCeParameter("@send", txtSend.Text)); 
insert.Parameters.Add(new SqlCeParameter("@name", Environment.UserName)); 
insert.Parameters.Add(new SqlCeParameter("@time", DateTime.Now)); 
insert.Parameters.Add(new SqlCeParameter("@uid", Something)); 
0

您需要在查詢中像下面一樣定義參數。

insert into table(f1,f2,f3) values(v1,v2,v3) 
相關問題