我已经构建了一个适用于PostgreSQL的通用应用程序, 可以在Oracle上运行。
但是,当通过参数化查询插入记录时,我会遇到奇怪的错误。
我的格式化查询如下所示:
“INSERT INTO layer_mapping VALUES(@ lm_id,@ lm_layer_name,@ lm_layer_file);”
与记录如何使用参数的Npgsql不同,我无法找到Oracle如何“更喜欢”使用它们。我只能找到:1,:2,:3,例如。
我不想使用顺序参数,我想以命名的方式使用它们。
有办法吗?我做错了吗?
由于
答案 0 :(得分: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);
///...
}
}
答案 1 :(得分: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);
}
注意:您必须在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)