我创建了一个应用程序,它使用带有简单插入查询的ADO.Net将数据保存到位于本地服务器上的sql表中。但是,应用程序或服务器似乎每分钟只接受一条记录。如何让表格接受更多记录? 破解代码后,我收到以下错误消息:
违反PRIMARY KEY。无法在对象' dbo.AppLog'
中插入重复键
以下是我使用的代码段:
#region Sql Insert statement
try {
if (Conn.State == ConnectionState.Closed) {
Conn.Open();
} else if (Conn.State == ConnectionState.Open) {
cmd = new SqlCommand("insert into [AppLog] values('" + strbuff + "', '" + time + "','" + Processing + "','" + userName + "')", Conn);
cmd.ExecuteNonQuery();
Conn.Close();
}
} catch (Exception ex) {
//MessageBox.Show(ex.Message);
}#endregion
此代码由我设置为1000毫秒的计时器执行
答案 0 :(得分:2)
您遇到此错误的原因是因为列ITime
是您的主键。
主键在您的表中应该是唯一的。
目前,当您添加行时,会添加添加到ITime
列的时间。例如:
2014-06-10 16:32
当您尝试添加另一行时,它会将同时添加到ITime
列,因此您最终会这样:
2014-06-10 16:32
2014-06-10 16:32
问题是,因为ITime
列是您的主键,您的表格中不能包含重复值。
要解决此问题,请添加新列作为主键,或者将时间更加独特,例如将时间添加为刻度。
答案 1 :(得分:1)
您使用ITime
列作为主键吗?这解释了每分钟一次记录的问题,因为您的时间限制在几分钟之内。也;它说你有一个主键违规。这与表演等无关。
此外;你的if-block非常奇怪:
if (Conn.State == ConnectionState.Closed) {
Conn.Open();
} else if (Conn.State == ConnectionState.Open) {
cmd = new SqlCommand("insert into [AppLog] values('" + strbuff + "', '" + time + "','" + Processing + "','" + userName + "')", Conn);
cmd.ExecuteNonQuery();
Conn.Close();
}
如果你有一个关闭的连接,你打开它;否则你运行一个查询并关闭它?这是为了吗?
答案 2 :(得分:1)
这不是一个完整的答案,因为您的问题并不完整。
但是,在提供的代码中有两个重要的事情要修复:
当连接状态关闭时,您只需打开连接而不执行查询。
(已移除else
)。
try-catch
块中更改的代码:
if (Conn.State == ConnectionState.Closed)
Conn.Open();
if (Conn.State == ConnectionState.Open)
{
cmd = new SqlCommand("insert into [AppLog] values (@strbuff,
@time,
@Processing,
@userName", Conn);
cmd.Parameters.AddWithValue("@strbuff", strbuff);
cmd.Parameters.AddWithValue("@time", time);
cmd.Parameters.AddWithValue("@Processing", Processing);
cmd.Parameters.AddWithValue("@userName", userName);
cmd.ExecuteNonQuery();
Conn.Close();
}