2015-10-04 66 views
1

我想从monthCalender1中选择日期并从SQL Server表中检索我的数据。但我得到的异常信息从日历中获取选定日期并将其保存到sql server

无法转换为datetime格式

SQL Server表的日期格式是 “DD/MM/YYYY”

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) 
{ 
      rtbDocument.Clear(); 
      SqlConnection cn = null; 
      SqlCommand cmd = null; 
      SqlDataReader reader = null; 

      string date = monthCalendar1.SelectionRange.ToString(); 

      System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-CA"); 
      DateTime dt = DateTime.Parse(date); //uses the current Thread's culture 
      CultureInfo provider = CultureInfo.InvariantCulture; 
      textBox1.Text = date; 

      try 
      { 
      cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\User\Desktop\myproject_c#\diary\photogallery\RicherTextBox_src\RicherTextBox\diary.mdf;Integrated Security=True;User Instance=True;"); 
      cn.Open(); 
      cmd = new SqlCommand("SELECT rtf_file_content FROM rtf WHERE [email protected] AND user_rtf_id=1", cn); 
      cmd.Parameters.AddWithValue("@dt", dt); 
      reader = cmd.ExecuteReader(); 
      reader.Read(); 
      if (reader.HasRows) 
      { 
       if (!reader.IsDBNull(0)) 
       { 
       Byte[] rtf = new Byte[Convert.ToInt32((reader.GetBytes(0, 0, 
                 null, 0, Int32.MaxValue)))]; 
       long bytesReceived = reader.GetBytes(0, 0, rtf, 0, rtf.Length); 
       ASCIIEncoding encoding = new ASCIIEncoding(); 
       rtbDocument.Rtf = encoding.GetString(rtf, 0, Convert.ToInt32(bytesReceived)); 

       } 
      } 
      } 
      catch(Exception ex) 
      { 
      MessageBox.Show(ex.Message); 
      } 
      finally 
      { 
      if (null != reader) reader.Close(); 
      if (null != cn) cn.Close(); 
      } 
     } 

回答

2

不要将您的日期到字符串的所有时间(然后两行下来解析它回到DateTime ....) - 停止这样做!按照原样使用DateTime ... SQL Server中的DATETIME没有格式 - 它是一个8字节的二进制值 - 它只在需要将其输出为字符串时(或从字符串解析它)获取格式 - 但尝试尽可能地避免!)。

更改您的代码是这样的:

cmd = new SqlCommand("SELECT rtf_file_content FROM rtf WHERE [email protected] AND user_rtf_id=1", cn); 
cmd.Parameters.Add("@dt", SqlDbType.DateTime).Value = monthCalendar1.SelectionStart; 

,这一切你需要做的 - 没有与格式字符串日期文字或类似的东西搞乱 - 只需使用的日期,因为它们!

我还建议把你SqlConnectionSqlCommandSqlDataReader变量引入using(..) { ... }块,以确保使用后立即和妥善处置,读者的处理也有点靠不住.....

我将使用此代码作为一个整体:

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) 
{ 
    rtbDocument.Clear(); 

    // set up your connection string (typically from a config) and query text 
    string connString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\User\Desktop\myproject_c#\diary\photogallery\RicherTextBox_src\RicherTextBox\diary.mdf;Integrated Security=True;User Instance=True;"; 
    string query = "SELECT rtf_file_content FROM rtf WHERE [email protected] AND user_rtf_id=1"; 

    // set up connection and command - both are disposable, put them in a "using" block 
    using (SqlConnection cn = new SqlConnection(connString)) 
    using (SqlCommand cmd = new SqlCommand(query, conn)) 
    { 
     // set up parameter for query 
     // define the parameter to be a "DateTime" parameter 
     // set value directly from a "DateTime" property of your "monthCalendar1" 
     cmd.Parameters.Add("@dt", SqlDbType.DateTime).Value = monthCalendar1.SelectionStart; 

     // open connection, execute reader... 
     conn.Open(); 

     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      // loop over reader - reading all rows being returned by query 
      while (reader.Read()) 
      { 
       if (!reader.IsDBNull(0)) 
       { 
        Byte[] rtf = new Byte[Convert.ToInt32((reader.GetBytes(0, 0, null, 0, Int32.MaxValue)))]; 
        long bytesReceived = reader.GetBytes(0, 0, rtf, 0, rtf.Length); 
        ASCIIEncoding encoding = new ASCIIEncoding(); 
        rtbDocument.Rtf = encoding.GetString(rtf, 0, Convert.ToInt32(bytesReceived)); 
       } 
      } 
     } 
    } 
} 
+0

我是新来的C#.thanks.this是如此有用的me.it的工作正常 –

相关问题