C#:从DateTimePicker和TextBox获取dd/MM/yyyy格式日期并解决转换错误
解决C#日期转换无效错误并实现dd/MM/yyyy格式日期处理
问题根源
- 无指定格式的日期解析:
Convert.ToDateTime(tb_date.Text)依赖系统默认文化(如英文系统默认MM/dd/yyyy),当TextBox中输入dd/MM/yyyy格式的日期(如15/03/2024),会因月份值超出合法范围抛出「String was not recognized as valid DateTime」错误。 - 字符串传递日期的风险:将日期以字符串形式传给SQL Server的Date类型参数,容易因格式不兼容引发转换错误,正确做法是直接传递
DateTime对象。
解决方案
步骤1:安全解析TextBox中的日期
使用DateTime.TryParseExact明确指定dd/MM/yyyy格式和不变文化,确保解析不受系统区域设置影响:
DateTime selectedDate; if (string.IsNullOrWhiteSpace(tb_date.Text)) { // 从DateTimePicker获取日期并格式化显示 selectedDate = dtp_addingDebit.Value; tb_date.Text = selectedDate.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture); } else { // 尝试按指定格式解析,失败则提示并重置 if (!DateTime.TryParseExact(tb_date.Text, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out selectedDate)) { MessageBox.Show("请输入dd/MM/yyyy格式的日期"); selectedDate = dtp_addingDebit.Value; tb_date.Text = selectedDate.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture); } }
步骤2:修改数据访问层,传递DateTime参数
将InsertCustomer方法的日期参数改为DateTime类型,直接传递日期对象给SQL参数,避免字符串转换:
public void InsertCustomer(string customer_fullname, string customer_phone, string customer_address, DateTime customer_date) { DAL.DataAccessLayer DAL = new DAL.DataAccessLayer(); DAL.Open(); SqlParameter[] param = new SqlParameter[4]; param[0] = new SqlParameter("@customer_fullname", SqlDbType.NVarChar); param[0].Value = customer_fullname; param[1] = new SqlParameter("@customer_phone", SqlDbType.NVarChar); param[1].Value = customer_phone; param[2] = new SqlParameter("@customer_address", SqlDbType.NVarChar); param[2].Value = customer_address; param[3] = new SqlParameter("@customer_date", SqlDbType.Date); param[3].Value = customer_date; // 直接传递DateTime对象 DAL.ExcuteCommand("Inserting_Customers", param); DAL.Close(); }
步骤3:调整存储过程调用代码
将之前传递的tb_date.Text替换为解析后的selectedDate对象:
// 确保selectedDate是步骤1中解析得到的DateTime对象 AddingDebit_con.AddingNewDebit( int.Parse(combo_customers.SelectedValue.ToString()), selectedDate, // 传递DateTime而非字符串 Convert.ToInt32(tb_amount.Text) );
注:如果
AddingNewDebit方法的签名与InsertCustomer不匹配,同步修改其参数类型为DateTime。
额外优化建议
- 直接设置DateTimePicker的显示格式,减少手动输入错误:
dtp_addingDebit.Format = DateTimePickerFormat.Custom; dtp_addingDebit.CustomFormat = "dd/MM/yyyy"; - 限制TextBox的输入规则(如仅允许数字和斜杠、固定长度10),进一步避免非法输入。
内容的提问来源于stack exchange,提问作者Khayal Ads
相关产品推荐
相关产品推荐

