2013-07-30 342 views
1

我插入了一個datetime字段到sql server。從我的本地計算機,它工作得很好。例如:sql server中的datetime字段是:「2013-07-31 08:00:00:00」,但是當我運行應用程序時,它會切換日期和月份,並像這樣插入: 「2013-07- 31 15:15:00.000「。將DateTime插入到sql server 2008時出現奇怪的錯誤

根據今天的日期,我的相關頁面從sql服務器加載一些條目。 像這樣:

public List<act_event> return_event_list(DateTime date) //return all events for spesific date 
    { 

     List<act_event> event_list = new List<act_event>(); 

     String date_sql = date.ToString("yyyy-MM-dd"); 


     using (SqlConnection con = connect("igroup20_test2ConnectionString")) 
     { 

      using (SqlCommand cmd = create_command(con, "select * from act_events where '" + date_sql + "'>=(CAST(e_start as DATE)) and '" + date_sql + "'<=(CAST(e_end as DATE))")) 
      { 
       using (SqlDataReader rdr = cmd.ExecuteReader()) 
       { 
        while (rdr.Read()) 
        { 
         act_event a_event = new act_event(); 
         a_event.e_num = Convert.ToInt32(rdr["e_num"]); 
         a_event.name = rdr["e_name"].ToString(); 
         a_event.start = Convert.ToDateTime(rdr["e_start"]); 
         a_event.end = Convert.ToDateTime(rdr["e_end"]); 
         a_event.description = rdr["e_description"].ToString(); 
         a_event.address = rdr["e_address"].ToString(); 

         event_list.Add(a_event); 


        } 
       } 
      } 
     } 


     return event_list; 


    } 

這是我如何插入日期時間字段:

public void add_event(act_event add_avent) 
    { 
     using (SqlConnection con = connect("igroup20_test2ConnectionString")) 
     { 
      using (SqlCommand cmd = create_command(con, "insert into act_events values(@e_name, @e_start, @e_end, @e_description, @e_address)")) 
      { 


       cmd.Parameters.AddWithValue("@e_name", add_avent.name); 

       SqlParameter param2 = new SqlParameter("@e_start", SqlDbType.DateTime); 
       param2.Value = add_avent.start; 
       cmd.Parameters.Add(param2); 

       SqlParameter param3 = new SqlParameter("@e_end", SqlDbType.DateTime); 
       param3.Value = add_avent.end; 
       cmd.Parameters.Add(param3); 

       //cmd.Parameters.Add(new SqlParameter("@e_start", SqlDbType.DateTime)); 
       //cmd.Parameters["@e_start"].Value = DateTime.Parse(add_avent.start.ToString()); 



       //cmd.Parameters.Add(new SqlParameter("@e_end", SqlDbType.DateTime)); 
       //cmd.Parameters["@e_end"].Value = DateTime.Parse(add_avent.end.ToString()); 

       cmd.Parameters.AddWithValue("@e_description", add_avent.description); 
       cmd.Parameters.AddWithValue("@e_address", add_avent.address); 

       cmd.ExecuteNonQuery(); 
      } 

      //using (SqlCommand cmd2=create_command 
     } 


    } 

我試圖改變選擇命令,添加此:

using (SqlCommand cmd = create_command(con, "select * from act_events where ('" + date_sql + "'>=(CAST(e_start as DATE)) and '" + date_sql + "'<=(CAST(e_end as DATE))) or ('" + date_sql2 + "'>=(CAST(e_start as DATE)) and '" + date_sql2 + "'<=(CAST(e_end as DATE))) ")) 

但有些日期會給我一個錯誤:

Conversion failed when converting date and/or time from character string.

我該怎麼辦?

編輯:

我試圖運行從SQL工作室本身這樣的查詢:

select * from act_events where ('2013-08-03'>=(CAST(e_start as DATE)) and '2013-08-03'<=(CAST(e_end as DATE))) or ('2013-03-08'>=(CAST(e_start as DATE)) and '2013-03-08'<=(CAST(e_end as DATE))) 

它給了我:

enter image description here

但是,如果我跑它是這樣的:(不同日期)

