>我有一个代码,可以从前端添加用户数据。但是在单击按钮时提交代码时,我收到以下错误
字符串未被识别为有效的日期时间。
请参阅代码为什么会发生这种情况。
protected void btnSubmit_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString);
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
SqlCommand cmd1 = new SqlCommand("Insert into tbl_teachers_profile (NgoId,first_name, last_name,dob,gender,designation, joining_date,leaving_date,active) values (@NgoId,@first_name, @last_name,@dob,@gender,@designation,@joining_date,@leaving_date,@active)", conn);
cmd1.Parameters.Add("@NgoId", SqlDbType.Int).Value = ddlNgoName.SelectedValue;
cmd1.Parameters.Add("@first_name", SqlDbType.VarChar).Value = txtfirstname.Text;
cmd1.Parameters.Add("@last_name", SqlDbType.VarChar).Value = txtlastname.Text;
cmd1.Parameters.Add("@dob", SqlDbType.DateTime).Value = Convert.ToDateTime(txtdateofbirth.Text);
cmd1.Parameters.Add("@gender", SqlDbType.VarChar).Value = ddlgender.SelectedValue;
cmd1.Parameters.Add("@designation", SqlDbType.NVarChar).Value = txtdesgination.Text;
cmd1.Parameters.Add("@joining_date", SqlDbType.DateTime).Value = Convert.ToDateTime(txtdoj.Text);
cmd1.Parameters.Add("@leaving_date", SqlDbType.VarChar).Value = Convert.ToDateTime(txtdol.Text);
cmd1.Parameters.Add("@active", SqlDbType.Bit).Value = Convert.ToInt32(ddlActiveInactive.SelectedValue);
cmd1.ExecuteNonQuery();
conn.Close();
ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('page added sucessfully');window.location ='csrteachersprofile.aspx';", true);
}
}
我尝试调试它,值显示为";
请帮忙
前端代码:-
<asp:TextBox ID="txtdateofbirth" CssClass="form-control" runat="server" ValidationGroup="AddNew" ReadOnly="true"></asp:TextBox>
<asp:RequiredFieldValidator ID="reqdob" runat="server" ControlToValidate="txtdateofbirth" ErrorMessage="Date of birth is required" ValidationGroup="AddNew" CssClass="error-class"></asp:RequiredFieldValidator>
我认为主要问题出在您的aspx html代码中,当您设置ReadOnly
属性时。
我建议您应该删除它,并按如下所示进行更改。
<asp:TextBox ID="txtdateofbirth" CssClass="form-control" runat="server" ValidationGroup="AddNew" Enabled="true"></asp:TextBox>
您还需要对所有三个文本框的代码隐藏进行更改,如下所示:
cmd1.Parameters.Add("@dob", SqlDbType.DateTime).Value = Convert.ToDateTime(txtdateofbirth.Text);
请让我知道它是否有效。!!
部分问题是数据逻辑和 UI 逻辑之间没有业务逻辑。数据逻辑不应直接访问控件。
第一件事是第一件事。代码中有以下几行:
cmd1.Parameters.Add("@joining_date", SqlDbType.DateTime).Value = Convert.ToDateTime(txtdoj.Text);
cmd1.Parameters.Add("@leaving_date", SqlDbType.VarChar).Value = Convert.ToDateTime(txtdol.Text);
我认为leaving_date
应该是日期时间而不是VarChar。这是问题#1。第二个问题是,如果日期无效或空白,您想怎么做?如果为空,它应该在数据库中为 null 吗?如果是这样,您需要执行以下操作:
cmd1.Parameters.Add("@joining_date", SqlDbType.DateTime).Value = string.IsNullOrWhitespace(txtdoj.Text) ? System.DBNull.Value : Convert.ToDateTime(txtdoj.Text);
cmd1.Parameters.Add("@leaving_date", SqlDbType.DateTime).Value = string.IsNullOrWhitespace(txtdol.Text) ? System.DBNull.Value : Convert.ToDateTime(txtdol.Text);
这将检查日期值是空还是空,如果是,它将弹出日期的空值。
不过,您确实需要在此处粘贴业务逻辑层。您的 UI 应该与此业务逻辑层通信,该业务逻辑层应检查数据的健全性,如果一切正常,则调用数据层。
试试这个:
DateTime.ParseExact(txtdoj.Text, "yyyy-MM-dd",System.Globalization.CultureInfo.InvariantCulture);