繁体   English   中英

Oracle 托管数据访问和 C# Web 应用程序

[英]Oracle Managed Data Access and C# web application

我正在拔头发。 我有一个使用合并语句的 Oracle 包(也尝试了普通的更新语句)。 我的 c# web prog 向程序发送参数。 我已经调试并确保连接正确,参数正在传递,数据类型匹配。

我已授予 webconfig 中的用户对该包的 exec 访问权限。

我什至已授予用户在表上进行更新。

如果我在 C# 程序中使用内联 SQL,则会执行更新。

有什么想法吗? 对于它的价值...我讨厌甲骨文。

    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();
            }

        }

您将OracleParameter添加到命令中,但实际上并没有在 CommandText 中指定这些参数。 尝试这个:

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

(注意:我已经删除了 LockId 的内容,因为您将其更新为已设置的值)

如果我忽略了用我身体的每一根纤维表达我多么鄙视 Oracle,让我强调:我讨厌它。

无论如何,2 FREAKING 天……至少有 5 打文章,示例,甚至打破和硬编码值……我在所有参数中添加了一个 FREAKING P_ 并且它起作用了。 那。 是。 全部。 I. 做到了。

我恨。 甲骨文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM