0

你好堆栈溢出社区,

我手上有一个疯狂的问题。这是我的问题:
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();做我的锁。

4

3 回答 3

3

这是我认为的解决方案

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

我相信用断点调试你的应用程序会解决这个问题

希望它会有所帮助

于 2013-07-23T14:09:57.387 回答
0

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

于 2013-07-23T18:14:31.580 回答
0

线程真的很难。真的很难。所以不要使用它,除非你不得不再想一想。我认为在你的情况下它什么也没给你,因为你锁定了可能花费最多时间的部分,从而基本上序列化了你的调用。

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

于 2013-07-23T18:37:30.867 回答