Jak wykonać polecenia na bazie danych oracle w C#

0

Muszę napisać program który spełniał poniższe wymogi
Połączenie z bazą danych
Pobieranie wierszy z bazy danych
wstawianie wierszy do bazy
modyfikacja wierszy
obsługa wartości NULL
sterowanie transakcjami baz danych (możliwość cofnięcia zmian)
Czy ktoś zna poradniki, strony które pomagają mi zrobić to zadanie?

0

No możesz użyć ADO.NET albo jakiegoś ORMa, tak czy siak potrzebujesz biblioteki do obsługi baz Oracle w .NET, do znalezienia pewno na ich stronie.

0

A można coś dokładniej? Jakiś tutoial może ktoś widział w necie albo przykład?

0

Ja pobrałem sobie "Oracle Data Access Components" http://www.oracle.com/partners/campaign/utilsoft-086879.html
A dalej to już z górki.

Połączenie:

OracleConnection connection = new OracleConnection();

connection.ConnectionString = "Data Source=(DESCRIPTION = " +
    "(ADDRESS = (PROTOCOL = TCP)(HOST = " + IP + ")(PORT = " + Port + "))" +
    "(CONNECT_DATA =" +
    "(SERVER = DEDICATED)" +
    "(SERVICE_NAME = " + ConnectionServiceName + "))" +
    ");User ID=" + UserID + ";Password=" + Passwd + ";";

onnection.Open();

Jakiś insert:

OracleCommand command = new OracleCommand("Insert into " + DBName + ".tabela (OBJNAME) values (:OBJNAME)", connection);
                command.Parameters.Add("GROUPID", "Przykladowa nazwa grupy");
                int result = command.ExecuteNonQuery();

Reszta z tego co pisałeś jest prosta. Tylko transakcji nie robiłem, więc tutaj nie pomogę.

Co do wartości NULL to gdzieś (chyba nawet na tym forum) znalazłem fajne metody:

public static string SafeGetString(OracleDataReader reader, int colIndex)
        {
            if (!reader.IsDBNull(colIndex))
                return reader.GetString(colIndex);
            else
                return string.Empty;
        }

        public static int? SafeGetInt(OracleDataReader reader, int colIndex)
        {
            if (!reader.IsDBNull(colIndex))
            {
                return Convert.ToInt32(reader[colIndex].ToString());
            }
            else
                return null;
        }

I jak sobie robię SELECT, to z nich korzystam

OracleDataReader dr = null;

                try
                {
                    command = new OracleCommand("SELECT intVal, stringVal FROM tabela WHERE ob = :ob", connection);
                    command.Prepare();
                    command.Parameters.Add("@ob", 1));

                    dr = command.ExecuteReader();

                    while (dr.Read())
                    {
                         int? intValue = SafeGetInt(dr, 1);
                        string stringcalue = SafeGetInt(dr, 2);
                   }
              }catch(Exception)
               {
                     //obsługa błedu
               }

0

Po linii najmniejszego oporu ("żeby działało") to będzie zrobienie tego przez ADO.NET warstwę połączeniową.
W C# są gotowe dedykowane typy dla Oracla, np. OracleConnection, OracleCommand, które widzisz w poście wyżej. Jeżeli masz bardziej ambitne plany, możesz wykorzystać właśnie ORM jak EF czy nHibernate

0

Użycie ORMa to nie jest kwestia ambicji tylko braku czasu na wynajdowanie koła na nowo.

0

Mam problem

"An unhandled exception of type 'System.BadImageFormatException' occurred in System.Windows.Forms.dll
Additional information: Nie można załadować pliku lub zestawu 'Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342' lub jednej z jego zależności. Próbowano załadować program w niepoprawnym formacie."

 
using Oracle.DataAccess.Client;


        private void button1_Click(object sender, EventArgs e)
        {
            OracleConnection conn = new OracleConnection();
            conn.ConnectionString = "Data Source=(DESCRIPTION = " +
                "(ADDRESS = (PROTOCOL = TCP)(HOST = " + textBox1.Text + ")(PORT = " + textBox2.Text + "))" +
                "(CONNECT_DATA =" +
                "(SERVER = DEDICATED)" +
                "(SERVICE_NAME = " + textBox3.Text + "))" +
                "); User ID=" + textBox4.Text + ";Password=" + textBox5.Text + ";";
            conn.Open();


            OracleCommand cmd = new OracleCommand("SELECT * FROM departments", conn);
            cmd.CommandType = CommandType.Text;

            OracleDataReader dr = cmd.ExecuteReader();
            dr.Read();
            MessageBox.Show(conn.State.ToString());

            while (dr.Read())
            {
                listBox1.Items.Add(dr.GetString(0));
            }
 }

