2015-09-03 3 views
0

У меня есть парование SQL Query, которая не при получении значения даты:Ошибка «Конверсия удалось при преобразовании даты и/или времени из символьной строки»

String strQuery = @"SELECT TOP 100000" + 
    "[dbo].[Service].[company_name] AS 'Company Name', [dbo].[Service].[status_description] AS 'Status Description'," + 
    "DATEPART(month, [dbo].[Service].[date_entered]) AS 'Month', COUNT([dbo].[Service].[status_description]) AS 'Count'" + 
    "FROM [dbo].[Service] WITH(NOLOCK)" + 
    "WHERE ([dbo].[Service].[status_description] = @Status)" + 

    // **** I used the following to get values from Ajax CalendarExtender 
    // **** (Ajax Format from: yyyy-MM-ddTHH:mm:ss.mmm to: yyyy-MM-ddT23:59:59.000) ******* 
    "AND ([dbo].[Service].[date_entered] BETWEEN '@DateFrom' AND '@DateTo')" + 

    "GROUP BY [dbo].[Service].[company_name], [dbo].[Service].[status_description]," + 
    "DATEPART(month, [dbo].[Service].[date_entered])" + 
    "ORDER BY [dbo].[Service].[status_description] ASC;"; 

    System.Globalization.CultureInfo en = new System.Globalization.CultureInfo("en-US"); 
    SqlConnection con = new SqlConnection(strConnString); 
    SqlCommand cmd = new SqlCommand(strQuery + "", con); 
    cmd.Parameters.AddWithValue("@Status", DdlTickets.SelectedItem.Value); 
    cmd.Parameters.AddWithValue("@DateFrom", TxtDateFrom.Text); 
    cmd.Parameters.AddWithValue("@DateTo", TxtDateTo.Text);   

    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    cmd.Connection = con; 
    try 
    { 
     con.Open(); 
     if (DdlTickets.Items.Count > 1) 
     { 
      da.Fill(ds, strQuery); 

      // *** the values come from Ajax, but when It gets to fill the Gridview, it fails with error **** 

      GridView1.DataSource = ds.Tables[strQuery]; 
      GridView1.DataBind(); 
      BtnCSV.Visible = true; 
     } 
     if (GridView1.Rows.Count <= 0) 
     { 
      BtnCSV.Visible = false; 
     } 
     else 
     { 
      //Set Later 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     con.Close(); 
     con.Dispose(); 
    } 

я пытался преобразования значения по умолчанию из CalendarExtender с следующий код, но он не работает:

cmd.Parameters.AddWithValue("@DateFrom", DateTime.ParseExact(TxtDateFrom.Text, "yyyy-MM-ddTHH:mm:ss.mmm", CultureInfo.InvariantCulture)); 
cmd.Parameters.AddWithValue("@DateTo", DateTime.ParseExact(TxtDateTo.Text, "yyyy-MM-ddTHH:mm:ss.mmm", CultureInfo.InvariantCulture)); 

Если я следующий запрос вместо одного выше, и получение значения непосредственно работает:

"AND ([dbo].[Service].[date_entered] BETWEEN '2015-04-02T00:00:00.000' AND '2015-09-02T23:59:59.000')" + 

Любые идеи о том, что может вызвать ошибку? Большое спасибо за помощь!

ответ

2

Вам не нужно использовать одинарные кавычки для ваших параметров. С одинарными кавычками ваш менеджер баз данных видит их как string literal, а не параметр.

Просто удалите их. Если все будет отличным от этого, оно будет работать.

AND ([dbo].[Service].[date_entered] BETWEEN @DateFrom AND @DateTo) 

Несколько вещей больше;

  • Используйте using statement распоряжаться своим SqlConnection, SqlCommand и SqlDataAdapter объектов автоматически вместо вызова Close или Dispose методов вручную.
  • Не используйте метод AddWithValue. It may generate unexpected and surprising results sometimes. Используйте Add метод перегрузки, чтобы указать типы параметров и размер.
+0

Удивительный! Большое спасибо. Я боролся несколько часов и не мог понять. Это сработало! – Jacman

Смежные вопросы