2017-03-06 8 views
1

私は、DateTime列を含むデータテーブルを持つデータベースを持っています。 SQLiteのを使用して実行するようにコードを変更した後データベースからSQLiteのDateTime値を読み込み、それをC#の文字列変数に割り当てる

SqlCommand getdate = new SqlCommand("SELECT * FROM EMPinfo WHERE id = @employeeId", connect); 
       getdate.Parameters.AddWithValue("@employeeId", listViewEmployee.SelectedItems[0].SubItems[2].Text); 
       getdate.Connection = connect; 
       connect.Open(); 
       SqlDataReader readList = getdate.ExecuteReader(CommandBehavior.CloseConnection); 
       while (readList.Read()) 
       { 
        lblEmpDob.Text = ((DateTime)readList["dob"]).ToString("d"); 
       } 

:SQLサーバーを使用している場合、私は次のコードを使用して、データベースからDateTime値を読むことができる

SQLiteConnection connect = new SQLiteConnection(@"Data Source=quotevodata.db;"); 
       SQLiteCommand getlistname = new SQLiteCommand("SELECT * FROM EMPinfo WHERE id = @employeeId", connect); 
       getlistname.Parameters.AddWithValue("@employeeId", listViewEmployee.SelectedItems[0].SubItems[2].Text); 
       getlistname.Connection = connect; 
       connect.Open(); 
       SQLiteDataReader readList = getlistname.ExecuteReader(CommandBehavior.CloseConnection); 
       while (readList.Read()) 
       { 
        lblEmpDob.Text = ((DateTime)readList["dob"]).ToString("d"); 

       } 

を私は次のエラーを取得しておいてください。 "文字列が有効な日時として認識されませんでした。

私は異なる組み合わせと変数の宣言を試みたが、それはワークアウトではないです。 SQLiteデータベースからDateTime値を読み取るための正しい設定は何ですか?

+0

シンプルキャストの代わりに 'Convert.ToDateTime(readList [" dob "])'を使ってみましたか? – erikscandola

+0

@erikscandolaあなたが投稿したものは*「シンプルキャスト」、つまりデフォルトの「DateTime」への変換です。 –

答えて

0

おかげで、私は最終的に示唆したように、それはSQLiteの形式にINSERT文を変更することで動作するようになった:

string empDob = dateDOB.Value.ToString("yyyy-MM-dd"); 
    //I then inserted this string into the database with the column configured as a "DATE" datatype. 

後部それで、私は次のステートメントを使用して、日付を使用可能な文字列にフォーマットし、それはきれいに働いた:

私は本当に助けていただきありがとうございます。

4

SQLiteは、内蔵のDateTimeオブジェクトを持っているのではなく、テキスト、実数、またはINT値としてそれらを格納しません。

エラーから、テキストとして出力していると推測できます。 SQLiteのドキュメントによると、 "YYYY-MM-DD HH:MM:SS.SSS"の形式にする必要があります

これをDateTimeオブジェクトに解析する方法はいくつかありますが、RegEx:

public static DateTime ConvertToDateTime(string str) 
{ 
    string pattern = @"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\.(\d{3})"; 
    if (Regex.IsMatch(str, pattern)) 
    { 
     Match match = Regex.Match(str, pattern); 
     int year = Convert.ToInt32(match.Groups[1].Value); 
     int month = Convert.ToInt32(match.Groups[2].Value); 
     int day = Convert.ToInt32(match.Groups[3].Value); 
     int hour = Convert.ToInt32(match.Groups[4].Value); 
     int minute = Convert.ToInt32(match.Groups[5].Value); 
     int second = Convert.ToInt32(match.Groups[6].Value); 
     int millisecond = Convert.ToInt32(match.Groups[7].Value); 
     return new DateTime(year, month, day, hour, minute, second, millisecond); 
    } 
    else 
    { 
     throw new Exception("Unable to parse."); 
    } 
} 

ドキュメント:回答をhttp://www.sqlite.org/datatype3.html

+1

提案に感謝しますが、これは文字列形式の日付を私が達成しようとしていないDateTime形式に変換するようです。私はデータベースからDateTime形式で完全に正常に保存された日付を、データベースから読み込み、文字列形式のラベルを使って表示したいと思います。 – pallMallchemist

+0

@pallMallchemistデータベースによって返されるオブジェクトは、明らかに文字列です。この関数を追加し、コード行をlblEmpDob.Text = ConvertToDateTime(readList ["dob"])に変更してください。ToString( "d"); – JonBee

0

なぜ2回変換するのですか?

あなたは、プロバイダがあなたのためにそれをうまく管理することができますSQLiteの日付列を持っている場合。 DateTimeとして挿入し、DateTimeとして読み込むことができます。

+0

何らかの理由で、日付を読み取り、ラベルに直接割り当てても、 ".ToString(" d ")"機能を使って日付をフォーマットすることはできません。最初にDataeTimeフォーマットを使用する – pallMallchemist

+0

あなたのソリューションでは 'dateDOB'(これはおそらくNullable日付です)ですが、挿入する文字列に変換する必要はありません。また' readList ["dob"] 'はDate(またはNullableなぜなら、DateTime?dateOfBirthEmp = readList ["dob"]をDateTimeとして使用しないのはなぜですか? – PinBack

関連する問題