2011-12-13 8 views
2

私はC#でクライアントアプリケーションを持っています。これは画像の場所を取ることを意味します。(DataType: VarChar)このアプリケーションは、Webサービスを呼び出し、ローカルのMySQLデータベースにイメージ(場所ではありません)を格納します。C#アプリケーションでMySQLに画像を保存

問題は、フォームから他のすべてのデータをイメージに渡すことができることに気がつきました。誰かが私がここで間違っていることを指摘できますか?どんな助けでも大歓迎です。

ps - 私は多くの人が、データベース自体ではなく、ファイルシステムにイメージを保存するように提案してくれることを知っています....しかし、事実、データベースはそれほど大きくないので、データベース自体のイメージは、取引の大きなうまくいけばということではありません:)

ここ

create table testImage(
id int not null auto_increment, 
name varchar(50), 
age int, 
image blob, 
primary key(id)); 

そして、ここでは、テーブルにデータを挿入するためのものですWebMethodでは、MySQLの私のテーブルです。 .. imageフィールドがコメントアウトされているときに機能します。

[WebMethod] 
     public string sendDataToMySql(string get_name, int get_age, byte[] buffer) 
     { 
      string MyConString = "SERVER=localhost;" + 
        "DATABASE=test;" + 
        "UID=root;" + 
        "PASSWORD=password;"; 

      string name_new = get_name; 
      int age_new = get_age; 
      byte[] buffer_new = buffer; 


      MySqlConnection connection = new MySqlConnection(MyConString); 
      connection.Open(); 
      MySqlCommand command = new MySqlCommand("", connection); 
      command.CommandText = "insert into testdata(name, age, image) values(@name, @age, @image);"; 

      command.Parameters.AddWithValue("@name", name_new); 
      command.Parameters.AddWithValue("@age", age_new); 
      command.Parameters.AddWithValue("@image", buffer_new); 

      command.ExecuteNonQuery(); 

      connection.Close(); 

      return "Task Performed!"; 

     } 
+0

BLOBストレージ...あなたはバイト[]適切 – MethodMan

+0

を生成している作るためにあなたがこれを行うコードを確認する必要があります画像はBLOBとして保存されます。 – BurninatorDor

答えて

4

私はそれがあるとして、あなたは、単にbufferパラメータを使用することができ、あなたがすべてでbuffer_new変数を宣言する必要はないと思います。

私の推測では、あなたが @Imageパラメータに MySql.Data.MySqlClient.MySqlDbType.Blobデータ型を割り当てる必要があることだけ AddWithValue ...フル例えばここ

チェックされていない

Insert blob into MySQL

+0

ありがとう!リンクは大きな助けとなりました!しかし、私は何かについて混乱しています。そのリンクに与えられた最後のコードスニペット....なぜそれは必要ですか?さらに、 'FileToArray'、' MySQL_File_Save'、 'MimeType'をどのように参照するのですか? – BurninatorDor

+3

リンクが死んでいるようです。 – Ignatius

0
System.IO.BufferedStream bf = new BufferedStream(httpFile.InputStream); 
byte[] buffer = new byte[bf.Length]; 
bf.Read(buffer,0,buffer.Length);  

その後、あなたのバッファを渡します入力文。データ型を処理するには、BLOB型である必要があります。 また、MIMEタイプを取得し、サポートしたいMIMEタイプのフィルタを用意する必要があります。そうしないと、データベースに何が入っているのかに問題が発生する可能性があります。

private string getFileExtension(string mimetype) 
{ 
    mimetype = mimetype.Split('/')[1].ToLower(); 
    Hashtable hTable = new Hashtable(); 
    hTable.Add("pjpeg","jpg"); 
    hTable.Add("jpeg","jpg"); 
    hTable.Add("gif","gif"); 
    hTable.Add("x-png","png"); 
    hTable.Add("bmp","bmp"); 

    if(hTable.Contains(mimetype)) 
    { 
     return (string)hTable[mimetype]; 
    } 
    else 
    { 
     return null; 
    }   
} 
+0

あなたの答えを編集し、コードを適切にフォーマットしてください:) –

0

ブロブは、一つの方法は、Parameters.Add( "@のFileimage" MySqlDbType.MediumBlob)を使用することなく挿入クエリで16進文字列をバイト配列を渡すことである

http://dev.mysql.com/doc/refman/5.0/en/hexadecimal-literals.html

hexagecimal値です。あなたが私にダブルチェックもどのようにバイトのデータを生成しているとしましょうBinaryWriterを行う必要があり

 MySqlConnection con = new MySqlConnection("Server=localhost;Database=bd_prueba;Uid=root;Pwd=Intel-IT;"); 
     FileStream fs = new FileStream(@"D:\proyectos2.jpg", FileMode.Open, FileAccess.Read); 

     byte[] rawData = new byte[fs.Length];   
     fs.Read(rawData, 0, (int)fs.Length); 
     fs.Close(); 
     //byte[] to HEX STRING 
     string hex = BitConverter.ToString(rawData); 
     //'F3-F5-01-A3' to 'F3F501A3' 
     hex = hex.Replace("-", ""); 

     con.Open(); 
     //Standart VALUE HEX x'F3F501A3' 
     string SQL = @"INSERT INTO tabla(id,fileimage) VALUES ('stringhex',x'"+hex+"')"; 
     MySqlCommand cmd = new MySqlCommand(); 
     cmd.Connection = con;    
     cmd.CommandText = SQL; 
     cmd.ExecuteNonQuery(); 

     con.Close(); 
関連する問題