سؤال

لدي الكائن التالي:

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

أخزن هذا في 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 وظيفة المشكلة وليس التعامل مع تسليط byte[] بشكل صحيح، ربما OpenXML وظيفة SQL أو حتى حقيقة أنني أرسل XML في ك NTEXT بارع أتوقع أن تعمل وظيفة التسلسل الثنائي بشكل صحيح ولكني يمكن أن أكون مخطئا.

أي فكرة ما هي المشكلة أو ربما نهج أفضل لحفظ مجموعة من الصور في وقت واحد؟

يحرر: أعتقد أن ما يحدث، هو المسلح يجعل byte[] في سلسلة Base64، والتي يتم إقرارها بعد ذلك إلى Proc المخزنة باسم Base64. بعد ذلك حفظ سلسلة Base64 هذه في حقل صورة في SQL وقراءةها ك btye[]. وبعد لذلك أعتقد أنني بحاجة إلى الحصول عليها بطريقة أو بأخرى من base64 إلى byte[] قبل إدراجها في طاولتي؟

يحرر: أنا بدأت أعتقد أن خياري الوحيد هو تغيير PROC المخزن إلى مجرد صورة واحدة في وقت واحد وليس استخدام 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، أود أن يسقطها إلى البايت [] وتخزين ذلك في حقل نوع VARBinary (MAX) في DB.

يمكنك محاولة تحويله إلى Base64، ثم حفظه إلى حقل النص أو أي شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top