try & catch

0

A ja z nowym pytankiem...

Chciałem napisać fragment kodu, który odpowiadałby mi za zdefiniowanie połączenia z bazą. W momencie kiedy wyskoczy błąd chciałem po prostu załadować coś nowego. Napisałem tak:

try
{
MySqlDataAdapter = new SqlDataAdapter(test, "Data Source=Server;Initial Catalog=binary; uid=login; pwd=zle_haslo");
}
catch
{ 
MySqlDataAdapter = new SqlDataAdapter(test, "Data Source=Server;Initial Catalog=binary; uid=login_m; pwd=dobre_haslo");	
}

Chcialem sobie popróbować na razie jak to bedzie wyglądało, wiec zastosowalem try, gdzie sprawdzane jest haslo i chcialem by w momencie kiedy wyjdzie blad, zeby podstawil dobre haslo.

Oczywiscie pozniej ma to dzialac na tej zasadzie, ze jesli wyskoczy blad (czyli login i haslo sie nie zgadzaja), to zeby ponownie wlaczylo sie poczatkowe okienko + informacja o blednym hasle.

Nie rozumiem tylko dlaczego mimo zastosowania catch i tak pojawia mi sie blad na ekranie :/

Będę wdzięczny za informacje co robię źle.

0

Spróbuj "catch (Exception)"

0
revo napisał(a)

Spróbuj "catch (Exception)"

try
{
MySqlDataAdapter = new SqlDataAdapter(test, "Data Source=Server;Initial Catalog=binary; uid=login; pwd=zle_haslo");
}
catch (Exception)
{
MySqlDataAdapter = new SqlDataAdapter(test, "Data Source=Server;Initial Catalog=binary; uid=login_m; pwd=dobre_haslo");        
}

Nie działa :(
Nadal wyskakuje mi okienko z błędem iż hasło jest niepoprawne... czyli wychodzi na to, że realizuje tylko pierwszą klamrę :/

0

Nie znam się na SQL-u w C#, ale wydaje mi się, że metoda SqlDataAdapter po prostu nie zwraca wyjątku. Błąd wywala SQL, a nie C# więc komendy try, catch nie wyłapią go.

0

EDIT: jednak nie pomogło ;)

Więc jak można inaczej wyłapać ten błąd ?
Lub inaczej. W jakis sposób zrealizować w takim razie logowanie ?

Jak widać w przykładzie chcę połączyć się do servera.
Próbowałem tak jak widać wykonać połączenie i jeśli się nie połączy to wykonać jakąś komendę, najpewniej wywołanie jeszcze raz tego samego okienka z informacją o nieprawidłowym haśle. Jednakże za każdym razem przy nieudanym połączeniu wywala mi to okienko z błędem.

0
skrzypol napisał(a)

Nie znam się na SQL-u w C#, ale wydaje mi się, że metoda SqlDataAdapter po prostu nie zwraca wyjątku. Błąd wywala SQL, a nie C# więc komendy try, catch nie wyłapią go.

Nie wydaje mi się, żeby tak było. Cały kod niezarządza(l)ny (unmanaged) jest opakowany przez kod zarządza(l)ny (managed), który wychwytuje błędy i wyrzuca je jako wyjątki.

Vasquez21> Zaczynam podejrzewać, że parametry, które podajesz przy drugim wywołaniu konstruktora

SqlDataAdapter

(tym w catch) są również złe.
Jeżeli korzystasz z VisualStudio przedebuguj sobie ten fragment kodu przy użyciu zintegrowanego debuggera, jeżeli np. z SharpDevelop to zaimplementuj jakiś mechanizm logujący błędy do pliku, ewentualnie użyj

MessageBox

'ów lub Console.Write()

.
Konstrukcja 
```cpp
try{}catch(Exception exception){}

działa na bank poprawnie.

0

Vasquez21> Zaczynam podejrzewać, że parametry, które podajesz przy drugim wywołaniu konstruktora

SqlDataAdapter

(tym w catch) są również złe.

Jeżeli korzystasz z VisualStudio przedebuguj sobie ten fragment kodu przy użyciu zintegrowanego debuggera, jeżeli np. z SharpDevelop to zaimplementuj jakiś mechanizm logujący błędy do pliku, ewentualnie użyj

MessageBox

'ów lub Console.Write()

.
> Konstrukcja 
```cpp
try{}catch(Exception exception){}

działa na bank poprawnie.

Korzystam z SharpDevelop.
Druga część kodu działa, gdyż po zakomentowaniu wszystkich klamerek try i catch, kiedy zostawiam samą linijkę:
MySqlDataAdapter = new SqlDataAdapter(test, "Data Source=Server;Initial Catalog=base; uid=login; pwd=good_password");
to wszystko działa bez zarzutu.

Może poprostu czegoś mi brakuje ?

Bo na razie działa to tak jak wkleiłem, czyli w try wpisane jest połączenie które ma zle hasło, natomiast w catch takie w którym jest dobre. Czyli w momencie uruchomienia programu automatycznie powinno nastąpić dobre połączenie, wyłapane przez catch, po tym jak wyskakuje okienko z błędem w try.

0

Przejrzałem dokładnie jeszcze to okienko z błędem. Oto one:


See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

         * Exception Text **************

System.Data.SqlClient.SqlException: Login failed for user 'michal_ma'.
at System.Data.SqlClient.ConnectionPool.GetConnection(Boolean& isInTransaction)
at System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean& isInTransaction)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.Common.DbDataAdapter.QuietOpen(IDbConnection connection, ConnectionState& originalState)
at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
at Slownik.logowanie.Button1Click(Object sender, EventArgs e) in c:\Documents and Settings\michal_m\My Documents\SharpDevelop Projects\Slownik\logowanie.cs:line 195
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

         * Loaded Assemblies **************

mscorlib
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase: file:///c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll

Slownik
Assembly Version: 1.0.2040.24839
Win32 Version: 1.0.2040.24839
CodeBase: file:///C:/Documents%20and%20Settings/michal_m/My%20Documents/SharpDevelop%20Projects/Slownik/bin/Debug/Slownik.exe

System.Windows.Forms
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase: file:///c:/winnt/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll

System
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase: file:///c:/winnt/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll

System.Drawing
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase: file:///c:/winnt/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll

System.Data
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase: file:///c:/winnt/assembly/gac/system.data/1.0.5000.0__b77a5c561934e089/system.data.dll

System.Xml
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase: file:///c:/winnt/assembly/gac/system.xml/1.0.5000.0__b77a5c561934e089/system.xml.dll

System.EnterpriseServices
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase: file:///c:/winnt/assembly/gac/system.enterpriseservices/1.0.5000.0__b03f5f7f11d50a3a/system.enterpriseservices.dll

         * JIT Debugging **************

To enable just in time (JIT) debugging, the config file for this
application or machine (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration> <system.windows.forms jitdebugging="true" /> </configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the machine
rather than being handled by this dialog.

więc wychodzi na to, że gdzieś muszę wpisać to:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

wie ktoś może gdzie ? :/

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