2010-03-02 51 views
0

我已經構建了一個適用於PostgreSQL的通用應用程序,並且應該適用於Oracle。ODP.NET和參數

但是,當通過參數化查詢插入記錄時,我收到了奇怪的錯誤。

我格式化的查詢看起來是這樣的:

「INSERT INTO layer_mapping VALUES(@ lm_id,@ lm_layer_name,@ lm_layer_file);」

與Npgsql不同,它記錄瞭如何使用這些參數,但我無法找到Oracle如何「偏好」使用它們。例如,我只能找到:1,:2,:3。

我不想使用順序參數,我想以命名的方式使用它們。

有沒有辦法做到這一點?難道我做錯了什麼?

感謝

回答

5

可以使用指定的參數與ODP.NET像這樣:

using (var cx=new OracleConnection(connString)){ 
    using(var cmd=cx.CreateCommand()){ 
     cmd.CommandText="Select * from foo_table where bar=:bar"; 
     cmd.BindByName=true; 
     cmd.Parameters.Add("bar",barValue); 
     ///... 
    } 
} 
+0

謝謝喬希!怎麼樣插入?我不需要限制列名稱,是嗎? 這裏真正的痛苦就是那個BindByName。 Npgsql不需要或需要設置該變量! – 2010-03-02 20:04:48

+0

對於插入,您可以使用「INSERT INTO table_name values(:foo,:bar)」或「INSERT INTO table_name(foo,bar)values(:foo,:bar)」 我更喜歡錶格結構未來的變化。 – 2010-03-02 20:06:49

+0

謝謝:D Darn那BindByName! :P – 2010-03-02 20:07:31

0

我做了這個LIB https://github.com/pedro-muniz/ODPNetConnect/blob/master/ODPNetConnect.cs

所以你可以做參數寫入和讀出這樣的:

ODPNetConnect odp = new ODPNetConnect(); 
if (!String.IsNullOrWhiteSpace(odp.ERROR)) 
{ 
    throw new Exception(odp.ERROR); 
} 

//Write: 
string sql = @"INSERT INTO TABLE (D1, D2, D3) VALUES (:D1, :D2, :D3)"; 

Dictionary<string, object> params = new Dictionary<string, object>(); 
params["D1"] = "D1"; 
params["D2"] = "D2"; 
params["D3"] = "D3"; 

int affectedRows = odp.ParameterizedWrite(sql, params); 

if (!String.IsNullOrWhiteSpace(odp.ERROR)) 
{ 
    throw new Exception(odp.ERROR); 
} 

//read 
string sql = @"SELECT * FROM TABLE WHERE D1 = :D1"; 

Dictionary<string, object> params = new Dictionary<string, object>(); 
params["D1"] = "D1"; 

DataTable dt = odp.ParameterizedRead(sql, params); 
if (!String.IsNullOrWhiteSpace(odp.ERROR)) 
{ 
    throw new Exception(odp.ERROR); 
} 

注意:您必須在ODPN中更改這些行etConnect.cs設置連接字符串:

static private string devConnectionString = "SET YOUR DEV CONNECTION STRING"; 
static private string productionConnectionString = "SET YOUR PRODUCTION CONNECTION STRING"; 

而且您需要更改第123行以將環境設置爲dev或prod。

public OracleConnection GetConnection(string env = "dev", bool cacheOn = false)