2013-11-22 1 views
2

На первом этапе asp:Wizard У меня есть логин, использующий DirectoryServices для аутентификации. Но тогда я хочу взять UserID, Date и SCOPE_IDENTITY() и вставить его в таблицу. Вот что я пробовал. Когда я нажимаю дальше, информация не вставлена, но функция AD проверяется правильно. Я не уверен, что я делаю неправильноКак я могу выполнить вставку SQL в активном шаге мастера?

protected void OnActiveStepChanged(object sender, EventArgs e) 
    { 
     //check for the employee in AD 
     string Domain = "mydomain.local"; 
     string EmployeeID = txtEmpID.Text; 
     string Password = txtPassword.Text; 
     string ADStatus = null; 

     // If the ActiveStep is changing to Step2, check to see whether the 
     // user authenticated the AD Login Process. If it is, skip to the Step2 step. 
     if (Wizard1.ActiveStepIndex == Wizard1.WizardSteps.IndexOf(this.WizardStep2)) 
     { 
      if (AuthenticateActiveDirectory(Domain, EmployeeID, Password) == true) 
      { 
       //If success ... 
       ADStatus = "Success"; 
       Session["SessionADStatus"] = ADStatus; 


       string strDepartment = ddlDepartment.SelectedValue; 
       SqlConnection conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString); 
       SqlCommand cmd1 = new SqlCommand("INSERT INTO [pharm_OrderID](UserID, RequestType, CreateDate) values (@UserID, @RequestType, @CreateDate);", conn1); 
       cmd1.CommandType = CommandType.Text; 
       conn1.Open(); 

       string strUserID = txtEmpID.Text; 
       cmd1.Parameters.Add("@UserID", SqlDbType.NVarChar, 50); 
       cmd1.Parameters["@UserID"].Value = strUserID; 

       string strRequestType = ddlReturnType.SelectedValue; 
       cmd1.Parameters.Add("@ReturnType", SqlDbType.NVarChar, 50); 
       cmd1.Parameters["@ReturnType"].Value = strRequestType; 

       string strCreateDate = lblOrderAttemptTime.Text; 
       cmd1.Parameters.Add("@CreateDate", SqlDbType.NVarChar, 50); 
       cmd1.Parameters["@CreateDate"].Value = strCreateDate; 

       conn1.Dispose(); 
       cmd1.Dispose(); 
       Wizard1.ActiveStepIndex = Wizard1.WizardSteps.IndexOf(this.WizardStep2); 

      } 
      else 
      { 
       ADStatus = "Failure"; 
       Session["SessionADStatus"] = ADStatus; 
       lblADError.Visible = true; 
       lblADError.Text = "Unable to authenticate Employee ID or Password."; 
       Wizard1.ActiveStepIndex = Wizard1.WizardSteps.IndexOf(this.WizardStep1); 
      } 


     } 

    } 
+0

Прежде всего, получите код вашего слоя данных из обработчика событий пользовательского интерфейса. – paqogomez

+0

@paqogomez почему? – Skullomania

+0

Если у вас есть этот код в обработчике событий, его нельзя использовать повторно. [Архитектура N-уровня] (http://en.wikipedia.org/wiki/Multitier_architecture) будет определять, что у вас есть уровень данных (набор классов), который взаимодействует с базой данных, бизнес-уровнем, который обрабатывает бизнес-логику и пользовательский интерфейс, который является вашим интерфейсом. – paqogomez

ответ

2

Я не являюсь экспертом в AD, но команда должна быть выполнена для получения какого-либо результата.

Попробуйте добавить

cmd1.ExecuteNonQuery(); 

перед утилизацией соединения и команды

using(SqlConnection conn1 = new SqlConnection(........)) 
using(SqlCommand cmd1 = new SqlCommand("INSERT INTO [pharm_OrderID]" + 
             "(UserID, RequestType, CreateDate) " + 
             "values (@UserID, @RequestType, @CreateDate);", conn1)) 
{ 
    conn1.Open(); 
    string strUserID = txtEmpID.Text; 
    cmd1.Parameters.Add("@UserID", SqlDbType.NVarChar, 50); 
    cmd1.Parameters["@UserID"].Value = strUserID; 

    string strRequestType = ddlReturnType.SelectedValue; 
    cmd1.Parameters.Add("@ReturnType", SqlDbType.NVarChar, 50); 
    cmd1.Parameters["@ReturnType"].Value = strRequestType; 

    string strCreateDate = lblOrderAttemptTime.Text; 
    cmd1.Parameters.Add("@CreateDate", SqlDbType.NVarChar, 50); 
    cmd1.Parameters["@CreateDate"].Value = strCreateDate; 

    cmd1.ExecuteNonQuery(); 
} 
Wizard1.ActiveStepIndex = Wizard1.WizardSteps.IndexOf(this.WizardStep2); 
... 

Добавлена ​​также используя заявление, чтобы закрыть соединение и утилизировать как команду и подключение.
Вы всегда должны использовать этот шаблон, чтобы правильно закрыть соединение также в случае исключения брошенного внутри с помощью блока

1

3 вещи

  1. Я согласен с должностью Стива. У вас должно быть использование операторов, если вы можете использовать объекты, которые необходимо удалить. Таким образом, вам действительно не нужно это делать. Его обрабатывают для вас.
  2. Объект sqlcommand имеет открытое соединение. Может быть, использование этого поможет решить проблему?
  3. Вы действительно должны использовать объект транзакции. Транзакции в основном сбрасывают сейфы при вводе нескольких фрагментов данных. Например. Скажем, ваш мастер в этом случае имеет 3 шага, а шаг 2 терпит неудачу. Вероятно, вы не захотите, чтобы шаг 1 остался. С помощью транзакции вы можете откатить свои изменения при ошибке.

В разделе 2:

cmd1.Connection.Open();

вместо

conn1.Open(); 

В разделе 3:

SqlTransaction transaction; 

    // Start a local transaction. 
    transaction = conn1.BeginTransaction("TheTransaction"); 
    cmd1.Transaction = transaction; 

Тогда как раз перед тем, как распоряжаться вашей команды

transaction.Commit(); 

В блоке ошибок (при написании TryCatch, или если вы обнаружили какие-то ошибки), вы используете

transaction.Rollback(); 

Как примечание, Вы установите статус успеха в начале вашу вставку sql. Вы действительно должны положить это после успешной команды ...

Редактировать: В вашем коде.Вы ссылки ТипЗапроса в вашей вставке

new SqlCommand("INSERT INTO [pharm_OrderID](...RequestType...) values ([email protected] 

Тогда позже, можно использовать то, что называется ReturnType

string strRequestType = ddlReturnType.SelectedValue; 
cmd1.Parameters.Add("@ReturnType", SqlDbType.NVarChar, 50); 
cmd1.Parameters["@ReturnType"].Value = strRequestType; 

Какой является правильным для базы данных. Это, скорее всего, ваша проблема

+0

@Skullomania Это помогло? –

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

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