2013-10-01 89 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) 
相关问题