Я вырываю волосы. У меня есть пакет 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();
}
}