2009-05-01 120 views
1

我使用Microsoft ODBC for Oracle驅動程序成功連接到Oracle 10g數據庫。將參數與Oracle ODBC連接使用

不帶參數定期查詢做工精細,但如果這些參數都沒有得到傳入的參數化查詢行事。

前。

--this works fine 
Select * from tbl1 where column1 = 'test' 

--this doesn't 
select * from tbl1 where column1 = ? 

--odbc string parameter 'test' 

這裏是我的連接字符串的樣子:

"Driver={Microsoft ODBC for Oracle}; " & _ 
"CONNECTSTRING=(DESCRIPTION=" & _ 
"(ADDRESS=(PROTOCOL=TCP)" & _ 
"(HOST=" & pstrServer & ")(PORT=" & pintPort.ToString & "))" & _ 
"(CONNECT_DATA=(SERVICE_NAME=" & pstrPhysicalName & "))); " & _ 
"uid=" & pstrUserName & ";pwd=" & pstrPassword & ";" 

而且我喜歡這個參數添加到我的ODBC命令:

arrOdbcParam(index) = New OdbcParameter("@paramName", paramValue) 

... 

cmd.Parameters.AddRange(arrOdbcParam) 

原諒partialy複製,有些pseuedo代碼。

回答

5

位,但因爲我只是一個類似的問題掙扎,這裏是它如何與ODBC驅動程序進行的Centura SQLBase工作:

OdbcCommand com = con.CreateCommand(); 
com.CommandText = @" 
    SELECT thing 
    FROM table 
    WHERE searchInt = ? AND searchDat = ?"; 
com.Parameters.Add(new OdbcParameter("", OdbcType.Int)).Value = 12345; 
com.Parameters.Add(new OdbcParameter("", OdbcType.DateTime)).Value = DateTime.Now; 
OdbcDataReader reader = com.ExecuteReader(); 

該搜索中的「表」的記錄「searchInt」中的值爲12345,「serachDat」中的值爲今天的日期。
注意事項:

  • 參數在 SQL命令
  • 參數不需要名稱標記爲?, 但位置(和正確的類型)是 重要
+0

找到了這個解決方案,它爲我工作,爲未來的訪問者找到這個問題的一個筆記:我在我的where標準(其中mystring ='?')使用單個滴答聲;你不需要它們。(請注意,提問者也沒有使用它們。)(斯蒂芬,這實際上與你的答案沒有任何關係) – 2012-05-10 15:02:29

1

嘗試使用「:paramName」而不是「paramName」。

+0

我的參數名稱通常是@paramName。是:paramName是一個Oracle語法?我通常更多地使用SQL Server,所以我對Oracle語法的一些變體是新手的。 – Gaidin 2009-05-01 14:28:35

+0

仍然不能使用:paramName – Gaidin 2009-05-01 14:30:39

2

ODBC參數(標記爲?)受位置約束,因此您必須確保按照正確的順序添加OdbcParameter。他們的名字是不重要的,但我會建議paramName,而不是@這是一個SQL Server(或,而不是微軟)特定的名稱格式。

您也可以嘗試使用Oracle參數格式,它應該由Microsoft ODBC對Oracle驅動程序來識別並允許您通過名字綁定,而不是(不是100%肯定這一點,雖然):

  • 在您的查詢中用:paramName替換?
  • 命名您的參數paramName。 necromancing這裏的
+0

剛剛嘗試過這一點,但它仍然無效。我不斷收到「並非所有變量都受到約束」。 – Gaidin 2009-05-07 15:35:11

+0

對於Oracle,您不能使用Microsoft ODBC的命名參數。該參數必須使用「?」指定並以正確的順序添加參數。嘗試使用AddWidthValue(「」,paramValue)而不是AddRange()。 – Liao 2009-12-16 07:59:09