2016-01-15 42 views
0

執行讀取器從表中檢索某些DateTime時出現問題。執行SqlDataReader時發生DateTime轉換錯誤

首先,我一個頁面傳遞了一些變量到另外一個頁面:

//calStart.SelectedDate is a DateTime value 
Response.Redirect("SpecialReports_Results.aspx?userListValues=" + userListValues + "&groupListValues=" + groupListValues + "&calSelected=" + calStart.SelectedDate); 

然後,在新頁面上:

//To retrieve the values that were sent over 
    string userListValues = Request.QueryString["userListValues"]; 
    string groupListValues = Request.QueryString["groupListValues"]; 
    string dateSelected = Request.QueryString["calSelected"]; 

    // SQL Server connection stuff + string argument 
    SqlCommand command2 = new SqlCommand(); 
    command2.Connection = gconn; 

    String sql2 = "SELECT MAX([Day]) as TheDay FROM Days WHERE User_ID = @User_ID AND [Day] < '@dateSelected' AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = @User_ID AND [DAY] >= '@dateSelected')"; 
    command2.CommandText = sql2; 

    command2.Parameters.Add(new SqlParameter("@User_ID", "")); 
    command2.Parameters.Add(new SqlParameter("@dateSelected", dateSelected)); 

    List<string> dates = new List<string>(); 

    //userID is a List<string> 
    foreach (string str in userID) 
    { 
     command2.Parameters["@User_ID"].Value = str; 

     using (SqlDataReader reader = command2.ExecuteReader()) 
     { 
      while (reader.Read()) //Getting error here: Conversion failed when converting datetime from character string. 
      { 
       if (reader.HasRows) 
       { 
        dates.Add(reader["Day"].ToString()); 
       } 
      } 
     } 
    } 

Days設置像這樣:

User_ID | Day 
---------------------------------- 
10  | 2010-11-09 00:00:00.000 
20  | 2015-12-06 00:00:00.000 
30  | 2012-01-12 00:00:00.000 
40  | 2013-07-23 00:00:00.000 

Day列的類型爲DateTime

我試圖做轉換字符串dateSelectedList<string>日期DateTime

DateTime confirmedDate = DateTime.Parse(dateSelected); 
List<DateTime> dates = new List<DateTime>() 

,但我得到了同樣的錯誤。

注意:SQL語句在Microsoft的SQL Server Management Studio中執行時可以工作。

+0

您是否在'DateTime.Parse'之前檢查'dateSelected'的值?那是什麼?和什麼是數據類型?串? – Ian

+0

是的,它是一樣的價值,但只是一個字符串。例如: '「2015年12月1日12:00:00 AM」'是一個字符串,解析後它變成了 '{2015年12月1日12:00:00 AM}'那是System.DateTime – pfinferno

+0

什麼完全是錯誤嗎?在哪一行? –

回答

2

我想你需要刪除你的'@dateSelected'上的單引號。

因此,您的代碼將其視爲string literal而不是參數。

String sql2 = "SELECT MAX([Day]) as TheDay FROM Days WHERE User_ID = @User_ID AND [Day] < @dateSelected AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = @User_ID AND [DAY] >= @dateSelected)"; 

由於是從字符串到日期時間的隱式的交談,你的讀者嘗試這個@dateSelected字符串文本時間值轉換和失敗。

+2

這是正確的。此外,最好在將參數分配給C#DateTime對象之前解析Request.QueryString [「calSelected」]值。否則,SqlParameter構造函數將創建一個'nvarchar'參數,當需要將該值與索引進行匹配時,該參數可能會產生痛苦的後果。 –

+0

我像你說的去掉了單引號。它得到了第一個錯誤,但現在我得到了一個'IndexOutOfRangeException'在'dates.Add(reader [「Day」]。ToString());'上由用戶代碼錯誤未處理。一些結果應該是空的,不應該添加到列表中。這就是爲什麼我加了'reader.HasRows',但也許這不正確? – pfinferno

+1

@pfinferno [什麼是「索引超出範圍」異常,以及如何修復它?](http://stackoverflow.com/q/20940979/447156) –

相關問題