2011-07-10 49 views
2

助けてください。私はここでいくつかの話題を読んでいますが、私の質問に答えは出ません。 BLOBタイプのSQLite DBにイメージを置いて再試行しますが失敗しました。SQLiteデータベースに画像を入れて再スキャンする

だから、私はいくつかの画像(またはその他のファイル)のバイト[] rawDocを取得 rawDoc = File.ReadAllBytes(openFileDialog.FileName); を使用。私はその

byte[] imageBytes = Convert.FromBase64String(testRaw); 
     MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); 
     ms.Write(imageBytes, 0, imageBytes.Length); 
     pictureBox1.Image = Image.FromStream(ms, true); 

rawDocを確認しようとした場合、その後

String dbConnection = "Data Source=dbase.s3db"; 
SQLiteConnection cnn = new SQLiteConnection(dbConnection); 
cnn.Open(); 
String sql = String.Format("INSERT INTO registry" + 
      "(NameDoc, YearDoc, MonthDoc, DayDoc, RawDoc) VALUES" + 
      "('{0}', '{1}', '{2}', '{3}', '{4}')", 
      txtNameDoc.Text, numUDYear.Value, numUDD.Value, numUDD.Value, Convert.ToBase64String(rawDoc)); 

私は、通常の画像を取得します。しかし、もし私がSQLiteベースのデータでそれをしようとすると

SQLiteCommand myCommand = new SQLiteCommand(query, cnn); 
     SQLiteDataReader myDataReader = myCommand.ExecuteReader(); 

     string raw = null; 
     while (myDataReader.Read()) 
     { 
      raw += myDataReader["RawDoc"].ToString().Trim(); 

     } 

     myDataReader.Close(); 
byte[] imageBytes = Convert.FromBase64String(raw); 
     MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); 
     ms.Write(imageBytes, 0, imageBytes.Length); 

     imageBox imgbox = new imageBox(); 
     PictureBox picBox = new PictureBox(); 
     picBox.Image = Image.FromStream(ms, true); 
     imgbox.Controls.Add(picBox); 
     imgbox.Show(); 

私はエラーが発生します:FormatException。文字列Base-64に無効な文字があります。どうして?

ありがとう!

+0

Mmm ....私はあまりにも多くの変換を私には、何かが間違っている – Tigran

答えて

2

バイト配列をベース64文字列に変換する必要はありません。あなたのデータベースには何もないスペースを使用するだけです。さらに、BLOBではなく、実際にはsqliteデータベースにTEXTデータがあります。あなたはBLOBを取得するとき、

SQLiteCommand command = cnn.CreateCommand(); 
command.CommandText = String.Format("INSERT INTO registry" + 
     "(NameDoc, YearDoc, MonthDoc, DayDoc, RawDoc) VALUES" + 
     "('{0}', '{1}', '{2}', '{3}', @0)", 
     txtNameDoc.Text, numUDYear.Value, numUDD.Value, numUDD.Value); 
SQLiteParameter parameter = new Parameter("@0", System.Data.DbType.Binary); 
parameter.Value = rawDoc; 
command.Parameters.Add(parameter); 
command.ExecuteNonQuery(); 

あなたSQliteDataReaderから、このようにそれを得る:あなたがする必要がどのような

はあなたのBLOBを挿入するたとえば、あなたがこのような何かを行うことができ、使用SqliteParametersある

byte[] imageBytes = (System.Byte[])myDataReader["RawDoc"]; 

EDIT

はあなたしているコメントに答えるために、私はあなたのストリームが再勝利する必要があろうと推測していますded。いずれにせよ、これは私がもっとこのようにそれを行うだろうです:

MemoryStream ms = new MemoryStream(imageBytes); 
    PictureBox picBox = new PictureBox(); 
    picBox.Image = Image.FromStream(ms, true); 

EDIT 2

その後、私は問題はあなたのDataReaderから取り出す方法であると思います。

string raw = ""; 
    while (myDataReader.Read()) 
     raw = (string)myDataReader["RawDoc"]; 

これはおそらくまだ取得したすべてのレコードを超えるループの繰り返し処理として壊れているので、あなたが取得した最後のレコードの画像になってしまいます。もっとこのような何かを試してみてください。

+0

ありがとう。それは動作しますが、私はここでエラーがある理由を説明することができます:picBox.Image = Image.FromStream(ms、true); – 6yt9Bka

+0

動作しません。例外を渡す:パラメータが無効です。 – 6yt9Bka

+0

コードを今すぐ更新し、例外をスローする行を指定してください。 –

関連する問題