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?
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.
A można coś dokładniej? Jakiś tutoial może ktoś widział w necie albo przykład?
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
}
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
Użycie ORMa to nie jest kwestia ambicji tylko braku czasu na wynajdowanie koła na nowo.
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.
Kompilujesz nie w tej konfiguracji, w której jest Oracle.DataAccess
. Spraw, aby wszystko było w x64 albo x86.
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();
Coś mam z wersją Oracle.DataAccess.dll nie umiem dojść co jest nie tak. Może miał ktoś taki błąd?
Niechcący wpisalem się w komentarzu wyżej :-) chodzi o to, ze ten błąd może powoduje niewypelniony textbox ?
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();
jesteś pewny, że ten błąd powstaje przy conn.Open(); ?
Tak.
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 ?
Wrzucę kolo godz 15.
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.
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ą
A jak to mogę naprawić u siebie?
sprawdź mój załącznik u siebie - czy zadziała.
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'.
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 ?
W załączniku screen
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:
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.
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.
Jest, wala się po necie, np. tutaj: http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html
A teraz po kolei.
-
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. -
Głupie pytanie, ale i tak je zadam: dll-ka jest w folderze /bin/Debug czy tam /bin/Release?
-
Jaki teraz masz błąd?
-
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) ?
-
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" -
w /bin/Debug są
Oracle.DataAccess.dll
Oracle.ManagedDataAccess.dll -
opuściłeś numerek :)
-
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.
- Baza zewnętrzna.
Podczas instalacji 64-bit ODAC 12c Release 4 (12.1.0.2.4) for Windows x64 pojawił się błąd.
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.
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.Głupie pytanie, ale i tak je zadam: dll-ka jest w folderze /bin/Debug czy tam /bin/Release?
Jaki teraz masz błąd?
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)?
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.
Jak to odinstalować? Szukam i nie mogę znaleźć podobnej nazwy w panelu sterownia (odinstaluj lub zmień program).
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.