尝试从我的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;
任何想法会导致错误?
答案 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)
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”。但我的代码是绝对的解决方案。