单个插入语句正在插入多个值

时间:2013-07-23 14:02:08

标签: c# sqlcommand

Hello Stack Overflow社区,

我手上有一个疯狂的问题。这是我的问题:
1)。在执行ExecuteNonQuery()之前,我的数据库中没有记录
2)。执行ExecuteNonQuery()之后,我的数据库中有两条记录,尽管我使用的是一条插入语句。

我的程序是多线程的。我限制了我的程序,所以只有一个线程正在运行,但我仍然得到错误。

我会查看其他方面,但我不知道在哪里搜索或任何原因会发生这种情况。

以下是我的计划的基本概要     每天开始一个线程
    寻找文件
    从文件中提取信息     上传信息

以下是我用来上传数据的代码(排除错误处理)

      string CommandString = INSERT INTO Production_Test.dbo.Transactions
      (BoxId, ProcessDate, Batch, BillingElementID, 
      TransactionDescription, Quantity)

      VALUES (@BoxId, @ProcessDate, @Batch, 
      @BillingElementID, @TransactionDescription, @Quantity)";

      SqlCommand Command = new SqlCommand(CommandString, Database);

            Command.Parameters.AddWithValue("ProcessDate", CheckPrimaryKeyForNull(this.ProcessDate));
            Command.Parameters.AddWithValue("Batch", CheckPrimaryKeyForNull(this.Batch));
            Command.Parameters.AddWithValue("BoxId", CheckPrimaryKeyForNull(this.BoxId));
            Command.Parameters.AddWithValue("BillingElementId", CheckPrimaryKeyForNull(this.BillingElementId));
            Command.Parameters.AddWithValue("TransactionDescription", CheckPrimaryKeyForNull(this.TransactionDescription));
            Command.Parameters.AddWithValue("Quantity", CheckIfNullAddZero(this.Quantity));

Command.ExecuteNonQuery();

我只使用一个插入语句,但它插入了两个记录。任何人都知道为什么会发生这种情况?

谢谢,

达伦。

编辑:这是我的代码的多线程部分。

for (DateTime CurrentDate = BeginningDate; CurrentDate <= EndingDate; CurrentDate =     CurrentDate.AddDays(1))
{
    DateTime TempCurrentDate = CurrentDate;
    FileThreads[ThreadCounter] = new Thread(() => RipInformationFromFiles.Process(Parameters, TempCurrentDate, ArgsIndex));
    FileThreads[ThreadCounter].Start();
    ThreadCounter++;
 }

 foreach (Thread ThisThread in FileThreads)
 {
     if (ThisThread != null)
     {
         ThisThread.Join();
     }
 }

每个线程然后查看某个路径并更新信息 我唯一有锁的时候是调用类的上传方法。

        lock (Locker)
        {
                ProductionDatabase.Upload();
        }

我将此static readonly object Locker = new object();用于锁定。

3 个答案:

答案 0 :(得分:3)

以下是我认为的解决方案

  • 尝试使用Breakpoint调试您的应用程序
  • 确保没有触发器
  • 如果您使用此方法,请确保其不再在页面刷新时插入新记录
  • 确保您没有在其他地方复制此代码,或者此处的任何地方都不会调用此函数

我确信使用Breakpoint调试您的应用程序将解决此问题

希望它会有所帮助

答案 1 :(得分:0)

找到我的答案。我只需要在ExecuteNonQuery()周围放一个储物柜。 :)

答案 2 :(得分:0)

线程真的很难。真的很难。所以不要使用它,除非你必须再考虑一下。我认为在你的情况下它不会给你什么,因为你锁定了可能占用大部分时间的部分,从而基本上序列化了你的电话。

如果您的问题受CPU限制(如计算),请使用线程,否则使用异步调用,尤其是在使用.NET 4.5时。