C# 将varchar数据类型转换为datetime数据类型导致值超出范围错误
将varchar数据类型转换为datetime数据类型导致值超出范围错误 我试图使用表单将数据输入表中,表单验证和sql server中的日期格式都是dd/mm/yy,但是当我尝试从表单提交日期大于12天的数据时(例如,2012年12月13日),它会抛出一个异常,其原因是“将varchar数据类型转换为datetime数据类型会导致超出范围的值错误”,如果我尝试以mm/dd/yy格式将数据输入表单,它会声明“错误的日期格式”,这意味着dd/mm/yy格式是正确的格式 下面是我表格的代码:C# 将varchar数据类型转换为datetime数据类型导致值超出范围错误,c#,.net,sql-server-2008,visual-c#-express-2010,C#,.net,Sql Server 2008,Visual C# Express 2010,将varchar数据类型转换为datetime数据类型导致值超出范围错误 我试图使用表单将数据输入表中,表单验证和sql server中的日期格式都是dd/mm/yy,但是当我尝试从表单提交日期大于12天的数据时(例如,2012年12月13日),它会抛出一个异常,其原因是“将varchar数据类型转换为datetime数据类型会导致超出范围的值错误”,如果我尝试以mm/dd/yy格式将数据输入表单,它会声明“错误的日期格式”,这意味着dd/mm/yy格式是正确的格式 下面是我表格的代码:
private void btnAddProject_Click(object sender, EventArgs e)
{
DateTime startDate;
DateTime endDate;
if (txtProjectName.Text == "") //client side validation
{
MessageBox.Show("Enter Project Name");
return;
}
try
{
startDate = DateTime.Parse(txtProjectStart.Text);
endDate = DateTime.Parse(txtProjectEnd.Text);
}
catch (Exception)
{
MessageBox.Show("Wrong Date Format");
return;
}
fa.CreateProject(txtProjectName.Text, startDate, endDate, (int)cbCustomers.SelectedValue, ptsUser.Id);
txtProjectName.Text = "";
txtProjectStart.Text = "";
txtProjectEnd.Text = "";
cbCustomers.SelectedIndex = 0;
MessageBox.Show("Project Created");
adminControl.SelectTab(2);
}// end btnAddProject
这是我DAO中的代码:
public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
{
string sql;
SqlConnection cn;
SqlCommand cmd;
Guid projectId = Guid.NewGuid();
sql = "INSERT INTO Project (ProjectId, Name, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)";
sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate, endDate, customerId, administratorId);
cn = new SqlConnection(Properties.Settings.Default.WM75ConnectionString);
cmd = new SqlCommand(sql, cn);
try
{
cn.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw new Exception("Error Creating Project", ex);
}
finally
{
cn.Close();
}
}//end CreateProject Method
这是我的facade代码:
public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
{
dao.CreateProject(name, startDate, endDate, customerId, administratorId);
}//end CreateProject
基本上,您不应该在SQL中以字符串形式传递
DateTime
值。请使用参数化SQL,直接设置参数值。您应该始终尽可能使用参数化SQL:
- 它提供了更好的代码/数据分离
- 它避免了有问题的转换(如此)
- 它避免了SQL注入攻击
using
语句,让SqlException
直接冒泡-为什么要费心将其包装在普通的异常中呢
sql = "INSERT INTO Project (ProjectId, Name, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)";
sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate.toString("dd-MMM-yyyy"), endDate.toString("dd-MMM-yyyy"), customerId, administratorId);
建议:为什么要在代码中使用Insert
语句?可以使用存储过程。可以像
不需要使用存储过程-或者至少,您没有建议任何好处。仅使用参数化SQL应该可以解决此问题。解决方案是将日期时间转换为“dd MMM yyyy”。SQL=“插入到项目中(ProjectId、Name、ExpectedStartDate、ExpectedEndDate、CustomerId、AdministratorId)"; sql+=String.Format(“值({0}、{1}、{2}、{3}、{4}、{5})”,projectId,name,startDate.toString(“dd MMM yyyy”)、endDate.toString(“dd MMM yyyy”)、customerId、administratorId;这是一个糟糕的解决方案。更好的解决方案是避免不必要的字符串转换。然后您可以使用CultureInfo。这是假设数据库使用与系统相同的区域性。当有一个更简单、更干净、更有效的解决方案时,你为什么要跳过复杂的障碍来创建一个脆弱的解决方案?从SQL中分离参数值对于所有类型来说都是很好的做法。
var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");