2013-11-22 49 views
2

asp:Wizard的第一步,我有一個使用DirectoryServices進行身份驗證的登錄。但是,我想採取UserID,DateSCOPE_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

首先,從您的UI事件處理程序中獲取數據層代碼。 – paqogomez

+0

@paqogomez爲什麼? – Skullomania

+0

如果您在事件處理程序中擁有該代碼,則無法重用它。 [N層體系結構](http://en.wikipedia.org/wiki/Multitier_architecture)將規定您有一個數據層(一組類),它與數據庫進行交互,處理業務邏輯的業務層和一個用戶界面,這是你的前端。 – paqogomez

回答

2

我不是AD的專家,而是一個命令需要執行產生任何結果。

嘗試配置連接和命令

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); 
... 

添加之前添加

cmd1.ExecuteNonQuery(); 

也using語句關閉連接和處置指揮與連接。
你應該總是使用這種模式也正確地關閉連接中使用塊

1

三件事情

  1. 我與史蒂夫的同意后里面拋出的異常的情況。當您可以覆蓋需要處理的對象時,您應該使用語句。這樣,你並不需要記得去做。它爲您處理。
  2. sqlcommand對象具有自己的打開連接。也許使用它可以幫助解決問題?
  3. 你真的應該使用交易對象。當您輸入多個數據時,事務基本上都是失敗保險箱。例如。假設你的嚮導在這種情況下有3個步驟,並且步驟2失敗。你可能不希望第一步被遺忘。通過交易,您可以在錯誤時回滾您的更改。

對於第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] 

引用的RequestType再後來,你用一種叫做返回類型

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

哪一個是正確的數據庫。這很可能是您的問題

+0

@Skullomania這有幫助嗎? –