首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行多个线程时SQL事务上的内部连接致命错误

问运行多个线程时SQL事务上的内部连接致命错误
EN

Stack Overflow用户
提问于 2021-08-17 06:47:57
回答 1查看 109关注 0票数 1

我正在编写一个应用程序,它同时对一些设备进行多个测试。测试之后,我想将结果添加到数据库中。我在数据库中有三个表: Testsequence,Maintest,Subtest来链接数据,我必须知道“父”表对象的id。

但是,当我运行多个任务时,在sequenceId = Convert.ToInt32(sqlcommand.ExecuteScalar());上得到:{“内部连接致命错误”。}

目前,我正在使用Microsoft的本地数据库(使用System.Data.SqlClient;)

代码语言:javascript
复制
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);
            }
        }
    }

我试过的是:

  • 之前,我有一个连接的全局变量。这不是
  • 的问题,我没有使用using语句.无论如何,这不是问题所在,

也是

也许你看到我的代码不是最好的:如果你有任何其他的想法,如何改进,请也写一个评论。

我也不知道问题是否存在于多线程、查询命令或事务中多个命令的执行中。

(预先谢谢:)

EN

回答 1

Stack Overflow用户

发布于 2021-08-17 13:36:08

..。问题就在屏幕前。-.-

旧的_sqlConnection是上一个“版本”的遗留物。

  • 使用事务

语句将_sqlConnection更改为缺少的_sqlConnection

谢谢@Charlieface

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68812773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档