Ogólnie chciałbym wrzucić tabele do dataGridView.

1

Kompilujesz nie w tej konfiguracji, w której jest Oracle.DataAccess. Spraw, aby wszystko było w x64 albo x86.

0

Spoko, po 1,5 godzinie do tego doszedłem. Zmieniłem w opcjach projektu żeby uruchamiał się w systemie 32bit. Teraz mam inny problem przy "conn.Open();"

An unhandled exception of type 'System.NullReferenceException' occurred in Oracle.DataAccess.dll
Additional information: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

 
            OracleConnection conn = new OracleConnection();
            conn.ConnectionString = "Data Source=(DESCRIPTION = " +
                "(ADDRESS = (PROTOCOL = TCP)(HOST = " + textBox1.Text + ")(PORT = " + textBox2.Text + "))" +
                "(CONNECT_DATA =" +
                "(SERVER = DEDICATED)" +
                "(SERVICE_NAME = " + textBox3.Text + "))" +
                "); User ID=" + textBox4.Text + ";Password=" + textBox5.Text + ";";
            conn.Open();
0

Coś mam z wersją Oracle.DataAccess.dll nie umiem dojść co jest nie tak. Może miał ktoś taki błąd?

0

Niechcący wpisalem się w komentarzu wyżej :-) chodzi o to, ze ten błąd może powoduje niewypelniony textbox ?

0

Dalej jest ten sam błąd po wpisaniu danych.

            OracleConnection conn = new OracleConnection();
            conn.ConnectionString = "Data Source=(DESCRIPTION = " +
                "(ADDRESS = (PROTOCOL = TCP)(HOST = 155.159.113.45)(PORT = 1521))" +
                "(CONNECT_DATA =" +
                "(SERVER = DEDICATED)" +
                "(SERVICE_NAME = oltpstud))" +
                "); User ID= user;Password= haslo";
            conn.Open();
0

jesteś pewny, że ten błąd powstaje przy conn.Open(); ?

0

Tak.

0

Kod który przedstawiles nie powinien zrzucić tego błędu. Czy możesz wrzucić do załącznika swoją aplikację lub nowy projekt ograniczony tylko do polaczenia do bazy ?

0

Wrzucę kolo godz 15.

0

W załączniku mój program. Na razie tylko próbowałem się połączyć bazą nic więcej tam nie ma. Hasło i login usunąłem.

0

nie wiem czy to ma znaczenie ale na Twojej bibliotece Oracle.DataAccess.dll dostaję błąd :

{"Inicjator typów zgłosił wyjątek dla typu 'Oracle.DataAccess.Client.OracleConnection'."}
Nie można załadować biblioteki DLL 'OraOps12.dll': Nie można odnaleźć określonego modułu. (Wyjątek od HRESULT: 0x8007007E)

wywaliłem Twoją bibliotekę Oracle.DataAccess dołączoną do projektu i dodałem jeszcze raz referencję - teraz u mnie działa.
W załączniku jest wersja z moją biblioteką

0

A jak to mogę naprawić u siebie?

0

sprawdź mój załącznik u siebie - czy zadziała.

0

Teraz mi wyskakuje błąd przy "OracleConnection conn = new OracleConnection();"

An unhandled exception of type 'System.TypeInitializationException' occurred in or.exe
Additional information: Inicjator typów zgłosił wyjątek dla typu 'Oracle.DataAccess.Client.OracleConnection'.

0

czyli masz to samo, co ja miałem, gdy uruchomiłem Twój projekt. Widocznie problem nie jest w wersji dll-ki.
Jeśli chodzi o wcześniejszy błąd :
An unhandled exception of type 'System.NullReferenceException' occurred in Oracle.DataAccess.dll
to w szczegółach (View detail) masz więcej informacji czego dotyczy ten błąd ?

0

W załączniku screen
Przechwytywanie.JPG

