2010-03-02 57 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)