2

asp:Wizard在我使用登录的第一步DirectoryServices名来进行身份验证。但后来我想把UserID,Date和 theSCOPE_IDENTITY()插入表格中。这是我尝试过的。当我点击下一步时,没有插入信息,但正确检查了 AD 功能。我不确定我做错了什么

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


        }

    }
4

2 回答 2

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

还添加了 using 语句来关闭连接并处理命令和连接。
如果在 using 块内引发异常,您也应该始终使用此模式正确关闭连接

于 2013-11-22T22:07:12.917 回答
1

三件事

  1. 我同意史蒂夫的帖子。当您可以处理需要处理的对象时,您应该使用 using 语句。那样的话,你真的不需要记住去做。它为您处理。
  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 插入的开头设置了成功状态。你真的应该在命令成功之后把它放在...

编辑:在您的代码中。您在插入中引用 requesttype

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

然后稍后,您使用称为 returntype 的东西

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

哪一个是正确的数据库。这很可能是您的问题

于 2013-11-23T04:38:02.240 回答