Wyjątek System.NullReferenceException nie został obsłużony
HResult=-2147467261
Message=Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.
Source=Oracle.DataAccess
StackTrace:
w Oracle.DataAccess.Client.OracleConnection.Open()
w or.Form1.button1_Click(Object sender, EventArgs e) w d:\Projekty Visual Studio 2013\or\or\Form1.cs:wiersz 39
w System.Windows.Forms.Control.OnClick(EventArgs e)
w System.Windows.Forms.Button.OnClick(EventArgs e)
w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
w System.Windows.Forms.Control.WndProc(Message& m)
w System.Windows.Forms.ButtonBase.WndProc(Message& m)
w System.Windows.Forms.Button.WndProc(Message& m)
w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
w System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
w System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
w System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
w System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
w System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
w System.Windows.Forms.Application.Run(Form mainForm)
w or.Program.Main() w d:\Projekty Visual Studio 2013\or\or\Program.cs:wiersz 18
w System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
w System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
w Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
w System.Threading.ThreadHelper.ThreadStart_Context(Object state)
w System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
w System.Threading.ThreadHelper.ThreadStart()
InnerException:

0

Zorientuj się czy masz bibliotekę 32 czy 64 bit.
Podejrzewam że masz 32 a samo rozwiązanie jest pod 64.
Wejdź w ustawienia projektu i zmień aby kompilowało do 32.

Powinno pomóc.

0

Tak mam na 32. Dlatego ustawiłem kompilację na 32bit. Jak mam na 64 to wyskakuje błąd

An unhandled exception of type 'System.BadImageFormatException' occurred in System.Windows.Forms.dll
Additional information: Nie można załadować pliku lub zestawu 'Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342' lub jednej z jego zależności. Próbowano załadować program w niepoprawnym formacie.

Jest biblioteka na 64bit system? Nie umiałem znaleźć. Z instrukcji instalacji wywnioskowałem, że to jest też wersja dla systemu 64bitowego.

0

Jest, wala się po necie, np. tutaj: http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html

A teraz po kolei.

  1. Baza jest 32 czy 64 bit? Bo od tego trzeba zacząć.
    Jak to ustalisz, to będziesz wiedział jakie biblioteki u siebie zastosować. Nie sprawdzałem (bo słyszałem że nie) czy jak baza jest 64 to śmigają biblioteki 32.

  2. Głupie pytanie, ale i tak je zadam: dll-ka jest w folderze /bin/Debug czy tam /bin/Release?

  3. Jaki teraz masz błąd?

  4. Czy łączysz się z bazą na swoim kompie, czy zewnętrzną? Jeżeli zewnętrzną to możesz się z nią połączyć w inny sposób (np. SqlDeveloper) ?

0
  1. za pomocą "select * from v$version where banner like '%Oracle%'" wyszło mi
    "Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production"

  2. w /bin/Debug są
    Oracle.DataAccess.dll
    Oracle.ManagedDataAccess.dll

  3. opuściłeś numerek :)

  4. Błąd dalej przy "con.Open();" taki

An unhandled exception of type 'System.NullReferenceException' occurred in Oracle.DataAccess.dll
Additional information: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

Czyli znikł wcześniejszy problem z 32bit wersją i nie musiałem przestawiać kompilacji na 64bity.

  1. Baza zewnętrzna.

Podczas instalacji 64-bit ODAC 12c Release 4 (12.1.0.2.4) for Windows x64 pojawił się błąd.
Przechwytywanie.JPG

BoKoR napisał(a):

Jest, wala się po necie, np. tutaj: http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html
A teraz po kolei.

  1. Baza jest 32 czy 64 bit? Bo od tego trzeba zacząć.
    Jak to ustalisz, to będziesz wiedział jakie biblioteki u siebie zastosować. Nie sprawdzałem (bo słyszałem że nie) czy jak baza jest 64 to śmigają biblioteki 32.

  2. Głupie pytanie, ale i tak je zadam: dll-ka jest w folderze /bin/Debug czy tam /bin/Release?

  3. Jaki teraz masz błąd?

  4. Czy łączysz się z bazą na swoim kompie, czy zewnętrzną? Jeżeli zewnętrzną to możesz się z nią połączyć w inny sposób (np. SqlDeveloper)?

0

No to masz już takie błędy jakich ja nie miałem.

Na początku odinstaluj (o ile się uda) ODAC w wersji 32bit.
Jak się uda to restart kompa i instalacja 64-bit ODAC 12c Release 4 (12.1.0.2.4).

Później cały projekt znowu na x64 i kompilujesz.

0

Jak to odinstalować? Szukam i nie mogę znaleźć podobnej nazwy w panelu sterownia (odinstaluj lub zmień program).

1

Dlatego napisałem "jak Ci się uda".
Z Oracle jest tak że łatwo zainstalować, ale trudniej usunąć.

https://docs.oracle.com/cd/B19306_01/install.102/b14316/deinstall.htm

A dokładniej: 6.3.2 Removing Components with Oracle Universal Installer, tylko pamiętaj żeby zatrzymać usługi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1