Выполнять несколько запросов Informix SQL в ASP.NET - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь выполнить несколько запросов Informix SQL в ASP.NET.Когда я выполняю эти 4 запроса с или без точек с запятой, я получаю синтаксическую ошибку, подобную этой:

ERROR [42000] [Informix][Informix ODBC Driver][Informix]A syntax error has occurred.

Возможно ли выполнить 4 запроса один за другим в отдельных командах OdbcCommand, так как я использую временные таблицы для своего финальногоКоманда SQL или все в одной команде?

Это метод, который я создал:

        public SumarneDjelatnosti GetEPonudeDjelatnostiSumarnoList(String appid, String oper, Int16 godina)
        {
            //METODA
            // TODO: unit test GetEPonudeDjelatnostiSumarnoList

            SvcActContext sac = null;

            sac = InitCtx("GetEPonudeDjelatnostiSumarnoList");

            if (appid == null) { appid = ""; }

            oper = OperAlter(appid, sac, oper);

            SumarneDjelatnosti popis = new SumarneDjelatnosti();

            if (!SvcAccessAuth.AccessGranted(appid, sac))
            {
                popis.Odgovor = "Neovlašten pristup.";

                popis.OdgovorStatus = -100;

                LogSvcEvent(appid, sac, "UnauthorizedUse", oper, null, popis.OdgovorStatus.ToString(), popis.Odgovor, 200);

                return popis;
            }

            String dsnc = AppGlobals.DSNd;

            String opmbo = oper.Trim();
            String ust;

            EPonudaOperToken tok = new EPonudaOperToken();

            tok = _GetEPonudaSekOperOvl(appid, sac, oper);

            if (tok.OdgovorStatus < 0)
            {
                popis.Odgovor = tok.Odgovor;
                popis.OdgovorStatus = tok.OdgovorStatus;

                LogSvcEvent(appid, sac, "Error", oper, null, String.Format("GetEPonudaSekOperOvl: {0}, {1}", popis.OdgovorStatus, popis.Odgovor), null, 200);

                return popis;
            }
            ust = tok.DavzuSif;

            LogSvcEvent(appid, sac, "Begin", opmbo, null, dsnc, null, 50);

            using (OdbcConnection ocn = new OdbcConnection(AppGlobals.OdbcCString(true)))
            {
                try
                {
                    ocn.Open();
                }
                catch (Exception ex)
                {
                    popis.Odgovor = "Pristup bazi podataka nije moguć.";

                    popis.OdgovorStatus = -101;

                    LogSvcEvent(appid, sac, "DbAccessError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                    return popis;
                }

                using (OdbcCommand dbcmd = ocn.CreateCommand())
                {
                    String first = "";
#if DEBUG
                    first = " first 25 ";
#endif
                    String sql = @"
                    select " + first + @" p.id, dj.sifra djsifra, dj.naziv djnaziv, 
                    sum((case
                    when r.krevet is null then r.brkrevk 
                    when r.brkrevk is null then r.krevet
                    else r.krevet+r.brkrevk
                    end)) br_kreveta, 
                    sum(r.mjesta) mjesta_bolnice,
                    sum(r.postup) br_postupaka, sum(r.sala) br_sala, 
                    round(sum(
                    (case 
                    when dj.sifra like '%1' then 1
                    else r.sati/40
                    end)
                    ),2)  ordinacija
                    FROM eponudesb p
                    right join radiliste  r on r.eponudesb_id = p.id
                    right join djelzz dj on dj.id = r.djelzz_id
                    where r.godina=2018  
                    and p.davzu_sif='004200420'
                    group by p.id, dj.sifra, dj.naziv
                    order by dj.sifra 
                    into temp djelatnost_izv_temp;

                    select " + first + @"djsifra, djnaziv, round(sum(ordinacija),2) 
                    suma_ordinacija from djelatnost_izv_temp
                    group by 1,2 into temp djelatnost_izv_sum_temp;

                    update djelatnost_izv_temp set 
                    ordinacija=(select suma_ordinacija 
                    from djelatnost_izv_sum_temp 
                    where djelatnost_izv_sum_temp.djsifra=djelatnost_izv_temp.djsifra );

                    select " + first + @"dj.sifra djsifra, dj.naziv djnaziv,
                    trim (g.sifra) ||'-'|| trim(s.sifspr) sprema, 
                    round(sum(t.sati/40),2) sati_spreme
                    FROM eponudesb p
                    left join radiliste  r on r.eponudesb_id = p.id
                    left join djelzz dj on dj.id = r.djelzz_id
                    left join timrad t on t.radiliste_id=r.id
                    left join djelponude dp on dp.id=t.djelponude_id
                    left join strspr s on s.id=dp.strspr_id
                    left join zdrdje z on z.id=dp.zdrdje_id
                    left join tipzdpon ti on ti.id=dp.tipzdpon_id
                    left join grtippon g on ti.grtippon_id=g.id
                    where r.godina=2018 
                    and p.davzu_sif='004200420'
                    group by dj.sifra, dj.naziv, s.sifspr, g.sifra
                    order by dj.sifra, sprema
                    into temp struc_sprem_izv_temp;

                    select " + first + @"d.djsifra djsifra, d.djnaziv djnaziv, 
                    d.br_kreveta br_kreveta,
                    d.mjesta_bolnice mjesta_bolnice,
                    d.br_postupaka br_postupaka,
                    d.br_sala br_sala, d.ordinacija ordinacija,
                    s.sprema naziv_sprema, s. sati_spreme sati_spreme
                    from struc_sprem_izv_temp s
                    left join djelatnost_izv_temp d on d.djsifra=s.djsifra;
                    ";

                    dbcmd.CommandText = sql;
                    //dbcmd.Parameters.Add("@godina", OdbcType.Int).Value = godina;
                    //dbcmd.Parameters.Add("@davzu_sif", OdbcType.VarChar).Value = ust;

                    try
                    {
                        using (OdbcDataReader dbReader = dbcmd.ExecuteReader())
                        {
                            List<DjelatnostiSumarnoIzv> itl = new List<DjelatnostiSumarnoIzv>();

                            while (dbReader.Read())
                            {
                                DjelatnostiSumarnoIzv pspi = new DjelatnostiSumarnoIzv();

                                pspi.SifraDjelatnosti = DBHelper.GetOdbcString(dbReader, "djsifra", "", true, false);
                                pspi.NazivDjelatnosti = DBHelper.GetOdbcString(dbReader, "djnaziv", "", true, false);
                                pspi.BrojKreveta = DBHelper.GetOdbcNum(dbReader, "br_kreveta", (double)0);
                                pspi.BrojMjestaDnevneBolnice = DBHelper.GetOdbcNum(dbReader, "mjesta_bolnice", (double)0);
                                pspi.BrojPostupakaHemodijalize = DBHelper.GetOdbcNum(dbReader, "br_postupaka", (double)0);
                                pspi.BrojOperacijskihSala = DBHelper.GetOdbcNum(dbReader, "br_sala", (double)0);
                                pspi.BrojOrdinacija = DBHelper.GetOdbcNum(dbReader, "ordinacija", (double)0);
                                pspi.NazivStrucneSpreme = DBHelper.GetOdbcString(dbReader, "naziv_sprema", "", true, false);
                                pspi.SatiStrucneSpreme = DBHelper.GetOdbcNum(dbReader, "sati_spreme", (double)0);

                                itl.Add(pspi);

                            }

                            if (itl.Count > 0)
                            {
                                popis.Lista = itl.ToArray();
                                popis.OdgovorStatus = popis.Lista.Length;
                            }
                            else
                            {
                                popis.Odgovor = "";

                                popis.OdgovorStatus = 0;

                                LogSvcEvent(appid, sac, "NoRows", opmbo, null, popis.OdgovorStatus.ToString(), popis.Odgovor, 150);

                                return popis;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        popis.Odgovor = "Podatke nije moguće učitati.";

                        popis.OdgovorStatus = -102;

                        LogSvcEvent(appid, sac, "DataReadError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                        return popis;
                    }
                }

                LogSvcEvent(appid, sac, "Success", opmbo, null, dsnc, null, 100);

                return popis;
            }

        }

РЕДАКТИРОВАТЬ: Когда я выполняю эти команды SQL в сценарии DBeaver запускается без ошибок.Можно ли переписать запросы одним запросом?

1 Ответ

0 голосов
/ 18 декабря 2018

Я решил эту проблему, вызывая каждый запрос SQL один за другим.Это грязный способ сделать это, но это работает.Если у кого-то есть лучшее решение, пожалуйста, отправьте.Это метод:

    public SumarneDjelatnosti GetEPonudeDjelatnostiSumarnoList(String appid, String oper, Int16 godina)
    {
        //METODA
        // TODO: unit test GetEPonudeDjelatnostiSumarnoList

        SvcActContext sac = null;

        sac = InitCtx("GetEPonudeDjelatnostiSumarnoList");

        if (appid == null) { appid = ""; }

        oper = OperAlter(appid, sac, oper);

        SumarneDjelatnosti popis = new SumarneDjelatnosti();

        if (!SvcAccessAuth.AccessGranted(appid, sac))
        {
            popis.Odgovor = "Neovlašten pristup.";

            popis.OdgovorStatus = -100;

            LogSvcEvent(appid, sac, "UnauthorizedUse", oper, null, popis.OdgovorStatus.ToString(), popis.Odgovor, 200);

            return popis;
        }

        String dsnc = AppGlobals.DSNd;

        String opmbo = oper.Trim();
        String ust;

        EPonudaOperToken tok = new EPonudaOperToken();

        tok = _GetEPonudaSekOperOvl(appid, sac, oper);

        if (tok.OdgovorStatus < 0)
        {
            popis.Odgovor = tok.Odgovor;
            popis.OdgovorStatus = tok.OdgovorStatus;

            LogSvcEvent(appid, sac, "Error", oper, null, String.Format("GetEPonudaSekOperOvl: {0}, {1}", popis.OdgovorStatus, popis.Odgovor), null, 200);

            return popis;
        }
        ust = tok.DavzuSif;

        LogSvcEvent(appid, sac, "Begin", opmbo, null, dsnc, null, 50);

        using (OdbcConnection ocn = new OdbcConnection(AppGlobals.OdbcCString(true)))
        {
            try
            {
                ocn.Open();
            }
            catch (Exception ex)
            {
                popis.Odgovor = "Pristup bazi podataka nije moguć.";

                popis.OdgovorStatus = -101;

                LogSvcEvent(appid, sac, "DbAccessError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                return popis;
            }

            using (OdbcCommand dbcmd = ocn.CreateCommand())
            {
                String first = "";
#if DEBUG
                first = " first 25 ";
#endif
                String sql = @"
                select " + first + @" p.id, dj.sifra djsifra, dj.naziv djnaziv, 
                sum((case
                when r.krevet is null then r.brkrevk 
                when r.brkrevk is null then r.krevet
                else r.krevet+r.brkrevk
                end)) br_kreveta, 
                sum(r.mjesta) mjesta_bolnice,
                sum(r.postup) br_postupaka, sum(r.sala) br_sala, 
                round(sum(
                (case 
                when dj.sifra like '%1' then 1
                else r.sati/40
                end)
                ),2)  ordinacija
                FROM eponudesb p
                right join radiliste  r on r.eponudesb_id = p.id
                right join djelzz dj on dj.id = r.djelzz_id
                where r.godina=2018  
                and p.davzu_sif='004200420'
                group by p.id, dj.sifra, dj.naziv
                order by dj.sifra 
                into temp djelatnost_izv_temp;
                ";
                using (OdbcCommand dbcmd1 = ocn.CreateCommand())
                {                   
                    String sql1 = @"
                    select " + first + @"djsifra, djnaziv, round(sum(ordinacija),2) 
                    suma_ordinacija from djelatnost_izv_temp
                    group by 1,2 into temp djelatnost_izv_sum_temp;
                    ";
                    using (OdbcCommand dbcmd2 = ocn.CreateCommand())
                    {
                        String sql2 = @"
                        update djelatnost_izv_temp set 
                        ordinacija=(select suma_ordinacija 
                        from djelatnost_izv_sum_temp 
                        where djelatnost_izv_sum_temp.djsifra=djelatnost_izv_temp.djsifra );
                        ";
                        using (OdbcCommand dbcmd3 = ocn.CreateCommand())
                        {
                            String sql3 = @"
                            select " + first + @"dj.sifra djsifra, dj.naziv djnaziv,
                            trim (g.sifra) ||'-'|| trim(s.sifspr) sprema, 
                            round(sum(t.sati/40),2) sati_spreme
                            FROM eponudesb p
                            left join radiliste  r on r.eponudesb_id = p.id
                            left join djelzz dj on dj.id = r.djelzz_id
                            left join timrad t on t.radiliste_id=r.id
                            left join djelponude dp on dp.id=t.djelponude_id
                            left join strspr s on s.id=dp.strspr_id
                            left join zdrdje z on z.id=dp.zdrdje_id
                            left join tipzdpon ti on ti.id=dp.tipzdpon_id
                            left join grtippon g on ti.grtippon_id=g.id
                            where r.godina=2018 
                            and p.davzu_sif='004200420'
                            group by dj.sifra, dj.naziv, s.sifspr, g.sifra
                            order by dj.sifra, sprema
                            into temp struc_sprem_izv_temp;
                            ";
                            using (OdbcCommand dbcmd4 = ocn.CreateCommand())
                            {
                                String sql4 = @"
                                select " + first + @"d.djsifra djsifra, d.djnaziv djnaziv, 
                                d.br_kreveta br_kreveta,
                                d.mjesta_bolnice mjesta_bolnice,
                                d.br_postupaka br_postupaka,
                                d.br_sala br_sala, d.ordinacija ordinacija,
                                s.sprema naziv_sprema, s. sati_spreme sati_spreme
                                from struc_sprem_izv_temp s
                                left join djelatnost_izv_temp d on d.djsifra=s.djsifra;
                                ";
                                dbcmd.CommandText = sql;
                                dbcmd1.CommandText = sql1;
                                dbcmd2.CommandText = sql2;
                                dbcmd3.CommandText = sql3;
                                dbcmd4.CommandText = sql4;
                                //dbcmd.Parameters.Add("@godina", OdbcType.Int).Value = godina;
                                //dbcmd.Parameters.Add("@davzu_sif", OdbcType.VarChar).Value = ust;

                                try
                                {
                                    using (OdbcDataReader dbReader = dbcmd.ExecuteReader())
                                    {
                                        List<DjelatnostiSumarnoIzv> itl = new List<DjelatnostiSumarnoIzv>();
                                    try
                                    {
                                        using (OdbcDataReader dbReader1 = dbcmd1.ExecuteReader())
                                        {
                                            try
                                            {
                                                using (OdbcDataReader dbReader2 = dbcmd2.ExecuteReader())
                                                {
                                                    try
                                                    {
                                                        using (OdbcDataReader dbReader3 = dbcmd3.ExecuteReader())
                                                        {
                                                            try
                                                            {
                                                                using (OdbcDataReader dbReader4 = dbcmd4.ExecuteReader())
                                                                {
                                                                    while (dbReader4.Read())
                                                                    {
                                                                        DjelatnostiSumarnoIzv pspi = new DjelatnostiSumarnoIzv();

                                                                        pspi.SifraDjelatnosti = DBHelper.GetOdbcString(dbReader4, "djsifra", "", true, false);
                                                                        pspi.NazivDjelatnosti = DBHelper.GetOdbcString(dbReader4, "djnaziv", "", true, false);
                                                                        pspi.BrojKreveta = DBHelper.GetOdbcNum(dbReader4, "br_kreveta", (double)0);
                                                                        pspi.BrojMjestaDnevneBolnice = DBHelper.GetOdbcNum(dbReader4, "mjesta_bolnice", (double)0);
                                                                        pspi.BrojPostupakaHemodijalize = DBHelper.GetOdbcNum(dbReader4, "br_postupaka", (double)0);
                                                                        pspi.BrojOperacijskihSala = DBHelper.GetOdbcNum(dbReader4, "br_sala", (double)0);
                                                                        pspi.BrojOrdinacija = DBHelper.GetOdbcNum(dbReader4, "ordinacija", (double)0);
                                                                        pspi.NazivStrucneSpreme = DBHelper.GetOdbcString(dbReader4, "naziv_sprema", "", true, false);
                                                                        pspi.SatiStrucneSpreme = DBHelper.GetOdbcNum(dbReader4, "sati_spreme", (double)0);

                                                                        itl.Add(pspi);

                                                                        }

                                                                            if (itl.Count > 0)
                                                                            {
                                                                                popis.Lista = itl.ToArray();
                                                                                popis.OdgovorStatus = popis.Lista.Length;
                                                                            }
                                                                            else
                                                                            {
                                                                                popis.Odgovor = "";

                                                                                popis.OdgovorStatus = 0;

                                                                                LogSvcEvent(appid, sac, "NoRows", opmbo, null, popis.OdgovorStatus.ToString(), popis.Odgovor, 150);

                                                                                return popis;
                                                                            }
                                                                    }
                                                                }
                                                                catch (Exception ex)
                                                                {
                                                                    popis.Odgovor = "Podatke nije moguće učitati.[4.]";

                                                                    popis.OdgovorStatus = -102;

                                                                    LogSvcEvent(appid, sac, "DataReadError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                                                                    return popis;
                                                                }
                                                            }
                                                        }
                                                        catch (Exception ex)
                                                        {
                                                            popis.Odgovor = "Podatke nije moguće učitati.[3.]";

                                                            popis.OdgovorStatus = -102;

                                                            LogSvcEvent(appid, sac, "DataReadError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                                                            return popis;
                                                        }
                                                    }

                                                }
                                                catch (Exception ex)
                                                {
                                                    popis.Odgovor = "Podatke nije moguće učitati.[Update]";

                                                    popis.OdgovorStatus = -102;

                                                    LogSvcEvent(appid, sac, "DataReadError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                                                    return popis;
                                                }
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            popis.Odgovor = "Podatke nije moguće učitati.[2.]";

                                            popis.OdgovorStatus = -102;

                                            LogSvcEvent(appid, sac, "DataReadError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                                            return popis;
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    popis.Odgovor = "Podatke nije moguće učitati.";

                                    popis.OdgovorStatus = -102;

                                    LogSvcEvent(appid, sac, "DataReadError", opmbo, null, popis.OdgovorStatus.ToString(), ex.Message, 200);

                                    return popis;
                                }
                            }
                        }
                    }
                }
            }

            LogSvcEvent(appid, sac, "Success", opmbo, null, dsnc, null, 100);

            return popis;
        }

    }
...