0

我已经构建了一个适用于 PostgreSQL 并且应该适用于 Oracle 的通用应用程序。

但是,通过参数化查询插入记录时,我遇到了奇怪的错误。

我的格式化查询如下所示:

“插入图层映射值(@lm_id,@lm_layer_name,@lm_layer_file);”

与记录如何使用参数的 Npgsql 不同,我找不到 Oracle 如何“更喜欢”使用它们。例如,我只能找到:1、:2、:3。

我不想使用顺序参数,我想以命名方式使用它们。

有没有办法做到这一点?难道我做错了什么?

谢谢

4

2 回答 2

6

您可以像这样在 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);
      ///...
   }
}
于 2010-03-02T20:03:19.360 回答
0

我制作了这个库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);
}

注意:您必须在 ODPNetConnect.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)
于 2016-03-29T17:59:45.307 回答