C# 我每分钟只能保存一条记录如何取消此限制?

C# 我每分钟只能保存一条记录如何取消此限制?,c#,sql,winforms,sql-server-2008,C#,Sql,Winforms,Sql Server 2008,我创建了一个应用程序,它使用ADO.Net和简单的插入查询将数据保存到本地服务器上的sql表中。然而,应用程序或服务器似乎每分钟只接受一条记录。如何使表接受更多记录? 我在中断代码后收到以下错误消息: 违反主键。无法在对象“dbo.AppLog”中插入重复键 以下是我使用的代码片段: #region Sql Insert statement try { if (Conn.State == ConnectionState.Closed) { Conn.Open();

我创建了一个应用程序,它使用ADO.Net和简单的插入查询将数据保存到本地服务器上的sql表中。然而,应用程序或服务器似乎每分钟只接受一条记录。如何使表接受更多记录? 我在中断代码后收到以下错误消息:

违反主键。无法在对象“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毫秒的计时器执行的

是否将
ITime
列用作主键?这解释了每分钟一条记录的问题,因为您的时间限制为分钟。也;它说你有一个主键冲突。这与性能等无关

此外;您的if块非常奇怪:

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

如果你有一个封闭的连接,你打开它;否则运行查询并关闭它?这是有意的吗?

这不是一个完整的答案,因为您的问题不完整

但是,在提供的代码中有两个重要的问题需要解决:

  • 当连接状态变为关闭时,您只需保持连接打开,而不执行查询。 (已删除
    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();
    }
    

    出现此错误的原因是,
    ITime
    列是您的主键

    主键在表中应该是唯一的

    当前,当您添加一行时,它会将其添加到
    ITime
    列的时间相加。例如:

    2014-06-10 16:32
    
    当您尝试添加另一行时,它会将相同的时间添加到
    ITime
    列中,因此您会得到以下结果:

    2014-06-10 16:32
    2014-06-10 16:32
    
    问题是,因为
    ITime
    列是主键,所以表中不能有重复的值



    若要解决此问题,请添加一个新列作为主键,或使时间更独特,例如将时间添加为滴答声。

    您是否尝试过批量插入?为什么您认为它每分钟保存一条记录-代码问题或DB admin施加的某些限制?你能分享你的代码和错误信息吗?我将在一分钟内添加代码,就像添加一样,尽管我在年第一次学习了c#和sql server,我过去严格使用vb.net编写代码,并且很好地使用access,所以我真的不明白时间是主键OK,但它每秒(而不是分秒或分钟)向数据库中添加信息如果时间从来都不是常数,datetime怎么可能是违规的。@断开的代码查看数据库中的时间值;那里没有秒或毫秒;分钟:我知道这就是为什么我感到困惑的原因,因为在我的access数据库中,我有年、月、日、时、分、秒。在这里,它只添加了00秒,其他什么都没有。代码在access中运行良好。这两者怎么会如此不同。我还使用了这段代码,因为它每秒钟都会添加信息,当我不使用这段代码时,我得到的连接是关闭的错误,或者连接是打开的错误。我还应该添加什么来回答这个问题,因为我对c#和sql server还是非常陌生的,所以有很多事情我不了解。您提到,这段代码是由计时器执行的。您能确定如何添加吗?好的,您能在db表中手动添加类似的
    ITime
    值吗?sililar ITime值是什么意思…?其他答案清楚地说明
    ITime
    列中不能有重复项。因为它是主键。因此,不能忽略您使用计时器应用的限制。这听起来绝对是最有可能的候选人。日期和时间列对主键的选择非常糟糕。钥匙的目标是它应该是唯一的、不断增加的、随时间稳定的,并且尽可能的窄。正是由于这个原因,整数标识列被广泛使用。看起来好像您正在DB列中使用
    SHORTDATETIME
    DATETIME
    会更好,但是你真的需要停止使用date列作为主键。哦,好吧,这个答案我理解,所以基本上它停留在它第一次使用的时间,不能使用任何其他时间,直到主键值发生变化,这是令人沮丧的。这可能看起来是一个非常愚蠢的问题,但是。如何在设计视图中更改表,而不删除它并创建新表。我以前尝试过更改主键,但它一直告诉我visual studio与它有连接,我无法保存任何主键changes@Broken_Code请为该查询打开一个新问题,我们将非常乐意提供帮助:)