select * from act_events where ('2013-07-30'>=(CAST(e_start as DATE)) and '2013-07-30'<=(CAST(e_end as DATE))) or ('2013-30-07'>=(CAST(e_start as DATE)) and '2013-30-07'<=(CAST(e_end as DATE))) 

它給了我這個錯誤:

enter image description here

EDIT2:

詹姆斯的建議後,我犯了這樣的一個參數化查詢:

String date_sql = date.ToString("yyyy-MM-dd"); 
     String date_sql2 = date.ToString("yyyy-dd-MM"); 

     using (SqlConnection con = connect("igroup20_test2ConnectionString")) 
     { 

       using (SqlCommand cmd = create_command(con, "select * from act_events where @date1>=(CAST(e_start as DATE)) and @date2<=(CAST(e_end as DATE))")) 
      { 
       cmd.Parameters.AddWithValue("@date1", date_sql); 
       cmd.Parameters.AddWithValue("@date2", date_sql); 
       cmd.Parameters.AddWithValue("@date3", date_sql2); 
       cmd.Parameters.AddWithValue("@date4", date_sql2); 

仍然將不會加載更正從SQL Server

然後t輸入我嘗試此查詢:

String date_sql = date.ToString("yyyy-MM-dd"); 
     String date_sql2 = date.ToString("yyyy-dd-MM"); 

     using (SqlConnection con = connect("igroup20_test2ConnectionString")) 
     { 

      using (SqlCommand cmd = create_command(con, "select * from act_events where (@date1>=(CAST(e_start as DATE)) and @date2<=(CAST(e_end as DATE))) or (@date3>=(CAST(e_start as DATE)) and @date4<=(CAST(e_end as DATE)))")) 
      { 
       cmd.Parameters.AddWithValue("@date1", date_sql); 
       cmd.Parameters.AddWithValue("@date2", date_sql); 
       cmd.Parameters.AddWithValue("@date3", date_sql2); 
       cmd.Parameters.AddWithValue("@date4", date_sql2); 

並再次,它只是給我:

Conversion failed when converting date and/or time from character string. 
+3

'yyyy-MM-dd'是'datetime'的一種模糊格式(但不是'date')。它根據登錄的默認語言進行解釋。 'yyyyMMdd'沒有問題。 –

回答

5

它永遠不會真的是一個好主意,試圖通過日期/到SQL的時間爲string,除非您完全確定服務器區域設置。

切換到參數化查詢應該可以解決您的問題。

+1

它並不真正受到SQL注入的影響。 'return_event_list'函數接受'DateTime'不是一個字符串。 (雖然參數化查詢可以避免這個問題,並更好地使用計劃緩存) –

+0

@MartinSmith嗯,好點,其實從來沒有注意到這一點。 – James

+0

你說我應該swith參數化查詢,但即使我從sql查詢中選擇它,它會給我這個錯誤。檢查我的編輯 – Dvirski

1

您遇到的問題,在客戶端和服務器端

你並不需要,如果你使用做任何conversionf串或日期上的一個點或另一個,無論是由於字符串到日期的轉換參數化查詢並傳遞DateTime值,當然提供的表格字段的類型也是日期類型。

下面的代碼是沒有轉換都:

DateTime date1=DateTime.Today.AddMonths(-1); 
DateTime date2=DateTime.Today.AddMonths(1); 

using (SqlConnection con = connect("igroup20_test2ConnectionString")) 
{ 

    using (SqlCommand cmd = create_command(con, 
     "select * from act_events where " + 
     " (@date1>=e_start and @date1 <= e_end) " + 
     " or (@date2>= e_start and @date2 <= e_end) ")) 
     { 
      cmd.Parameters.AddWithValue("@date1", date1); 
      cmd.Parameters.AddWithValue("@date2", date2); 

你並不需要多次指明同一日期。如果此查詢不起作用,則可能是因爲e_starte_end字段是文本字段,或者WHERE子句不符合您的預期。

您還應該檢查@date2是否正確使用。您的查詢似乎尋找覆蓋@date1或不包括@date2的記錄。它是否正確?

相關問題