使用wpf在C#中将sqlite db中的Datetime值分配给datepicker

时间:2013-10-09 17:07:26

标签: c# sqlite datetime datepicker wpf-controls

我想从Sqlite数据库中读取日期时间值并将其分配给datepicker控件。这是我正在尝试的代码:

try
{
    sqlitecon.Open();
    string Query = "Select * from Customer_New where Cust_Id='" + val + "'  ";
    SQLiteCommand createCommand = new SQLiteCommand(Query, sqlitecon);
  //  createCommand.ExecuteNonQuery();
    SQLiteDataReader dr = createCommand.ExecuteReader();
    while(dr.Read()){
        date_open.DisplayDate = Convert.ToDateTime(dr.GetString(0));
       Date_Joining.DisplayDate = Convert.ToDateTime(dr.GetString(1));     
        txt_Title.Text = dr.GetString(3);
    }                
    sqlitecon.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

但是它给出了错误specified cast is not valid。到目前为止,下面给出的两个解决方案之间没有解决方案

2 个答案:

答案 0 :(得分:0)

SQLiteDataReader可能抛出异常,因为它无法将字段值转换为字符串(可能是DBNull)。如果表中有可空字段,请先尝试使用IsDBNull函数检查空值,然后再尝试读取该值。 Convert.ToDateTime()在出错时抛出FormatException

答案 1 :(得分:0)

当您尝试从数据库表中读取数据时,一个好习惯是仅检索后续代码确实需要的列。在您的示例中,您从表中检索所有内容。列的返回顺序与它们在数据表中的显示顺序相同。这意味着第一列应该是date_open的值,第二列应该是data_join的值。

可能更好的方法是明确说出select查询中列的名称,使用Cust_ID搜索键的参数并使用reader的GetDateTime,而不是将all转换为字符串,再将其转换为日期。

在此示例中,我假设您的表中有三列名为dateopen, datajoin and title。你应该使用你的真实姓名。

try
{
     sqlitecon.Open();
     string Query = "Select dateopen, datejoin, title from Customer_New where Cust_Id=@id";
     SQLiteCommand createCommand = new SQLiteCommand(Query, sqlitecon);
     createCommand.Parameters.AddWithValue("@id", val);
     SQLiteDataReader dr = createCommand.ExecuteReader();
     while(dr.Read())
     {
        // If there is the possibility of a NULL field then protect the assignement
        // with a check for DBNull.Value before the assignement
        if(!dr.IsDBNull(0))
            date_open.DisplayDate = dr.GetDateTime(0));
        if(!dr.IsDBNull(1))
            Date_Joining.DisplayDate = dr.GetDateTime(1));     
        if(!dr.IsDBNull(2))
            txt_Title.Text = dr.GetString(2);
    }                
    sqlitecon.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}