Во время выполнения команды произошла фатальная ошибка - только в C#

У меня проблемы с запуском этого запроса. На моем персональном компьютере я обновил MySQL до 5.7, чтобы улучшить журналирование, и этот запрос работает отлично. Когда я запускаю его в производство на 5.5, он работает, но только иногда.

Использование HeidiSQL в производственной среде (i7 3.4 ГГц - 16 ГБ ОЗУ) работает, но для его запуска требуется 50 секунд, но на моем 6-ядерном 64-ГБ ОЗУ Dual это занимает всего 2,6 секунды на моем компьютере с использованием тех же данных). Используя мое приложение на C#, я получаю сообщение об ошибке "Неустранимая ошибка при выполнении команды". Любая идея, что отличается в этих двух ситуациях, что это будет работать в одной, но не в другой? Имеет ли время выполнения какое-либо отношение к этому?

Я использую тот же метод выполнения запросов C# для 20 других запросов, которые все работают просто отлично, но по какой-то причине у этого возникают проблемы.

Запрос:

SELECT p.patnum            AS reference_id, 
       p.guarantor         AS guarantor_reference_id, 
       p.bal_0_30          AS balance_0_30, 
       p.bal_31_60         AS balance_31_60, 
       p.bal_61_90         AS balance_61_90, 
       p.balover90         AS balance_over_90, 
       p.baltotal          AS account_balance, 
       pending_writeoff, 
       claims_estimated_amount, 
       patient_portion_due AS amount_due_from_patient, 
       Sum(procfee)        AS lifetime_value 
