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)
错误信息很清楚。为了自动将字符串转换为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);