这是我的场景:我使用简单的 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;
另外,如果您使用的是 StreamReader
,OracleDataReader
您必须处理它们!
您可以像这样执行此操作:
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;
}