我想从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
。到目前为止,下面给出的两个解决方案之间没有解决方案
答案 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);
}