[英]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.