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