【问题标题】:ODP.NET and parametersODP.NET 和参数
【发布时间】:2010-03-02 19:48:06
【问题描述】:

我已经构建了一个适用于 PostgreSQL 的通用应用程序,应该在 Oracle 上运行。

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

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

"插入到 layer_mapping VALUES (@lm_id,@lm_layer_name,@lm_layer_file);"

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

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

有办法吗?我是不是做错了什么?

谢谢

【问题讨论】:

    标签: oracle odp.net


    【解决方案1】:

    您可以像这样在 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);
          ///...
       }
    }
    

    【讨论】:

    • 谢谢乔希!插入呢?我不需要限定列名,是吗?这里真正的痛苦是BindByName。 Npgsql 不需要或不需要设置该变量!
    • 对于插入,您可以使用“INSERT INTO table_name values(:foo,:bar)”或“INSERT INTO table_name(foo,bar) values(:foo,:bar)”我更喜欢最后一种方式以防将来表结构发生变化。
    • 谢谢:D该死的BindByName! :P
    【解决方案2】:

    我创建了这个库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)
    

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 2014-12-27
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多