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();
用于锁定。
答案 0 :(得分:3)
以下是我认为的解决方案
我确信使用Breakpoint调试您的应用程序将解决此问题
希望它会有所帮助
答案 1 :(得分:0)
找到我的答案。我只需要在ExecuteNonQuery()周围放一个储物柜。 :)
答案 2 :(得分:0)
线程真的很难。真的很难。所以不要使用它,除非你必须再考虑一下。我认为在你的情况下它不会给你什么,因为你锁定了可能占用大部分时间的部分,从而基本上序列化了你的电话。
如果您的问题受CPU限制(如计算),请使用线程,否则使用异步调用,尤其是在使用.NET 4.5时。