错误:将参数值从字符串转换为日期时间失败

本文关键字:转换 日期 时间 失败 字符串 参数 错误 | 更新日期: 2023-09-27 18:13:38

我遇到了这个错误:当试图从复选框列表传递多个选定日期到我的参数要在sql中使用时,未能将参数值从String转换为DateTime

我已经尝试过其他数据类型,如nvarchar,当我传递多个选择值到1个存储过程参数并使用动态sql返回选择语句来填充我的gridview时,它可以工作。

p。在我的web服务器中,我显示在复选框列表中,例如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);