2013-02-06 3 views
0

SQL 데이터베이스에 이미지를 성공적으로 저장할 수 있습니다. 이미지 용 필드가 varchar50입니다. 이 내가 오류 이미지를 저장하기위한SQL에서 C에서 이미지 검색 #

코드 편집

byte image=Convert.ToByte(dt.Rows[0]["image"]); 

에 "입력 문자열이 corret 형식이 아니었다"

되어 얻고

DataTable dt=new DataTable(); 
dt=neworder.Selectfromimage1(); 

if (dt.Rows.Count > 0) 
{ 

// byte[] image =(byte[])dt.Rows[0]["image"]; 
byte image=Convert.ToByte(dt.Rows[0]["image"]); 
MemoryStream stream = new MemoryStream(image); 
//stream.Write(image, 0, image.Length); 
stream.Seek(0, 

SeekOrigin.Begin); 
stream.Close(); 

btncompanion.Image = 

Image.FromStream(stream); 
} 

을 시도하는 코드입니다

private byte[] ImageToStream(string fileName) 
{ 

MemoryStream stream = new MemoryStream(); 
tryagain: 

try 
{ 

    Bitmap image = new Bitmap(fileName); 
    image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 

    // image.Save(stream, System.Drawing.Imaging.ImageFormat.Gif); 
} 

catch (Exception) 
{ 

    goto tryagain; 
} 

return stream.ToArray(); 
} 
fName ="C:\\Documents and Settings\\KAEM\\My Documents\\My Pictures\\images.jpg"; 
if (File.Exists(fName)) 
{ 

int id = 2; 
byte[] content = ImageToStream(fName); 
if (neworder.Insertintoimage1(content.ToString())) 
{ 

} 

} 

else 
{ 

MessageBox.Show(fName + " not found "); 
} 
+0

당신이 이미지에 바로 파일 시스템 경로의 이미지 바이트를 저장할 수 있습니까? – Adi

+0

네, 그냥 경로, 저장 코드도 추가했습니다. – Kashif

+1

'goto'를 확인하십시오. ?? 너 미쳤 니 ?? –

답변

0

varchar 문자열을 생성하기 위해 데이터가 인코딩 된 방법을 파악해야합니다. 이 base64로 인 경우 예를 들어, Convert.FromBase64String을 사용합니다 :

byte[] image = Convert.FromBase64String(dt.Rows[0]["image"]) 

를 이제 이미지를 저장 한 것 때문에, 당신이이 인코딩 방법을 알고 있어야하고 얻을 수있는 역 과정을 수행 할 수 있어야한다 다시.

+0

어떻게 확인할 수 있습니까? – Kashif

+0

누락 된 것이 있으면 저장해 두는 코드도 추가했습니다. – Kashif

0

데이터베이스 경로를 이미지에 저장합니다. 귀하의 코드는 다음과 같아야합니다

string imagePath=dt.Rows[0]["image"].ToString(); 
      byte[] imageBytes; 
      using (FileStream fs = File.Open(imagePath)) { 
       btncompanion.Image = Image.FromStream(fs); 
      } 

이 시도, 읽으려고하기 전에 스트림을 닫는

+0

자세히 보면 경로를 저장하지 않습니다. 그러나 그는 이미지 바이트를 문자열로 저장하는데, 이것은 나쁘다. –

0

을 테스트하지. 그건 작동하지 않습니다. 다음을 시도해야합니다 : 그 일을하고 GDI + 오류를 제공하지 않을 경우 이미지가 직렬화하기 전에 스트림이 닫혀 있기 때문에

byte[] image=Convert.ToByte(dt.Rows[0]["image"]); 
using (MemoryStream stream = new MemoryStream(image)) 
{ 
    btncompanion.Image = Image.FromStream(stream); 
} 

는, 그입니다.

byte image=Convert.ToByte(dt.Rows[0]["image"]); 
MemoryStream stream = new MemoryStream(image); 
btncompanion.Image = Image.FromStream(stream); 

또한, 이미지를 저장하는 코드에서 이미지 파일로부터 바이트를 얻을 수 있지만, 데이터베이스에 string로 전달 :이 경우에 사용합니다. 이미지 바이트가 문자열에서 제거되거나 문자열을 종료 할 수있는 인쇄 할 수없는 바이트를 포함 할 수 있다는 사실을 알고 있습니까?

이미지를 문자열로 저장하거나 최소한 기본 64 인코딩을 사용하지 마십시오. 그 코드는 읽을 것입니다 :

if (File.Exists(fName)) 
{ 
    byte[] content = ImageToStream(fName); 
    string contentBase64 = Convert.ToBase64String(content); 
    if (neworder.Insertintoimage1(contentBase64)) 
     .... 
} 

및 검색 :

string image = dt.Rows[0]["image"]; 
byte[] imageBytes = Convert.FromBase64String(image); 

MemoryStream stream = new MemoryStream(imageBytes); 
btncompanion.Image = Image.FromStream(stream); 
+0

마지막 줄의 코드가 base64에 오류를 발생합니다 – Kashif

+0

마지막 줄의 코드 샘플은 무엇입니까? 내 제안은 이미지를 저장하는 문자열을 사용하지 않고 C#의'byte []'인'BINARY' 필드를 사용하는 것입니다. 그렇게하면 아무 것도 변환 할 필요가 없습니다. –

+0

당신의 @Thorsten Dittmar 검색 중 문자열 이미지 = dt.Rows [0] [ "image"]; byte [] imageBytes = 변환.FromBase64String (이미지); MemoryStream stream = 새 MemoryStream (imageBytes); btncompanion.Image = Image.FromStream (stream); – Kashif