2010-11-13 54 views
2

我试图从C#应用程序中的Oracle Express数据库使用存储的功能。使用SQL存储函数给出了无效的SQL语句

OdbcCommand com = new OdbcCommand("SILNIA",sqlConn); 
com.CommandType = CommandType.StoredProcedure; 

OdbcParameter sqlParam = new OdbcParameter("@ReturnValue", OdbcType.Int); 
sqlParam.Direction = ParameterDirection.ReturnValue; 
com.Parameters.Add(sqlParam); 
com.ExecuteNonQuery(); 

label1.Content = com.Parameters["@ReturnValue"].Value.ToString(); 

其中SILNIA功能(编译没有错误)的定义是:

create or replace 
FUNCTION SILNIA RETURN NUMBER IS 
w NUMBER := 1; 
BEGIN 
for i in 1..5 loop 
w:=w*i; 
end loop; 

RETURN w; 
END SILNIA; 

在线:

com.ExecuteNonQuery(); 

我得到

ERROR [42000] [Microsoft][ODBC driver for Oracle][Oracle]ORA-00900: invalid SQL statement. 

但是这部作品的作品没有任何问题:

OdbcCommand sqlCom = new OdbcCommand("SELECT SILNIA() FROM DUAL", sqlConn); 
label1.Content = sqlCom.ExecuteScalar().ToString(); 

回答

1

您不能使用ExecuteNonQuery()来运行SP。您必须执行其他操作 - ExecuteScalar或ExecuteReader

这是因为ExecuteNonQuery()被设计为仅适用于UPDATE,INSERT和DELETE语句。

+0

我都试过OdbcDataReader R = com.ExecuteReader();和label1.Content =(string)com.ExecuteScalar();而不是com.ExecuteNonQuery();并发生相同的错误。 – mmatloka 2010-11-13 22:21:30

+1

你确定你不能为SP运行ExecuteNonQuery()?我相当有信心你可以称之为... – mint 2010-11-16 20:10:35

0

你的函数接受任何参数 - 试试这个:

SELECT SILNIA FROM DUAL