ASP.净,SQL Server日期错误

本文关键字:日期 错误 Server SQL ASP | 更新日期: 2023-09-27 18:09:26

这是我的代码:

protected void Page_Load(object sender, EventArgs e)
{
    DateOfBirth.Text = Session["DateOfBirth"].ToString();
    Member.Text = Session["Member"].ToString();    
}
protected void btn_Confirm_Click(object sender, EventArgs e)
{
    SqlConnection cnn;
    SqlCommand cmd;
    string sql = "INSERT INTO Member (MemberJoinDate,DateOfBirth) VALUES (@MemberJoinDate,@DateOfBirth)";
    cnn = new SqlConnection(SqlDataSource1.ConnectionString);
    try
    {
        cnn.Open();
        cmd = new SqlCommand(sql, cnn);
        cmd.Parameters.Add("@MemberJoinDate", SqlDbType.Date);
        cmd.Parameters["@MemberJoinDate"].Value = Member.Text;
        cmd.Parameters.Add("@DateOfBirth", SqlDbType.Date);
        cmd.Parameters["@DateOfBirth"].Value = MemberID.Text;
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        cnn.Close();
        btn_Confirm.Visible = false;
    }
    catch (Exception ex)
    {
        Response.Write(ex);
    }

输入this后:

 Name : Random 
 Members Join Date : 08/23/2015 
 Date of birth : 08/23/2015 

我得到了这个错误:

系统。FormatException:转换参数值失败日期时间字符串。

系统。FormatException:字符串不存在被识别为有效的日期时间。

在System.DateTimeParse

。解析(字符串s, DateTimeFormatInfo dtfi, DateTimeStyles样式)
在System.Convert。ToDateTime(String value, IFormatProvider provider)
在System.String.System.IConvertible。ToDateTime (IFormatProvider提供者)
在System.Convert。ChangeType(对象值,类型)IFormatProvider提供者)
在System.Data.SqlClient.SqlParameter。对象值,元类型destinationType Boolean&coercedToDataFeed Boolean&typeChanged,布尔allowStreaming)
——内部异常堆栈跟踪结束——
在System.Data.SqlClient.SqlParameter。对象值,元类型destinationType Boolean&coercedToDataFeed Boolean&typeChanged,布尔allowStreaming)
在System.Data.SqlClient.SqlParameter.GetCoercedValue ()
在System.Data.SqlClient.SqlParameter。验证(Int32索引,布尔值isCommandProc)
在System.Data.SqlClient.SqlCommand。BuildParamList (TdsParser解析器,SqlParameterCollection参数)
System.Data.SqlClient.SqlCommand.BuildExecuteSql (CommandBehaviorSqlParameterCollection参数:_SqlRPC&rpc)
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehaviorRunBehavior, RunBehavior,布尔值async, Int32 timeout, Task&asyncWrite, SqlDataReaderds)
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehaviorRunBehavior, RunBehavior,布尔返回流,字符串方法,TaskCompletionSource ' 1完成,Int32超时,任务&的任务,布尔asyncWrite)
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (TaskCompletionSource1sendToPipe, Int32超时;布尔asyncWrite)
在System.Data.SqlClient.SqlCommand.ExecuteNonQuery ()
在总结。btn_Confirm_Click(对象发送者,EventArgs e)

ASP.净,SQL Server日期错误

错误信息很清楚。为了自动将字符串转换为DateTime,它必须具有特定的格式。你没有那种格式,所以没有转换。您应该验证日期以确保它们的格式正确,然后将它们解析为DateTime对象,然后将其作为参数提供给命令。我将把验证部分留给您,下面是解析代码:

DateTime MemberJoinDate = DateTime.Parse(Member.Text, "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture);
cmd.Parameters.Add("@MemberJoinDate", MemberJoinDate);

如果您想测试提供的文本格式是否正确,您可能希望使用DateTime解析的另一种变体。看一下DateTime.ParseExact.

另外,打开数据库连接然后添加参数是在浪费资源。您需要绝对确保数据库连接被关闭,即使在发生错误时也是如此。我是这样写的:

var cnn = new SqlConnection(SqlDataSource1.ConnectionString);
var cmd = new SqlCommand("INSERT INTO Member (MemberJoinDate,DateOfBirth) VALUES (@MemberJoinDate,@DateOfBirth)", cnn);
cmd.Parameters.Add("@MemberJoinDate", DateTime.Parse(Member.Text, "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture));
cmd.Parameters.Add("@DateOfBirth", DateTime.Parse(DateOfBirth.Text, "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture));
try
{
    cnn.Open();             
    cmd.ExecuteNonQuery();               
}
catch (Exception ex)
{
    //Response.Write(ex); //probably shouldn't write directly to the response
    ClientScriptManager.RegisterStartupScript(this.GetType(), "InsertionError", "alert('Something went wrong while saving the data!')", true);
}
finally // this code will always get executed, even if there's a problem in the try block
{
    cmd.Dispose();
    cnn.Close();
}
btn_Confirm.Visible = false;

此错误是基于两个日期时间格式不同,所以您可以将两者设置为相同的一个。更多信息请查看CultureInfo。InvariantCulture地产

检查这个例子:

using System.Globalization;//namespace 
DateTime Membersjoin_Table= DateTime.ParseExact(MemberJoin.Text, "MM/dd/yyyy", CultureInfo.InvariantCulture);