문제

다음과 같은 개체가 있습니다.

[Serializable]
public class ExampleImage
{
    public int ID { get; set; }
    public string Filename { get; set; }
    public byte[] Content { get; set; }
}

나는 이것을 a에 보관한다 List<ExampleImage> 그런 다음 다음 기능으로 전달하여 문자열로 직렬화합니다.

static string SerializeObjectToXmlString(object o)
{
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(o.GetType());
    System.IO.StringWriter writer = new System.IO.StringWriter();
    serializer.Serialize(writer, o);
    return writer.ToString();
}

그런 다음이 직렬화 된 문자열을 저장 프로 시저로 전달합니다. SQL2000 로서 NTEXT 그런 다음 데이터베이스에 삽입하기 위해 처리했습니다.

SELECT * INTO #TempImages
FROM OpenXML(@iDoc, '/ArrayOfExampleImage/ExampleImage')
WITH ([Filename] VARCHAR(255) './Filename', [Content] IMAGE './Content')

내가 가지고있는 문제는 이미지가 쓰레기가 쓰고 있다는 것입니다. 그만큼 btye[] DB에 제대로 저장되지 않습니다. 다른 분야는 괜찮습니다. XML을 통해 이진 데이터를 SQL로 보내려고 시도한 것은이 시점에서 문제가 발생할 가능성이 가장 높습니다. 내 SerializeObjectToXmlString 문제를 작동 시키면 A의 직렬화를 처리하지 않습니다. byte[] 적절하게, 아마도 OpenXML NTEXT 파라. 직렬화 기능이 이진을 올바르게 인코딩 할 것으로 예상하지만 잘못 될 수 있습니다.

편집하다: 나는 무슨 일이 일어나고 있다고 생각합니다. 시리얼 라이저가 byte[] btye[]. 그래서 나는 어떻게 든 base64에서 byte[] 내 테이블에 삽입하기 전에?

편집하다: 내 유일한 옵션은 저장된 Proc를 한 번에 1 개의 이미지를 1 개 씩 수행하고 XML을 사용하지 않고 전달하는 것입니다. byte[] 로서 Image 거래에서 모든 통화를 입력하고 랩핑하십시오.

도움이 되었습니까?

해결책

Gaidin이 제안한 것처럼 Base64가 최선의 선택입니다. 이진 데이터를 XML에 작성하는 일반적인 방법입니다. 다음 코드를 사용할 수 있습니다.

public class ExampleImage
{
    public int ID { get; set; }
    public string Filename { get; set; }

    [XmlIgnore]
    public byte[] Content { get; set; }

    [XmlElement("Content")]
    public string ContentBase64
    {
        get { return Convert.ToBase64String(Content); }
        set { Content = Convert.FromBase64String(value); }
    }
}

(그건 그렇고, Serializable 속성은 XML 직렬화에 대한 의미가 없습니다)

다른 팁

XML로 직렬화하는 대신 바이트 []로 직렬화하고 DB의 varbinary (max) 유형 필드에 저장합니다.

Base64로 변환 한 다음 텍스트 필드 등으로 저장할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top