Ваш подход на самом деле не является "прямым путем", я бы сделал это так. Либо выберите таблицу напрямую:
var s1 = "select email, collegename, cgpa, compname from student_cv
where (cgpa >= :x and yearsofexp >= :y) and compname = :z";
OracleCommand comm = new OracleCommand(s1, conn);
comm.Parameters.Add("x", OracleType.Number).Value = comboBox1.Text;
comm.Parameters.Add("y", OracleType.Number).Value = comboBox2.Text;
comm.Parameters.Add("z", OracleType.VarChar2).Value = "some text";
OracleDataAdapter da = new OracleDataAdapter(comm);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
Вместо OracleDataAdapter
и OracleDataAdapter
вы также можете использовать OracleDataReader
:
OracleDataReader dr = comm.ExecuteReader();
while ( dr.Read() ) {
// loop through the rows and process the rows one-by-one
}
dr.close();
Другой способ - использовать функцию или процедуру, подобную этой:
create or replace FUNCTION cv (x in int, y in int, z in varchar2) RETURN SYS_REFCURSOR as
res SYS_REFCURSOR;
BEGIN
OPEN res FOR
select email, collegename, cgpa, compname
from student_cv
where (cgpa >= x and yearsofexp >= y) and compname = z;
RETURN res;
end;
А затем назовите его в C # следующим образом:
comm.CommandType = CommandType.Text;
comm.CommandText = "BEGIN :ret := cv(:x, :y, :z); END;";
comm.Parameters.Add("x", OracleType.Number).Value = comboBox1.Text;
comm.Parameters.Add("y", OracleType.Number).Value = comboBox2.Text;
comm.Parameters.Add("z", OracleType.VarChar2).Value = "some text";
comm.Parameters.Add("ret", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
OracleDataAdapter da = new OracleDataAdapter(comm);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
Конечно, вы также можете использовать OracleDataReader
, как указано выше.
Обратите внимание, у меня нет компьютера перед тестированием, поэтому, пожалуйста, прости меня, если я сделал одну или две опечатки в примерах кода.
Относительно вашего фактического сообщения об ошибке, убедитесь в правильном порядке:
- открыть соединение
- выполнить команду (или несколько команд)
- закрыть соединение
Поскольку OracleConnection
реализует IDisposal
, вы должны заключить его в using
следующим образом
using (var conn = new OracleConnection() ) {
conn.ConnectionString = "Data Source=...";
conn.Open();
// Code from above
conn.Close();
}
OracleDataReader
и OracleDataAdapter
также реализуют IDisposal
, поэтому он также должен быть заключен в using