【问题标题】:get selected date from calender and save it to sql server从日历中获取选定的日期并将其保存到 sql server
【发布时间】:2015-10-05 03:20:31
【问题描述】:

我想从monthCalender1 中获取选定的日期并从 SQL Server 表中检索我的数据。但我收到异常消息

无法转换为日期时间格式

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 rtf_date=@dt 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();
          }
        }

【问题讨论】:

    标签: c# sql-server


    【解决方案1】:

    不要一直将日期转换为字符串(然后向下两行将其解析回DateTime ....)-停止这样做!按原样使用 DateTime ... 另外:SQL Server 中的 DATETIME 没有格式 - 它是一个 8 字节的二进制值 - 只有当您需要将其作为字符串输出(或从字符串解析 -但尽量避免这种情况!)。

    把你的代码改成这样:

    cmd = new SqlCommand("SELECT rtf_file_content FROM rtf WHERE rtf_date=@dt 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 rtf_date=@dt 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));
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 我是 c# 新手。谢谢。这对我很有帮助。它工作正常
    猜你喜欢
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2023-03-30
    • 2014-08-09
    相关资源
    最近更新 更多