【发布时间】:2014-04-09 17:47:32
【问题描述】:
我在一个包中有以下存储过程:
PROCEDURE DELETE_RECORD(serial IN NUMBER, code IN NUMBER, brand IN VARCHAR2, response OUT VARCHAR2) IS
BEGIN
DELETE FROM CWPESME.cwpesme_campaign_subsc
WHERE
sku = serial
AND id = code
AND mfg = brand;
COMMIT;
response := 'SUCCESS';
EXCEPTION WHEN OTHERS THEN
response := 'FAILURE '||SQLERRM;
END DELETE_RECORD;
这是我从网络服务中调用它的方式:
[WebMethod]
public string del_record(int serial, int code, string brand)
{
using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["cs"].ConnectionString))
{
using (OracleCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "MyPackage.DELETE_RECORD";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("sku", OracleType.Number, 38).Direction = System.Data.ParameterDirection.Input;
cmd.Parameters["sku"].Value = serial;
cmd.Parameters.Add("id", OracleType.Number, 38).Direction = System.Data.ParameterDirection.Input;
cmd.Parameters["id"].Value = code;
cmd.Parameters.Add("mfg", OracleType.VarChar, 250).Direction = System.Data.ParameterDirection.Input;
cmd.Parameters["mfg"].Value = brand;
cmd.Parameters.Add("response", OracleType.VarChar, 550).Direction = System.Data.ParameterDirection.Output;
try
{
conn.Open();
cmd.ExecuteNonQuery();
string result = cmd.Parameters["response"].Value.ToString();
return result;
}
catch (Exception ex)
{
string result = cmd.Parameters["response"].Value.ToString();
return (result != string.Empty) ? result : "[FAILURE] " + ex.ToString();
}
}
}
}
如果我直接调用存储过程,我可以删除记录,但从 Web 服务调用时不能这样做。但是我可以通过这种方式SELECT 和UPDATE。发生了什么事?
【问题讨论】:
-
Web 服务以什么帐户运行(所以不需要知道这一点),它是否有权删除(但确实需要)?
-
不应该将 cmd.CommandText 设为“DELETE_RECORD”吗?
-
@tonyriddle 谢谢;我已经更正了占位符
-
@AustinSalonen 我尝试使用 IIS7 的默认用户以及 Visual Studio 2010 ASP.NET Web 开发服务器的用户运行 Web 服务。数据库用户有删除权限。
-
检查调用存储过程的账户。它可能没有执行删除的适当权限。
标签: c# .net oracle stored-procedures package