سؤال

ولقد سعيت لقراءة الصورة المحفوظة في Access DB ككائن OLE في PictureBox في تطبيق C # النوافذ.

ويتم تقديم التعليمات البرمجية التي يقوم هذا أدناه:

        string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Rajesh\SampleDB_2003.mdb;";
        OleDbConnection oConn = new OleDbConnection(connString);
        oConn.Open();
        string commandString = "select * from employee where id = " + id + "";
        OleDbCommand oCmd = new OleDbCommand(commandString, oConn);
        OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess);

        while (oReader.Read())
        {
            txtID.Text = ((int)oReader.GetValue(0)).ToString();
            txtName.Text = (string)oReader.GetValue(1);
            txtAge.Text = ((int)oReader.GetValue(2)).ToString();
            txtType.Text = (string)oReader.GetValue(3);
            byte[] imageBytes = (byte[])oReader.GetValue(4);

            MemoryStream ms = new MemoryStream();
            ms.Write(imageBytes, 0, imageBytes.Length);
            Bitmap bmp = new Bitmap(ms);
            pbPassport.Image = bmp;
        }

وعندما تنفيذ التعليمات البرمجية أعلاه، وهو "معلمة غير صالح" يتم طرح استثناء في السطر:

Bitmap bmp = new Bitmap(ms)

ومن الرسالة استثناء، فمن الواضح أن "السيدة" في شكل غير معترف بها. أي اقتراح للحصول على هذا الماضي؟

هل كانت مفيدة؟

المحلول

وتلف bytestream لديك بطريقة أو بأخرى، لأني حاولت طريقة بالضبط لك ولكن ليس صحيحا صفيف بايت مع البيانات PNG من ملف بدلا من ذلك.

وأود أن أقترح خلق تيارين، واحد من قاعدة البيانات، واحد من الملفات التي كانت مصدر الصورة في قاعدة البيانات. ثم مقارنتها بايت بواسطة بايت. إذا كان هناك حتى بايت واحد من رسام، بيانات الصورة قاعدة البيانات معطوب.

نصائح أخرى

وأسف ليست لدي إجابة جيدة بالنسبة لك، ولكن أستطيع أن أقول لكم أنه عندما حاولت، وحصلت على نفس النتائج. تخطي أحيانا بايت 78 الأولى من صفيف بايت عملت، وأحيانا لم يفعل ذلك.

وذلك لأن OLE كائن نوع البيانات مخازن نوعا من رأس في هذا المجال، بحيث الوصول يعرف ما نوع كائن OLE هو عليه. لم أجد وسيلة موثوق بها للعمل على وجه الدقة أين توقف هذا الرأس وبدأ بيانات حقيقية، ولكن أعطى أيضا، حظا سعيدا لذلك:)

هل جوجل للبحث عن AccessHdr. ستجد كل ما يشير إلى AccessHdr.cpp وAccessHdr.h. وتوضيح هذه ما تحتاج إلى استخراج الجداول دون رأس.

وأنت لا تستطيع قراءة كائنات OLE بهذه السهولة. في الواقع، بل هو ممارسة سيئة للحفاظ على الصور والكائنات OLE في قاعدة البيانات.

ويفضل أن يكون م ككائنات BLOB أو مسار واسم الملف في بعض التخزين. AccessImagine يمكن التعامل مع كل السيناريوهات لMS Access و C #. يمكنك تحميله من هنا - http://access.bukrek.net

ويمكنك محاولة:

pbPassport.Image = Image.FromStream(ms);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top