繁体   English   中英

错误:无法将参数值从字符串转换为DateTime

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM