我正在编写一个应用程序,它同时对一些设备进行多个测试。测试之后,我想将结果添加到数据库中。我在数据库中有三个表: Testsequence,Maintest,Subtest来链接数据,我必须知道“父”表对象的id。
但是,当我运行多个任务时,在sequenceId = Convert.ToInt32(sqlcommand.ExecuteScalar());上得到:{“内部连接致命错误”。}
目前,我正在使用Microsoft的本地数据库(使用System.Data.SqlClient;)
public static void AddResults(Device device)
{
using (var connection = new SqlConnection(Settings.DBConnectionString))
{
SqlTransaction transaction;
transaction = _sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
SqlCommand sqlcommand = _sqlConnection.CreateCommand();
sqlcommand.Connection = _sqlConnection;
sqlcommand.Transaction = transaction;
// Add Testsequence
sqlcommand = new SqlCommand(@"INSERT INTO TestSequence (IdMachine,DateTime) VALUES (@IdDevice,@DateTime) SELECT SCOPE_IDENTITY()", _sqlConnection, transaction);
{
sqlcommand.Parameters.Add(new SqlParameter("@IdDevice", device.DataBaseId));
sqlcommand.Parameters.Add(new SqlParameter("@DateTime", device.Progress.ResultActive.Time));
}
sequenceId = Convert.ToInt32(sqlcommand.ExecuteScalar());
foreach (TestCategory category in device.Progress.ResultActive)
{
foreach (MainTest mainTest in category)
{
// Add MainTest
if (mainTest.Time == null) continue;
sqlcommand = new SqlCommand(@"INSERT INTO MainTests (IdSequenceMT,IdTestNameMT,DateTimeMT,Passed) VALUES @IdSequenceMT,@IdTestNameMT,@DateTimeMT,@Passed) SELECT SCOPE_IDENTITY()", _sqlConnection, transaction);
{
sqlcommand.Parameters.Add(new SqlParameter("@IdSequenceMT", sequenceId));
sqlcommand.Parameters.Add(new SqlParameter("@IdTestNameMT", mainTest.Id));
sqlcommand.Parameters.Add(new SqlParameter("@DateTimeMT", mainTest.Time));
sqlcommand.Parameters.Add(new SqlParameter("@Passed", mainTest.Pass));
}
mainTestId = Convert.ToInt32(sqlcommand.ExecuteScalar());
foreach (SubTest subTest in mainTest)
{
// Add SubTest
if (subTest.Pass == null) continue;
sqlcommand = new SqlCommand(@"INSERT INTO SubTests
(IdMainTestST,IdTestName,DateTimeST,Passed,Log_enUS,Log_deDE) VALUES (@IdMainTestST,@IdTestName,@DateTimeST,@Passed,@Log_enUS,@Log_deDE)",
_sqlConnection, transaction);
{
sqlcommand.Parameters.Add(new SqlParameter("@IdMainTestST", mainTestId));
sqlcommand.Parameters.Add(new SqlParameter("@IdTestName", subTest.Id));
sqlcommand.Parameters.Add(new SqlParameter("@DateTimeST", subTest.Time));
sqlcommand.Parameters.Add(new SqlParameter("@Passed", subTest.Pass));
sqlcommand.Parameters.Add(new SqlParameter("@Log_enUS", subTest.Log));
sqlcommand.Parameters.Add(new SqlParameter("@Log_deDE", subTest.Log));
}
sqlcommand.ExecuteNonQuery();
}
}
}
if (connection.State != System.Data.ConnectionState.Open) connection.Open();
transaction.Commit();
log.Info($"SQL {device.Serialnumber}|{device.DataBaseId}: Testsequence Id: {sequenceId} added");
}
catch (Exception e)
{
transaction.Rollback();
log.Info($"SQL : {device.Serialnumber} Testsequence add: transaction rollback\n{e}");
Helper.UiMessage($"{device.Serialnumber} {Project.Properties.Resources.results_not_added}", 60);
}
}
}我试过的是:
也是
也许你看到我的代码不是最好的:如果你有任何其他的想法,如何改进,请也写一个评论。
我也不知道问题是否存在于多线程、查询命令或事务中多个命令的执行中。
(预先谢谢:)
发布于 2021-08-17 13:36:08
..。问题就在屏幕前。-.-
旧的_sqlConnection是上一个“版本”的遗留物。
语句将_sqlConnection更改为缺少的_sqlConnection
谢谢@Charlieface
https://stackoverflow.com/questions/68812773
复制相似问题