Oracle управляемый доступ к данным и C# веб-приложение - PullRequest
0 голосов
/ 21 февраля 2020

Я вырываю волосы. У меня есть пакет Oracle, который использует оператор слияния (также пробовал обычный оператор обновления). Моя c# веб-прога отправляет параметры в процедуру. Я отладил и убедился, что соединение установлено правильно, параметры передаются, типы данных совпадают.

Я предоставил пользователю в webconfig доступ exe c к пакету.

Я даже предоставил пользователю возможность обновлять таблицу.

Если я использую встроенный SQL в программе C#, обновление будет выполнено.

Какие-нибудь мысли? За что это стоит ... Я ненавижу Oracle.

    PROCEDURE NAME_INSUPD_SITECOMMENT(SITEID IN INT, SITECOMMENTS IN VARCHAR2,
                                       LOCKID IN INT, EMPID IN INT)
    IS
    BEGIN
        MERGE INTO <TABLE>
        USING DUAL ON (SITE_ID = SITEID)
        WHEN MATCHED THEN        
            UPDATE
            SET
                SITE_COMMENTS = SITECOMMENTS,
                SITE_MODIFY_USER = EMPID,
                SITE_MODIFY_DATE = SYSDATE,
                LOCK_ID = LOCKID + 1
            WHERE
                SITE_ID = SITEID AND
                LOCK_ID = LOCKID
        WHEN NOT MATCHED THEN
            INSERT(SITE_COMMENTS,SITE_MODIFY_USER,SITE_MODIFY_DATE,LOCK_ID)
            VALUES(SITECOMMENTS,EMPID,SYSDATE,LOCKID);
    END NAME_INSUPD_SITECOMMENT;

C#
 internal static Site SaveSiteComment(Site s, int empId)
        {
            OracleConnection conn = ConnUtilities.GetOracleConnection("MyConnectionString");
            OracleCommand comm = new OracleCommand();

            comm.Connection = conn;
            //comm.CommandText = "PACKAGENAME.INSUPD_SITECOMMENT";
            //comm.CommandType = CommandType.StoredProcedure;
            comm.CommandText = "UPDATE <TABLE> SET SITE_COMMENTS = '" + s.SiteComments.Trim() +"', SITE_MODIFY_USER = " + empId + ",SITE_MODIFY_DATE = SYSDATE, LOCK_ID = " + s.LockId + " WHERE SITE_ID = " + s.Identifier + " AND LOCK_ID = " + s.LockId;
            comm.CommandType = CommandType.Text;

            comm.Parameters.Add(new OracleParameter("SITEID", OracleDbType.Int32, s.Identifier, ParameterDirection.Input));
            comm.Parameters.Add(new OracleParameter("SITECOMMENTS", OracleDbType.Varchar2, s.SiteComments.Trim(), ParameterDirection.Input));
            comm.Parameters.Add(new OracleParameter("LOCKID", OracleDbType.Int32, s.LockId, ParameterDirection.Input));
            comm.Parameters.Add(new OracleParameter("EMPID", OracleDbType.Int32, empId, ParameterDirection.Input));

            bool isNew = s.Identifier <= 0;

            try
            {
                conn.Open();

                comm.ExecuteNonQuery();
                conn.Close();

                s.SetClean();

                return s;
            }
            catch (OracleException ex)
            {
                conn.Close();
                conn.Dispose();
                comm.Dispose();

                return null;
            }
            finally
            {
                comm.Dispose();
                conn.Dispose();
            }

        }

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Вы добавляете OracleParameter s в команду, но на самом деле эти параметры не указаны в CommandText. Попробуйте это:

comm.CommandText = "UPDATE <TABLE> SET SITE_COMMENTS = :SITECOMMENTS, SITE_MODIFY_USER = :EMPID, SITE_MODIFY_DATE = SYSDATE WHERE SITE_ID = :SITEID";

(Примечание: я удалил материал LockId, потому что вы обновляли его до значения, которое уже было установлено)

0 голосов
/ 24 февраля 2020

Если я пренебрегал сообщением, насколько сильно Я презираю Oracle каждым волокном своего существа, позвольте мне выразить это решительно: Я НЕНАВИЖУ ЭТО. По крайней мере, 5 дюжин статей, примеров и даже всплесков и жесткое кодирование значений ... Я добавил FREAKING P_ ко всем параметрам, и это сработало. КОТОРЫЙ. ЯВЛЯЕТСЯ. ВСЕ. I. DID.

I. НЕНАВИДЕТЬ. ORACLE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...