Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

oracle/c# schema definities worden niet ververst

Pagina: 1
Acties:

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
Heren,

Ik heb een wazig oracle probleem icm de driver en c#

De schema definities van een net gemaakte tabel worden niet opnieuw opgehaald.
Na een drop en create worden de oude gegevens getoond.
Is dit een oracle fout?

Ik heb de volgende unittest gebouwd, en daar kwam ik helaas niet veel verder mee.

Kan iemand nog een lichtje schijnen?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string cs = "................";

    DataTable dt;

    using (var conn = new OracleConnection(cs))
    {
        conn.Open();

        using (var command = new OracleCommand("DROP TABLE TMP_RESULTS11", conn)) { try { command.ExecuteNonQuery(); } catch { } }

        using (var command = new OracleCommand("CREATE TABLE TMP_RESULTS11(ID NUMBER, DIRECTION CHAR(1000))", conn)) { command.ExecuteNonQuery(); }

        using (var command = new OracleCommand("INSERT INTO TMP_RESULTS11 VALUES(1, 'woei')", conn)) { command.ExecuteNonQuery(); }

        dt = new DataTable();
        using (var bla = new OracleDataAdapter("SELECT * FROM TMP_RESULTS11", conn)) { bla.Fill(dt); }

        //hier in 'dt' kijkend zie je netjes de goede schema definities
    
using (var command = new OracleCommand("DROP TABLE TMP_RESULTS11", conn)) { try { command.ExecuteNonQuery(); } catch { } }

        using (var command = new OracleCommand("create table TMP_RESULTS11(sleutel4 number, sleutel CHAR(100))", conn)) { command.ExecuteNonQuery(); }

        using (var command = new OracleCommand("INSERT INTO TMP_RESULTS11 VALUES(1, 'woei')", conn)) { command.ExecuteNonQuery(); }

        dt = new DataTable();
        using (var bla = new OracleDataAdapter("SELECT * FROM TMP_RESULTS11", conn)) { bla.Fill(dt); }

hier in dt kijkend zie je dezelfde definities

[ Voor 15% gewijzigd door BasieP op 21-03-2013 18:06 ]

This message was sent on 100% recyclable electrons.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik kan 't in ieder geval met de SQL Server driver niet reproduceren (of ik begrijp je probleem verkeerd):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Data;
using System.Data.SqlClient;

class Program
{
    static void Main(string[] args)
    {
        DataTable dt;
        using (var conn = new SqlConnection("Server=.\\SQLExpress;Database=Test;Trusted_Connection=True;"))
        {
            conn.Open();

            using (var command = new SqlCommand("DROP TABLE TMP_RESULTS11", conn)) { try { command.ExecuteNonQuery(); } catch { } }
            using (var command = new SqlCommand("CREATE TABLE TMP_RESULTS11(ID int, DIRECTION CHAR(1000))", conn)) { command.ExecuteNonQuery(); }
            using (var command = new SqlCommand("INSERT INTO TMP_RESULTS11 VALUES(1, 'woei')", conn)) { command.ExecuteNonQuery(); }

            dt = new DataTable();
            using (var bla = new SqlDataAdapter("SELECT * FROM TMP_RESULTS11", conn)) { bla.Fill(dt); }
            //hier in 'dt' kijkend zie je netjes de goede schema definities 

            using (var command = new SqlCommand("DROP TABLE TMP_RESULTS11", conn)) { try { command.ExecuteNonQuery(); } catch { } }
            using (var command = new SqlCommand("create table TMP_RESULTS11(sleutel4 int, sleutel CHAR(100))", conn)) { command.ExecuteNonQuery(); }
            using (var command = new SqlCommand("INSERT INTO TMP_RESULTS11 VALUES(1, 'woei')", conn)) { command.ExecuteNonQuery(); }

            dt = new DataTable();
            using (var bla = new SqlDataAdapter("SELECT * FROM TMP_RESULTS11", conn)) { bla.Fill(dt); }
            //hier in dt kijkend zie je de nieuwe definities
        }
    }
}


Doe eens gek en probeer 't eens zo:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
string cs = "................"; 

DataTable dt; 
using (var conn = new OracleConnection(cs)) 
{ 
    conn.Open(); 

    using (var command = new OracleCommand("DROP TABLE TMP_RESULTS11", conn)) { try { command.ExecuteNonQuery(); } catch { } } 
    using (var command = new OracleCommand("CREATE TABLE TMP_RESULTS11(ID NUMBER, DIRECTION CHAR(1000))", conn)) { command.ExecuteNonQuery(); } 
    using (var command = new OracleCommand("INSERT INTO TMP_RESULTS11 VALUES(1, 'woei')", conn)) { command.ExecuteNonQuery(); } 

    dt = new DataTable(); 
    using (var bla = new OracleDataAdapter("SELECT * FROM TMP_RESULTS11", conn)) { bla.Fill(dt); } 
    //hier in 'dt' kijkend zie je netjes de goede schema definities 
}
using (var conn = new OracleConnection(cs)) 
{ 
    conn.Open(); 

    using (var command = new OracleCommand("DROP TABLE TMP_RESULTS11", conn)) { try { command.ExecuteNonQuery(); } catch { } } 
    using (var command = new OracleCommand("create table TMP_RESULTS11(sleutel4 number, sleutel CHAR(100))", conn)) { command.ExecuteNonQuery(); } 
    using (var command = new OracleCommand("INSERT INTO TMP_RESULTS11 VALUES(1, 'woei')", conn)) { command.ExecuteNonQuery(); } 

    dt = new DataTable(); 
    using (var bla = new OracleDataAdapter("SELECT * FROM TMP_RESULTS11", conn)) { bla.Fill(dt); } 
    //En nu???
}

Zie regel 15 t/m 18

[ Voor 36% gewijzigd door RobIII op 21-03-2013 18:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
Ja dat was ook mijn eerste gedachte,

Het probleem deed zich eigenlijk voor ergens in de applicatie, en dit is al een gestripte versie van de situatie.
Wat we in de praktijk doen is voor elke query een nieuwe connectie openen (lees: connectionpooling)

Dus eigenlijk zou om elk command een using blokje staan met (var conn = new oracleconnection())


Dit hebben we ook in de test zoals in mijn startpost geprobeerd, maar dat leverde niets op.

We hebben ook al geprobeerd om tussen elk statement een commit te zetten...
Dat bracht ook geen oplossing :(

[ Voor 4% gewijzigd door BasieP op 21-03-2013 18:54 ]

This message was sent on 100% recyclable electrons.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
BasieP schreef op donderdag 21 maart 2013 @ 18:53:
...en dit is al een gestripte versie van de situatie.
Dat mag ik hopen ja :X :P
BasieP schreef op donderdag 21 maart 2013 @ 18:53:
Wat we in de praktijk doen is voor elke query een nieuwe connectie openen (lees: connectionpooling)
Wat, in principe, goed is.
BasieP schreef op donderdag 21 maart 2013 @ 18:53:
Dit hebben we ook in de test zoals in mijn startpost geprobeerd, maar dat leverde niets op.

We hebben ook al geprobeerd om tussen elk statement een commit te zetten...
Dat bracht ook geen oplossing :(
En al eens een oudere/nieuwere/andere versie van de driver/DB geprobeerd (als dat mogelijk is) of een alternatieve (als in: 3rd party) driver? Is het daarmee ook te reproduceren?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
RobIII schreef op donderdag 21 maart 2013 @ 18:57:
En al eens een oudere/nieuwere/andere versie van de driver/DB geprobeerd (als dat mogelijk is) of een alternatieve (als in: 3rd party) driver? Is het daarmee ook te reproduceren?
We hebben twee drivers geprobeerd. Een oracle 10 g driver waar ikzelf het meeste ervaring mee had, en de driver waar we het probleem in de eerste plaats op vonden wat een oracle 11 driver was.

DB was 11g, maar ik gok dat dit niet het probleem is...

Ik verdenk persoonlijk de driver of onderdelen ervan omdat als je het geheel als script in toad oid gooit gaat het goed.

edit:
iets concreter nog:
Ik verdenk de driver ervan schema info te cachen. Wanneer we een normaal query doen op systables van oracle dan krijgen we (natuurlijk) wel de goede waarden terug.

[ Voor 12% gewijzigd door BasieP op 21-03-2013 19:08 ]

This message was sent on 100% recyclable electrons.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je bent volgens mij in ieder geval niet alleen :P (maar daar wordt ook wel een andere driver gebruikt, dus dat lijkt me dan weer een indicatie dat 't toch aan de server-kant zou (kunnen) zitten).

Ik ben to-taal niet bekend met Oracle (in de zin van .Net drivers etc), maar er schijnt een MS implementatie te zijn van een "Oracle driver" (die zover ik zie deprecated is inmiddels), een "ODP.Net" van Oracle zelf en dan zijn er nog 3rd party drivers? Welke hebben we 't nu precies over? ODP.Net? Ik lees namelijk, in mijn korte zoektocht, 't woord "buggy" en "ODP.Net" stiekem best vaak in dezelfde zin. Maar dat is maar een eerste indruk; ik kan 't verkeerd hebben.

[ Voor 44% gewijzigd door RobIII op 21-03-2013 19:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
RobIII schreef op donderdag 21 maart 2013 @ 19:21:
Je bent volgens mij in ieder geval niet alleen :P (maar daar wordt ook wel een andere driver gebruikt, dus dat lijkt me dan weer een indicatie dat 't toch aan de server-kant zou (kunnen) zitten).

Ik ben to-taal niet bekend met Oracle (in de zin van .Net drivers etc), maar er schijnt een MS implementatie te zijn van een "Oracle driver" (die zover ik zie deprecated is inmiddels), een "ODP.Net" van Oracle zelf en dan zijn er nog 3rd party drivers? Welke hebben we 't nu precies over? ODP.Net? Ik lees namelijk, in mijn korte zoektocht, 't woord "buggy" en "ODP.Net" stiekem best vaak in dezelfde zin. Maar dat is maar een eerste indruk; ik kan 't verkeerd hebben.
ah kijk.. ik vond het lastig om zoekwoorden te vinden voor google, maar 't lukt zo toch.

In .NET (3.5 iig) zit inderdaad by default een Oracle driver. Ik weet niet voor welke versie, maar die gebruiken we in ieder geval niet.

Beide drivers komen uit de driver bundle van oracle zelf.
Tijdens de install geef je middels een vinkje aan dat je ook de .NET driver wilt installeren. Dit is gewoon een .NET dll als wrapper om hun eigen c++ dll's die onderdeel zijn van de driver.

Je moet dus wanneer je een applicatie uitlevert met zo'n .NET dll van oracle exact diezelfde driver geinstalleerd hebben.
Of je applicatie uitleveren op 'een Oracle.DataAccess.dll' (die .NET wrapper) en hopen dat het goed komt.
Maargoed dat is een ander verhaal.

De third party drivers heb ik me nog nooit aan gewaagd..

Grappig dat in de link die je poste (deze dus) ze een oleDb driver gebruiken. Zou het idd toch een server side probleem kunnen zijn

ow en check deze comment
metadata cache broken

[ Voor 4% gewijzigd door BasieP op 21-03-2013 20:21 ]

This message was sent on 100% recyclable electrons.

Pagina: 1