2017-02-02 4 views
2

У меня есть этот класс, где я выбираю два значения из базы данных и сравнивая их с значениями текстового поля, предоставленными пользователями. Ниже мой класс.Oracle.DataAccess.Client.OracleException C#

 public void Userlogin(TextBox username, TextBox pwd) 
    { 
     int _failedAttempt = 0; 

     OpenConnection(); 

     command = new OracleCommand(); 
     command.CommandText = "SELECT username, user_pwd FROM dinein_system_users WHERE username:usrname AND user_pwd:pwd"; 
     command.Connection = dbconnect; 
     command.BindByName = true; 

     try 
     { 
      command.Parameters.Add("usrname", username.Text); 
      command.Parameters.Add("pwd", pwd.Text); 
     } 
     catch (NullReferenceException NRE) 
     { 
      MessageBox.Show("Please contact your developer about this error. Thank you " + NRE); 
     } 

     _reader = command.ExecuteReader(); 
     if (_reader.Read() != true) 
     { 
      _failedAttempt = _failedAttempt + 1; 
      while (_failedAttempt < 3) 
      { 
       MessageBox.Show("Incorrect Username or Password. Please try again " + "Attempts: " + _failedAttempt); 
       username.ResetText(); 
       pwd.ResetText(); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Welcome"); 
     } 
    } 

моя строка соединения

this._connectionString = "Data Source=xe;Max Pool Size=50;Min Pool Size=1;Connection Lifetime=120;Enlist=true;User Id=hr;Password=hr"; 

Так что, когда программа выполняется я получаю эту ошибку

An unhandled exception of type 'Oracle.DataAccess.Client.OracleException' occurred in Oracle.DataAccess.dll 

Дополнительная информация: Внешний компонент бросил исключение. Я был на этом в течение последнего часа, любая помощь была бы оценена.

Update

Open Connection метод

public void OpenConnection() 
    { 
     try 
     { 
      if (dbconnect == null) 
      { 
       dbconnect = new OracleConnection(this._connectionString); 
       dbconnect.Open(); 
       return; 
      } 

      switch (dbconnect.State) 
      { 
       case ConnectionState.Closed: 
       case ConnectionState.Broken: 
        dbconnect.Close(); 
        dbconnect.Dispose(); 
        dbconnect = new OracleConnection(this._connectionString); 
        dbconnect.Open(); 
        return; 
      } 
     } 
     catch (OracleException oracleException) 
     { 
      MessageBox.Show("Database connectionString is null. Contact your developer! " + oracleException); 
     } 

    } 

трассировки стека исключений

at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) 
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader() 
    at DINEIN.OracleDB_Connection.Userlogin(TextBox username, TextBox pwd) in f:\My Documents\Projects\DINEIN\DINEIN\OracleDB_Connection.cs:line 92 
    at DINEIN.Login.btn_login_Click(Object sender, EventArgs e) in f:\My Documents\Projects\DINEIN\DINEIN\Login.cs:line 31 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.PerformClick() 
    at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) 
    at System.Windows.Forms.Control.ProcessDialogKey(Keys keyData) 
    at System.Windows.Forms.Control.PreProcessMessage(Message& msg) 
    at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) 
    at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg) 
     at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at DINEIN.Program.Main() in f:\My Documents\Projects\DINEIN\DINEIN\Program.cs:line 19 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+0

Пожалуйста, покажите свой код для 'OpenConnection() метод'. Кроме того, какая строка в вашем коде является последней для выполнения перед возникновением исключения? Найдите это в трассировке стека исключения и предоставьте. – STLDeveloper

+0

@STLDeveloper Я обновил свой вопрос с помощью метода OpenConnection() и трассировки стека исключений. вы можете сейчас посмотреть. спасибо –

+0

Спасибо. Какая строка вашего кода в методе 'Userlogin()' выше - это номер строки 92? – STLDeveloper

ответ

0

Вместо того чтобы использовать свой отдельный OpenConnection() метод, рассмотрим кодирование с using() заявление. Это гарантирует, что ваше соединение всегда связано с другими объектами, связанными с базой данных.

Например:

int _failedAttempt = 0; 

public void Userlogin(TextBox username, TextBox pwd) 
{ 
    try 
    { 
    using (var connection = new OracleConnection(_connectionString)) 
    { 
     connection.Open(); 

     using (var command = new OracleCommand()) 
     { 
     command.CommandText = "SELECT username, user_pwd FROM dinein_system_users WHERE username= :usrname AND user_pwd= :pwd"; 
     command.Connection = connection; 
     command.BindByName = true; 

     command.Parameters.Add("usrname", username.Text); 
     command.Parameters.Add("pwd", pwd.Text); 

     using (var reader = command.ExecuteReader()) 
     { 
      if (reader.Read() != true) 
      { 
      _failedAttempt += 1; 
      if (_failedAttempt < 3) 
      { 
       MessageBox.Show("Incorrect Username or Password. " + 
           "Please try again. " + 
           $"Attempts: {_failedAttempt}"); 
       username.ResetText(); 
       pwd.ResetText(); 
      } 
      else 
      { 
       // 3 failed attempts 
      } 
      } 
      else 
      { 
      _failedAttempt = 0; 
      MessageBox.Show("Welcome"); 
      } 
     } 
     } 
    } 
    } 
    catch(OracleException ex) 
    { 
    MessageBox.Show("Error: {ex}"); 
    } 
} 
+0

Я пробовал этот код, и он все равно дает мне ту же ошибку в 'var reader = command.ExecuteReader()' –

+0

Я обновил свой ответ на добавьте блок try-catch. Обратите внимание, что он ловит исключение типа OracleException. Я думаю, что когда вы посмотрите на исключение с этим конкретным типом, вы получите более полезную информацию, чтобы помочь вам определить, что здесь происходит. – STLDeveloper

+0

Да, теперь его предоставление 'Необработанное исключение типа 'System.NullReferenceException' произошло в DINEIN.exe Дополнительная информация: Ссылка на объект не установлена ​​в экземпляр объекта. 'В методе CloseConnection() –

 Смежные вопросы

  • Нет связанных вопросов^_^