Oracle 参数化查询 - 如何更改/删除/修改参数



这是我的场景:我使用简单的 c# winform 从我的数据库表中查询数据 - 我们称之为 XTable。 Winform有一个组合框,其中包含来自XTable的ACol列的不同值。 代码下方

查询:

select * from XTable where ACO = :param

C#

DataTable dt = new DataTable();
OracleDataReader odr;
StreamReader read = new StreamReader(@"C:tempquery.sql");
string zap = read.ReadToEnd();
OracleCommand ocom = new OracleCommand(zap, ocn);
ocom.Parameters.Add(":param", OracleDbType.Varchar2).Value = this.cmbError.text;
odr = ocom.ExecuteReader();
dt.Load(odr);

直到我从组合中选择一个标志值,它才能按预期工作。但我想在我的组合框值中添加第一个位置符号 *(星号)。星号表示:没有过滤器,从组合框中获取所有值。如何构建SQL查询以满足我的需求?

您将

有两个查询,一个在值*时查询,另一个在值与*不同时查询。我不知道你为什么要从SQL文件加载查询。这需要花费资源。最好把它写成字符串。

if(this.cmbError.text != "*")
    string sql = "select * from XTable where ACO = :param"
else
    string sql = "select * from XTable

并且仅当值与" *"不同时才应添加参数

if(this.cmbError.text != "*")
     ocom.Parameters.Add(":param", OracleDbType.Varchar2).Value = this.cmbError.text;

另外,如果您使用的是 StreamReaderOracleDataReader您必须处理它们!

您可以像这样执行此操作:

using(StreamReader reader = new StreamReader(@"C:tempquery.sql"))
{
}

这会自动调用Dispose,即使发生异常也是如此。如果你不把它包装在 using block中,你应该使用 try/catch/final。

try
{
       StreamReader reader = new StreamReader(@"C:tempquery.sql")
}
catch
{
       throw;
}
finally
{
    reader.Close();   // Close call dispose.
}

测试选定的索引 0 并像这样处理:

if(this.cmbError.SelectedIndex == -1 || this.cmbError.SelectedIndex == 0)
{
  ocom.Parameters.Add(":param", OracleDbType.Varchar2).Value = DB.Null;
}
else
{
 ocom.Parameters.Add(":param", OracleDbType.Varchar2).Value = 
    cmbError.text;
}

最新更新