C# 仅当且仅当数据插入到Microsoft SQL server数据库时获取成功消息

C# 仅当且仅当数据插入到Microsoft SQL server数据库时获取成功消息,c#,asp.net,sql-server,file-upload,system.net.mail,C#,Asp.net,Sql Server,File Upload,System.net.mail,这是我的挑战。我已经成功地创建了一个表单,当用户填写并提交表单时,他/她会在其电子邮件收件箱中收到一条成功消息。但现在我的挑战是,每当触发submit按钮时,即使数据没有插入到数据库中,它们仍然会收到成功消息。我不知道我的编码出了什么错误。请帮忙。这是我的C#代码: ExecuteNonQuery返回受影响的行数,因此您可以更改方法签名以返回相同的行数 public int InsertRegistration() { // all code int rows = com.ExecuteNon

这是我的挑战。我已经成功地创建了一个表单,当用户填写并提交表单时,他/她会在其电子邮件收件箱中收到一条成功消息。但现在我的挑战是,每当触发submit按钮时,即使数据没有插入到数据库中,它们仍然会收到成功消息。我不知道我的编码出了什么错误。请帮忙。这是我的C#代码:


ExecuteNonQuery
返回受影响的行数,因此您可以更改方法签名以返回相同的行数

public int InsertRegistration() {
// all code 
int rows = com.ExecuteNonQuery();
return rows;
}
因此,在事件处理程序中检查,然后显示如下消息

    int rows = InsertRegistration(); 
    if(rows > 0) {
    lblMessage.Visible = true;
    lblMessage.Text = "Application submitted successfully! C...";
    }

您正在调用
smtpClient.Send(msg)
插入注册()之前因此您正在发送电子邮件;然后尝试在数据库中插入数据

您可能还希望从
InsertRegistration()返回
bool
如@Rahul所建议的

虽然确实关闭了连接,但不确定在何处打开连接;因此,如果您在方法中打开它,但使用
将其包装在一个
中,您可以跳过关闭方法(因为用户将关闭它),因此:


首先,我建议使用pattern Async任务来避免在应用程序中以某种方式解除锁定。(参见下面的示例)

其次,正如Ben所说,使用Raul在anwser中的逻辑将方法返回为布尔值:

因此,请尝试以下方法:

public async Task<bool> InsertRegistration() 
{
    // all code

    int rows = await com.ExecuteNonQueryAsync();

    if(rows>0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

     protected void btnsendmail_Click(object sender, EventArgs e)
    {
        using (StreamReader reader = new 
     StreamReader(Server.MapPath("~/Account/RegMessage.html")))
     {
        // ...

        if (InsertRegistration())
        {
            // Only run if inserted correclty
            smtpClient.Send(msg);
            lblMessage.Text = "Application submitted successfully! ...";
            lblMessage.ForeColor = System.Drawing.Color.Green;
        }
        else
        {
            lblMessage.Text = "Error submitting application";
            lblMessage.ForeColor = System.Drawing.Color.Red;
        }
        lblMessage.Visible = true;
    }
    }
公共异步任务InsertRegistration()
{
//所有代码
int rows=wait com.ExecuteNonQueryAsync();
如果(行数>0)
{
返回true;
}
其他的
{
返回false;
}
}
受保护的无效btnsendmail\u单击(对象发送者,事件参数e)
{
使用(StreamReader=new)
StreamReader(Server.MapPath(“~/Account/RegMessage.html”))
{
// ...
if(InsertRegistration())
{
//仅在正确插入时运行
smtpClient.Send(msg);
lblMessage.Text=“申请已成功提交!”;
lblMessage.ForeColor=System.Drawing.Color.Green;
}
其他的
{
lblMessage.Text=“提交申请时出错”;
lblMessage.ForeColor=System.Drawing.Color.Red;
}
lblMessage.Visible=true;
}
}

谢谢Rahul。但这是我的问题,我希望只有当数据插入数据库时,用户才能收到成功的电子邮件。点击submit按钮,即使数据没有插入数据库,他们仍然会收到一封成功的电子邮件,感谢Ben Adams。我已经格式化了我的代码以适应您的所有建议,但在尝试运行页面时出现错误消息:编译错误描述:在编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改源代码。编译器错误消息:CS0161:'ORMApp\u\u application.InsertRegistration()':并非所有代码路径都返回值a您正在对每个文件执行插入操作。。。您希望以
bool inserted=false开始该方法
然后更改
返回com.ExecuteNonQuery()>=1插入到
中&=(com.ExecuteNonQuery()>=1)和在所有括号外的方法末尾;除了最后一个
返回插入编译器不知道是否有任何循环将运行它现在被清除,只是我得到了错误:ConnectionString尚未初始化,我已编辑了我的代码您尚未将
SqlConnection
添加到
SqlCommand
中。将其作为第二个参数添加到构造函数
var com=new-SqlCommand(“插入候选项…”,con)
上,或者将其设置在
com.Connection=con之后谢谢你。在InsertRegistration()下面仍然有一条红色下划线,表示并非所有代码路径都可以返回值。我该如何解决这个问题。我试过重新编码,但仍然showing@Paschal对不起,我耽搁了。我是说//allcode,你能给我演示一下上面的部分吗?
public bool InsertRegistration()
{
    // ...
    using (var conn = new SqlConnection(...))
    {
        using (var com = new SqlCommand("INSERT INTO Candidates..."))
        {
            com.Parameters.AddWithValue("@FirstName", txtFN.Text);
            // ... etc

            con.Open(); // open connection here, just before executing
            // return the true/false for whether a row was inserted
            return com.ExecuteNonQuery() >= 1;
        }
    }
}

protected void btnsendmail_Click(object sender, EventArgs e)
{
    using (StreamReader reader = new StreamReader(Server.MapPath("~/Account/RegMessage.html")))
    {
        // ...

        if (InsertRegistration())
        {
            // Only run if inserted correclty
            smtpClient.Send(msg);
            lblMessage.Text = "Application submitted successfully! ...";
            lblMessage.ForeColor = System.Drawing.Color.Green;
        }
        else
        {
            lblMessage.Text = "Error submitting application";
            lblMessage.ForeColor = System.Drawing.Color.Red;
        }
        lblMessage.Visible = true;
    }
}
public async Task<bool> InsertRegistration() 
{
    // all code

    int rows = await com.ExecuteNonQueryAsync();

    if(rows>0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

     protected void btnsendmail_Click(object sender, EventArgs e)
    {
        using (StreamReader reader = new 
     StreamReader(Server.MapPath("~/Account/RegMessage.html")))
     {
        // ...

        if (InsertRegistration())
        {
            // Only run if inserted correclty
            smtpClient.Send(msg);
            lblMessage.Text = "Application submitted successfully! ...";
            lblMessage.ForeColor = System.Drawing.Color.Green;
        }
        else
        {
            lblMessage.Text = "Error submitting application";
            lblMessage.ForeColor = System.Drawing.Color.Red;
        }
        lblMessage.Visible = true;
    }
    }