繁体   English   中英

如何在向导活动步骤中执行SQL插入?

[英]How can I execute a SQL insert in a wizard active step?

asp:Wizard第一步,我使用DirectoryServices登录以进行身份​​验证。 但是然后我想获取UserIDDateSCOPE_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);
            }


        }

    }

我不是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块内引发异常

3件事

  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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM