[英]ERROR: Failed to convert parameter value from a String to a DateTime
我遇到了此错误:尝试将多个选择的日期从复选框列表传递到要在sql中使用的参数时,无法将参数值从String
转换为DateTime
。
我已经尝试过使用其他数据类型(例如nvarchar
进行尝试,并且当我将多个选择的值传递给1个存储过程参数并使用动态sql返回select语句填充我的gridview时,它可以工作。
PS。 在我的网络服务器中,我使用DATE.DataTextFormatString = "{0:dd-MMM-yyyy}";
在复选框列表中显示,例如31-Aug-2013
DATE.DataTextFormatString = "{0:dd-MMM-yyyy}";
。 在我的sql数据库中,它显示为例如2013-08-31
。
ASPX.CS
protected void Page_Load(object sender, EventArgs e)
{
DATE.DataTextFormatString = "{0:dd-MMM-yyyy}";
using (SqlConnection conn = new SqlConnection(dbConn))
{
try //Call stored procedure
{
SqlCommand cmd = new SqlCommand(spddl, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
if (!IsPostBack)
{
DATE.DataSource = ds.Tables[0];
DATE.DataTextField = ds.Tables[0].Columns["DATE"].ToString();
DATE.DataBind();
}
if (IsPostBack)
{
Bind();
}
}
catch (Exception i)
{
bool exception = true;
if (exception == true)
{
//txtMessage.Text += e.Message;
}
}
}
}
public void Bind()
{
using (SqlConnection conn = new SqlConnection(dbConn))
{
using (SqlCommand cmd = new SqlCommand(spretrieve, conn))
{
String selectedDATE = String.Empty;
if (DATE.SelectedValue == "All")
{
selectedDATE = "DATE";
}
else
{
foreach (ListItem item in DATE.Items)
{
if (item.Selected)
{
selectedDATE += "'" + item.Text + "',";
}
}
selectedDATE = selectedDATE.Substring(0, selectedDATE.Length - 1);
}
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@param", SqlDbType.DateTime).Value = selectedDATE;
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds= new DataSet();
da.Fill(ds);
GRIDVIEW.DataSource = ds.Tables[0];
GRIDVIEW.DataBind();
}
}
SQL
ALTER PROCEDURE [dbo].[SP]
@param nvarchar(512)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sql nvarchar(max)
SET @sql = 'SELECT * FROM TABLENAME WHERE [COLUMN] IN (' + @param + ')'
EXEC sp_executesql @sql;
END
在SQL方面。
如果[COLUMN]
是DateTime类型,则应先将其转换为
CONVERT(varchar, [COLUMN], 112)
即您的SP应该像:
ALTER PROCEDURE [dbo].[SP]
@param nvarchar(512)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sql nvarchar(max)
SET @sql = 'SELECT * FROM TABLENAME WHERE CONVERT(varchar, [COLUMN], 112) IN (' + @param + ')'
EXEC sp_executesql @sql;
END
在代码端
另一件事是参数,如果要在@param
中传递多个日期,则必须像传递之前那样转换它们:
foreach (ListItem item in DATE.Items)
{
if (item.Selected)
{
DateTime dtTemp = Convert.ToDateTime(item.Value);
selectedDATE += "'" + dtTemp.ToString("yyyyMMdd") + "',";
}
}
selectedDATE = selectedDATE.Substring(0, selectedDATE.Length - 1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.