2013-08-22 43 views
4

我有一個的投擲一個代碼行的ORA-00911:在C#中無效字符,而不是Oracle SQL Developer中

甲骨文例外 - ORA-00911:

當試圖無效字符以下C#代碼:

double tempDateTimeObj = Convert.ToDouble(someClass.GetTime(tempObjID, objStartTime, todayTime).Rows[0][0]); 

GETTIME是一個函數,使一個SQL調用發生在你上面看到的變量,SQL調用出入庫Oracle數字類型,然後GETTIME C#福nction每次返回一行的DataTableCollection Tables對象。

public static DataTable GetTime(string tempObjID, DateTime objStartTime, DateTime todayTime) 
{ 

    string sql = "select some_pkg.get_time('" + tempObjID + "', to_date('" + objStartTime + "', 'mm/dd/yyyy hh:mi:ss am'), to_date('" + todayTime + "', 'mm/dd/yyyy hh:mi:ss am')) from dual;"; 

    return <connection object>.getDS(sql).Tables[0]; 
} 

如果我調試,搶有變量的值的SQL字符串,並將其扔進的Oracle SQL Developer,它工作得很好,並返回在SQL開發控制檯的數字。但是,當我調試並遇到該行時,C#代碼會拋出00911異常。由於字符串sql已經在Oracle SQL Dev中測試過,所以語法應該是有效的。給定有效的語法,VS2010爲什麼會拋出這個錯誤/異常?

編輯: 這裏是什麼正在建在C#併發送至數據庫對象的樣本串:

select some_pkg.get_time('23569245', to_date('11/8/2012 1:21:06 PM', 'mm/dd/yyyy hh:mi:ss am'), to_date('12/31/2012 12:52:18 AM', 'mm/dd/yyyy hh:mi:ss am')) from dual 

有一個分號,並在C#中的字符串沒有分號已嘗試並導致相同的Oracle異常,儘管它們都在Oracle SQL中工作Dev

+0

'Kurt'爲什麼不創建存儲過程並使用參數化查詢 – MethodMan

+0

「存儲過程的主要目的是構建要加載到臨時表中的中間結果,然後在SELECT語句中查詢該臨時表。 ...可以使用表值函數來編寫EXEC語句。「 http://msdn.microsoft.com/en-us/library/ms187650.aspx 由於函數不使用中間結果,所以最好作爲函數而不是存儲過程。 –

回答

8

至少,您不希望從C#發送的SQL語句中出現尾隨分號。

我會強烈主張以及您使用綁定變量,而不是串聯您的SQL語句的字符串。這將會更有效率,它會阻止共享池相關的錯誤,它會讓你的DBA更加快樂,並且它會保護你免受SQL注入攻擊。

+0

刪除';'從C#發送的SQL語句中,仍然有相同的異常消息 –

+0

@KurtWagner - 然後問題出在你用來構建字符串的東西(這是使用綁定變量非常有用的一個原因)。如果你想避免使用綁定變量,你需要告訴我們你正在建立的是什麼字符串。你可以在執行它之前打印SQL語句嗎? –

+0

我附加了一個使用真實案例發送的示例字符串。 –

2

有同樣的問題,其他人是否有這個問題掙扎嘗試以下方法:

刪除「;」來自Visual Studio中的sqlSentence字符串。 「;」只是Oracle DB管理器的一部分來分隔句子,它不會在那裏工作(它被認爲是無效字符)

0

這是一個棘手的問題。 以下字符「,」在調試C#應用程序時從內聯SQL執行時產生錯誤。 它雖然從SQL Developer工作正常。 當「,」被更常規的逗號替換時,調試終於奏效,即「,」。