2016-03-21 28 views
0

Verilerimi depolamak için TimesTen DB'yi kullanarak uygulamam. Aşağıda verileri güncellemek ve güncellenmiş bir satır döndürmek kodum.ODP.NET: Verileri dinamik sql'den veri kümesine nasıl alabilirim

conn = new OracleConnection("My Connection"); 
conn.Open(); 
OracleTransaction tran = conn.BeginTransaction(IsolationLevel.ReadCommitted); 
OracleCommand command = new OracleCommand(); 

command = new OracleCommand(@"DECLARE idNo NUMBER; 
BEGIN 
select id into idNo from " + prefix_db + @"tbl_request_in where upper(status)='PENDING' and ROWNUM <= 1 order by priority, id FOR update; 
update " + prefix_db + @"tbl_request_in set status ='Processing',begin_time= SYSDATE(),response_node='10.9.70.47' 
where upper(status) <> 'PROCESS' and upper(status) <> 'PROCESSING' and upper(status) <> 'OK' and upper(status)<>'ERROR' 
and id=idNo; 
OPEN :RETURNCURSOR for select * from APITT_tbl_request_in where id=idNo; 
END;", conn); 

command.Transaction = tran; 
command.BindByName = true; 
OracleParameter outNumPrm = command.Parameters.Add("RETURNCURSOR", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.ReturnValue); 

// create a data adapter to use with the data set 
OracleDataAdapter da = new OracleDataAdapter(command); 

// create the data set 
DataSet ds = new DataSet(); 

// fill the data set 
da.Fill(ds); 

ve hata

{Oracle.DataAccess.Client.OracleException ORA-01722 verir: Geçersiz sayıda
Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 de Parametreler errCode, OracleConnection komuta IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Oracle.DataAccess.Client.OracleException.HandleError (Int32 ERRCODE, OracleConnection baðlant, ıntptr opsErrCtx, Nesne src, Boolean bcheck de Nesne src, dize prosedürü, Boole bcheck) ) System.Data.Common.DataAdapter.FillFromReader de System.Data.Common.DataAdapter.FillLoadDataRow (SchemaMapping eşleme) de Oracle.DataAccess.Client.OracleDataReader.Read() (DataSet veri kümesi, DataTable Datatable String srcTable, DataReaderContainer de Oracle.DataAccess.Client de System.Data.Common.DataAdapter.Fill (DataSet veri kümesi, dize srcTable, IDataReader datareader, ınt32 startRecord, Int32 maxrecords) de datareader, ınt32 startRecord, ınt32 maxrecords, DataColumn parentChapterColumn, parentChapterValue Nesne) .OracleDataAdapter.Fill (DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) Oracle.DataAccess.Client.OracleDataAdapter.Fill (DataSet veri) Set, Int32 startRecord, Int32 maxrecords, System.Data.Common.DbDataAdapter.Fill de dize srcTable, IDbCommand komutu, CommandBehavior davranış) (DataSet veri kümesi)

Bunu nasıl çözebilirim?

+0

Aynı SQL, kullandığınız SQL araçlarında çalışır mı? –

+0

sql geliştirici aracını kullanıyorum ve sorgu çalışmam tamam –

+0

Parametrenin "ParameterDirection.Output" tür değeri –

cevap

0

Anonim bir PL/SQL bloğu herhangi bir değer döndüremiyor. Böyle bir işlevi yazın: Eğer veritabanında işlevi oluşturun yapamıyorsanız

DataTable dt = new DataTable(); 
OracleCommand command = new OracleCommand(@"BEGIN :RETURNCURSOR := APITT_tbl_request(:prefix_db); END;"); 
command.CommandType = CommandType.Text; 
command.Parameters.Add("RETURNCURSOR", OracleDbType.RefCursor, ParameterDirection.ReturnValue); 
command.Parameters.Add("prefix_db", OracleDbType.Varchar2, ParameterDirection.Input).Value = prefix_db; 
OracleDataAdapter da = new OracleDataAdapter(command); 
da.Fill(dt); 

gibi bu fonksiyonu

CREATE OR REPLACE FUNCTION APITT_tbl_request(prefix_db IN VARCHAR2) RETURN SYS_REFCURSOR AS 
    idNo NUMBER; 
    res SYS_REFCURSOR; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT ID ' 
     ||'FROM '|| prefix_db || 'tbl_request_in ' 
     ||'WHERE UPPER(status)=''PENDING'' AND ROWNUM <= 1 ORDER BY priority, ID FOR UPDATE' 
    INTO idNo; 

    EXECUTE IMMEDIATE 'UPDATE '|| prefix_db || 'tbl_request_in SET status =''Processing'', begin_time= :bt, response_node=''10.9.70.47'' ' 
     ||'WHERE UPPER(status) <> ''PROCESS'' AND UPPER(status) <> ''PROCESSING'' AND UPPER(status) <> ''OK'' AND UPPER(status)<>''ERROR'' AND ID= :id' 
    USING SYSDATE, idNo 

    OPEN res FOR SELECT * FROM APITT_tbl_request_in WHERE ID=idNo; 
    RETURN res; 
END; 

ve çağrı işlevi gövdesi dize APITT_tbl_request(:prefix_db); yerine çalışıyorum ama bilmiyorum eğer bu işe yarıyorsa.

+0

Kodunuz tarafından çalıştırıyorum, hata gösteriliyor {System.InvalidOperationException: Nesne şu anki durumu nedeniyle işlem geçerli değil. Oracle'da .DataAccess.Client.OracleCommand.ExecuteReader (Boolean requery, Boolean fillRequest , CommandBehavior davranışları)Oracle.DataAccess.Client.OracleDataAdapter.Fill (DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand komutu, CommandBehavior davranışı), System.Data.Common.DbDataAdapter.Fill (DataSet dataSet) adresindeki AsyncQueue.ProcessQueue adresindeki.ProcessQueue.cs içinde Proses(): satır 164} –

+0

Eğer Connection açtınız mı? –

+0

Evet, bağlantı, 'command.ExecuteNonQuery()' koştunuz mu –

İlgili konular