2010-11-13 84 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