FROM   patient AS p 
       LEFT JOIN (SELECT patient.patnum, 
                         patient.guarantor, 
                         patient.bal_0_30, 
                         patient.bal_31_60, 
                         patient.bal_61_90, 
                         patient.balover90, 
                         guarAging.baltotal, 
                         guarAging.inswoest 
                                             AS 
                                                       pending_writeoff, 
                         guarAging.inspayest 
                                             AS 
                                                       claims_estimated_amount, 
                         guarAging.baltotal - guarAging.inspayest - 
                         guarAging.inswoest 
                                             AS 
                         patient_portion_due 
                  FROM   (SELECT tSums.patnum, 
                                 Round(CASE 
                                         WHEN tSums.totalcredits >= 
                                              tSums.chargesover90 
                                       THEN 0 
                                         ELSE tSums.chargesover90 - 
                                              tSums.totalcredits 
                                       end, 2)              Balover90, 
                                 Round(CASE 
                                         WHEN tSums.totalcredits <= 
                                              tSums.chargesover90 
                                       THEN 
                                         tSums.charges_61_90 
                                         WHEN tSums.chargesover90 + 
                                              tSums.charges_61_90 
                                              <= 
                                              tSums.totalcredits 
                                       THEN 0 
                                         ELSE tSums.chargesover90 + 
                                              tSums.charges_61_90 
                                              - 
                                              tSums.totalcredits 
                                       end, 2)              Bal_61_90, 
                                 Round(CASE 
                                         WHEN tSums.totalcredits < 
                                              tSums.chargesover90 + 
                                              tSums.charges_61_90 THEN 
                                         tSums.charges_31_60 
                                         WHEN tSums.chargesover90 + 
                                              tSums.charges_61_90 
                                              + tSums.charges_31_60 <= 
                                              tSums.totalcredits THEN 0 
                                         ELSE tSums.chargesover90 + 
                                              tSums.charges_61_90 
                                              + tSums.charges_31_60 - 
                                              tSums.totalcredits 
                                       end, 2)              Bal_31_60, 
                                 Round(CASE 
                                         WHEN tSums.totalcredits < 
                                              tSums.chargesover90 + 
                                              tSums.charges_61_90 
                                              + tSums.charges_31_60 THEN 
                                         tSums.charges_0_30 
                                         WHEN tSums.chargesover90 + 
                                              tSums.charges_61_90 
                                              + tSums.charges_31_60 + 
                                              tSums.charges_0_30 <= 
                                              tSums.totalcredits 
                                       THEN 0 
                                         ELSE tSums.chargesover90 + 
                                              tSums.charges_61_90 
                                              + tSums.charges_31_60 + 
                                              tSums.charges_0_30 - 
                                              tSums.totalcredits 
                                       end, 2)              Bal_0_30, 
                                 Round(tSums.baltotal, 2)   BalTotal, 
                                 Round(tSums.inswoest, 2)   InsWoEst, 
                                 Round(tSums.inspayest, 2)  InsPayEst, 
                                 Round(tSums.payplandue, 2) PayPlanDue 
                          FROM   (SELECT p.guarantor              PatNum, 
                                         Sum(CASE 
                                               WHEN trans.tranamount > 0 
                                                    AND trans.trandate < 
                                                        '2018-01-11' 
                                             THEN 
                                               trans.tranamount 
                                               ELSE 0 
                                             end)                 ChargesOver90, 
                                         Sum(CASE 
                                               WHEN trans.tranamount > 0 
                                                    AND trans.trandate < 
                                                        '2018-01-12' 
                                                    AND trans.trandate >= 
                                                        '2018-02-10' 
                                             THEN 
                                               trans.tranamount 
                                               ELSE 0 
                                             end)                 Charges_61_90, 
                                         Sum(CASE 
                                               WHEN trans.tranamount > 0 
                                                    AND trans.trandate < 
                                                        '2018-02-11' 
                                                    AND trans.trandate >= 
                                                        '2018-03-12' 
                                             THEN 
                                               trans.tranamount 
                                               ELSE 0 
                                             end)                 Charges_31_60, 
                                         Sum(CASE 
                                               WHEN trans.tranamount > 0 
                                                    AND trans.trandate <= 
                                                        '2018-03-13' 
                                                    AND trans.trandate >= 
                                                        '2018-04-12' 
                                             THEN 
                                               trans.tranamount 
                                               ELSE 0 
                                             end)                 Charges_0_30, 
                                         -Sum(CASE 
                                                WHEN trans.tranamount < 0 
                                                     AND trans.trandate <= 
                                                         '2018-04-12' 
                                              THEN 
                                                trans.tranamount 
                                                ELSE 0 
                                              end)                TotalCredits, 
                                         Sum(CASE 
                                               WHEN trans.tranamount != 0 THEN 
                                               trans.tranamount 
                                               ELSE 0 
                                             end)                 BalTotal, 
                                         Sum(trans.inswoest)      InsWoEst, 
                                         Sum(trans.inspayest)     InsPayEst, 
                                         Sum(trans.payplanamount) PayPlanDue 
                                  FROM   (SELECT 'Proc' 
                                                 TranType, 
                                                 pl.patnum, 
                                                 pl.procdate 
                                                 TranDate, 
                                                 pl.procfee * ( 
                                                 pl.unitqty + pl.baseunits ) 
                                                 TranAmount, 
                                                 0 
                                                 PayPlanAmount 
                                                 , 
                                                 0 
                                                 InsWoEst, 
                                                 0 
                                                 InsPayEst 
                                          FROM   procedurelog pl 
                                          WHERE  pl.procstatus = 2 
                                                 AND pl.procfee != 0 
                                          UNION ALL 
                                          SELECT 'Claimproc' TranType, 
                                                 cp.patnum, 
                                                 cp.datecp   TranDate, 
                                                 ( CASE 
                                                     WHEN cp. status != 0 THEN 
                                                     ( CASE 
                                                     WHEN cp.payplannum = 0 THEN 
                                                     - 
                                                     cp.inspayamt 
                                                     ELSE 0 
                                                       end ) 
                                                     - 
                                                     cp.writeoff 
                                                     ELSE 0 
                                                   end )     TranAmount, 
                                                 ( CASE 
                                                     WHEN cp.payplannum != 0 
                                                          AND cp. status IN ( 1, 
                                                              4, 5 ) 
                                                   THEN - 
                                                     cp.inspayamt 
                                                     ELSE 0 
                                                   end )     PayPlanAmount, 
                                                 ( CASE 
                                                     WHEN cp. status = 0 THEN 
                                                     cp.writeoff 
                                                     ELSE 0 
                                                   end )     InsWoEst, 
                                                 ( CASE 
                                                     WHEN cp. status = 0 THEN 
                                                     cp.inspayest 
                                                     ELSE 0 
                                                   end )     InsPayEst 
                                          FROM   claimproc cp 
                                          WHERE  cp. status IN ( 0, 1, 4, 5, 7 ) 
                                          HAVING tranamount != 0 
                                                  OR payplanamount != 0 
                                                  OR inswoest != 0 
                                                  OR inspayest != 0 
                                          UNION ALL 
                                          SELECT 'Adj'     TranType, 
                                                 a.patnum, 
                                                 a.adjdate TranDate, 
                                                 a.adjamt  TranAmount, 
                                                 0         PayPlanAmount, 
                                                 0         InsWoEst, 
                                                 0         InsPayEst 
                                          FROM   adjustment a 
                                          WHERE  a.adjamt != 0 
                                          UNION ALL 
                                          SELECT 'PatPay'   TranType, 
                                                 ps.patnum, 
                                                 ps.datepay TranDate, 
                                                 ( CASE 
                                                     WHEN ps.payplannum = 0 THEN 
                                                     - 
                                                     ps.splitamt 
                                                     ELSE 0 
                                                   end )    TranAmount, 
                                                 ( CASE 
                                                     WHEN ps.payplannum != 0 
                                                   THEN - 
                                                     ps.splitamt 
                                                     ELSE 0 
                                                   end )    PayPlanAmount, 
                                                 0          InsWoEst, 
                                                 0          InsPayEst 
                                          FROM   paysplit ps 
                                          WHERE  ps.splitamt != 0 
                                          UNION ALL 
                                          SELECT 'PPCharge' 
                                                 TranType, 
                                                 ppc.guarantor 
                                                 PatNum, 
                                                 ppc.chargedate 
                                                 TranDate, 
                                                 0 
                                                 TranAmount, 
                                                 Coalesce (ppc.principal + 
                                                 ppc.interest, 0) 
                                                 PayPlanAmount 
                                                 , 
                                                 0 
                                                 InsWoEst, 
                                                 0 
                                                 InsPayEst 
                                          FROM   payplancharge ppc 
                                          WHERE  ppc.chargedate <= '2018-04-22' 
                                                 AND ppc.chargetype = 0 
                                                 AND Coalesce (ppc.principal + 
                                                               ppc.interest, 0) 
                                                     != 0 
                                          UNION ALL 
                                          SELECT 'PPComplete'     TranType, 
                                                 pp.patnum, 
                                                 pp.payplandate   TranDate, 
                                                 -pp.completedamt TranAmount, 
                                                 0                PayPlanAmount, 
                                                 0                InsWoEst, 
                                                 0                InsPayEst 
                                          FROM   payplan pp 
                                          WHERE  pp.completedamt != 0) trans 
                                         RIGHT JOIN patient p 
                                                 ON p.patnum = trans.patnum 
                                  GROUP  BY p.guarantor 
                                  ORDER  BY NULL) tSums) guarAging 
                         INNER JOIN patient 
                                 ON patient.patnum = guarAging.patnum 
                         LEFT JOIN (SELECT patnum, 
                                           claimstatus, 
                                           claimfee, 
                                           inspayest, 
                                           writeoff 
                                    FROM   claim) AS c 
                                ON c.patnum = patient.patnum 
                  GROUP  BY patient.patnum) AS results 
              ON results.patnum = p.patnum 
       LEFT JOIN procedurelog AS plog 
              ON plog.patnum = p.patnum 
                 AND plog.procstatus = 2 
GROUP  BY p.patnum 

C# Выполнение:

   try
    {
        using (var mySqlConnection = new MySqlConnection(connBuilder.ConnectionString))
        {
            mySqlConnection.Open();

            using (var cmd = new MySqlCommand(strQuery, mySqlConnection))
            {
                using (var reader = cmd.ExecuteReader())   <= FAILS HERE
                {

Для чего это стоит, в какой-то момент я увидел ошибку "фатальная ошибка во время чтения данных" и добавил это, но другая ошибка все еще происходит:

MySqlCommand timeoutAdjust = new MySqlCommand("set net_write_timeout=99999; set net_read_timeout=99999", mySqlConnection); // Setting tiimeout on mysqlServer
                    timeoutAdjust.ExecuteNonQuery();

0 ответов

Другие вопросы по тегам