Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle ODP.NET及其参数_Oracle_Odp.net - Fatal编程技术网

Oracle ODP.NET及其参数

Oracle ODP.NET及其参数,oracle,odp.net,Oracle,Odp.net,我已经构建了一个通用的应用程序,可以与PostgreSQL一起使用,应该可以在Oracle上使用 然而,在通过参数化查询插入记录时,我遇到了奇怪的错误 我的格式化查询如下所示: ODPNetConnect odp = new ODPNetConnect(); if (!String.IsNullOrWhiteSpace(odp.ERROR)) { throw new Exception(odp.ERROR); } //Write: string sql = @"INSERT INTO

我已经构建了一个通用的应用程序,可以与PostgreSQL一起使用,应该可以在Oracle上使用

然而,在通过参数化查询插入记录时,我遇到了奇怪的错误

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

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);
}
“插入图层映射值(@lm_id、@lm_图层名称、@lm_图层文件);”

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

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

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


谢谢

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

您可以在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);
      ///...
   }
}
我做了这个

因此,您可以这样进行参数化写入和读取:

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);
}
您需要更改第123行以将环境设置为dev或prod

public OracleConnection GetConnection(string env = "dev", bool cacheOn = false)
我做了这个

因此,您可以这样进行参数化写入和读取:

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);
}
您需要更改第123行以将环境设置为dev或prod

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

谢谢你,乔希!插页怎么样?我不需要限定列名,是吗?这里真正的痛苦是BindByName。Npgsql不需要或不要求设置该变量!对于插入,您可以使用“插入到表名称值(:foo,:bar)”或“插入到表名称(foo,bar)值(:foo,:bar)”我更喜欢最后一种方式,以防将来表结构发生更改。谢谢:该死的BindByName!:谢谢你,乔希!插页怎么样?我不需要限定列名,是吗?这里真正的痛苦是BindByName。Npgsql不需要或不要求设置该变量!对于插入,您可以使用“插入到表名称值(:foo,:bar)”或“插入到表名称(foo,bar)值(:foo,:bar)”我更喜欢最后一种方式,以防将来表结构发生更改。谢谢:该死的BindByName!:P