asp.net错误:“将字符串转换为smalldatetime数据类型时转换失败”

时间:2010-06-29 20:01:21

标签: c# asp.net sql-server-2005 .net-3.5

尝试从我的asp.net页面调用存储过程时出错。

  

e.Message =“转换失败时   将字符串转换为   smalldatetime数据类型。“

存储过程由:

调用

调用存储过程的asp.net代码是:

//Display search results in GridView; 
SqlConnection con = new SqlConnection(strConn); 
//string sqlItemSearch = "usp_Item_Search"; 
SqlCommand cmdItemSearch = new SqlCommand(sqlItemSearch, con); 
cmdItemSearch.CommandType = CommandType.StoredProcedure; 

cmdItemSearch.Parameters.Add(new SqlParameter("@Item_Num", SqlDbType.VarChar, 30)); 
cmdItemSearch.Parameters["@Item_Num"].Value = txtItemNumber.Text.Trim(); 

cmdItemSearch.Parameters.Add(new SqlParameter("@Search_Type", SqlDbType.Int)); 
cmdItemSearch.Parameters["@Search_Type"].Value = ddlSearchType.SelectedItem.Value; 

cmdItemSearch.Parameters.Add(new SqlParameter("@Vendor_Num", SqlDbType.VarChar, 10)); 
cmdItemSearch.Parameters["@Vendor_Num"].Value = txtVendorNumber.Text.Trim(); 

cmdItemSearch.Parameters.Add(new SqlParameter("@Search_User_ID", SqlDbType.Int)); 
cmdItemSearch.Parameters["@Search_User_ID"].Value = ddlSeachUser.SelectedItem.Value; 

if (!string.IsNullOrEmpty(txtStartDate.Text)) 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim()); 
} 
else 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime("01/01/1996"); 
} 

if (!string.IsNullOrEmpty(txtEndDate.Text)) 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(txtEndDate.Text.Trim()); 
} 
else 
{ 
    cmdItemSearch.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.DateTime)); 
    cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(DateTime.Now); 
} 
con.Open(); 

SqlDataAdapter ada = new SqlDataAdapter(cmdItemSearch); 
DataSet ds = new DataSet(); 
ada.Fill(ds); 

    gvSearchDetailResults.DataSource = ds; 
    gvSearchDetailResults.DataBind(); 
    pnlSearchResults.Visible = true; 

任何想法会导致错误?

5 个答案:

答案 0 :(得分:2)

问题是由以下一行引起的:

cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(txtEndDate.Text.Trim());

cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim());

cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime("01/01/1996");

可能是由输入错误的值或区域设置问题引起的。如果您不需要输出验证消息,则可以使用DateTime.TryParse()静态函数来解析输入的日期和时间。

我会这样做:

DateTime date;
cmdItemSearch.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime)); // note this line was unnecessary duplicated 
if (!string.IsNullOrEmpty(txtStartDate.Text) && DateTime.TryParse(txtStartDate.Text.Trim(), out date)) 
    cmdItemSearch.Parameters["@StartDate"].Value = date; 
else 
    cmdItemSearch.Parameters["@StartDate"].Value = DateTime.MinValue; 

答案 1 :(得分:0)

我的猜测是这里的代码行:

cmdItemSearch.Parameters["@StartDate"].Value = Convert.ToDateTime(txtStartDate.Text.Trim());

在这里:

cmdItemSearch.Parameters["@EndDate"].Value = Convert.ToDateTime(txtEndDate.Text.Trim());

检查放入这两个参数的值,并验证它们是您尝试转换的有效日期。

Convert.ToDateTime(somedatehere)如果收到空值,将返回默认的DateTime.MinValue,但格式不正确的值将引发异常。

答案 2 :(得分:0)

哪个SQL参数应该是smalldatetime?我没有看到任何这样的定义。

答案 3 :(得分:0)

假设参数是datetime / smalldatetime(尽管你已经提到过datetime)而不是varchar,那么其中一个值是< 1900年1月1日或> 2079年6月6日基于错误消息。

答案 4 :(得分:0)

请试试这个。例如,textBox1.Text值等于20100101

DateTime newDateTime = new DateTime(Convert.ToInt32(textBox1.Text.Substring(0,4)),// Year
                                Convert.ToInt32(textBox1.Text.Substring(4,2)),// Month
                                Convert.ToInt32(textBox1.Text.Substring(6,2)))// Day

您无法像Text代码一样从TextBox创建newDateTime。你必须在你的文字之后写一个格式,如“yyyymmdd”。但我的代码是绝对的解决方案。