+2 امتیاز

سلام 

در این داتابیس من از linq استفادە کردم و component dotnetbar  بە ار بردم

این فیلدهای تیبل هستش

id 

name

date

img  دیتاتایپ image

حالا من میخوام عکس در دیتابیسم ذخیرە کنم( با روش linq)  و  در جدول دیتا گرید مشاهدە کنم و تمام کوئری هارو روش انجام بدم 

 

عکسی از محیط برنامە

بسته شده

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام ، 

ببینید مبنای Linq to Sql بر اساس Map کردن بنا شده . یعنی هر ستون از بانک اطلاعاتی رو به یک نوع خاص تبدیل می کنه . برای ستون Image هم از کلاس System.Data.Linq.Binary استفاده می کنه . حالت کلی اینه که شما باید عکستون رو با استفاده از متدی به شکل زیر به یک سری از بایت ها تبدیل کنید و به سازنده کلاس فوق ارسالش کنید : 

private byte[] ImageToByteArray(System.Drawing.Image iimage) {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            {
                iimage.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                return stream.ToArray();
            }
        }

این تمام کاری هست که باید انجام بدین !

برای بازیابی و نمایش عکس در PictureBox هم باید مقدار ستون موجود در بانک رو که بایت هایی تشکیل دهنده ی عکس هستند رو با استفاده از کد زیر به عکس تبدیل کنید ( عکس مرحله قبل ) :

private Image ByteArrayToImage(byte[] imageBytes) {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageBytes))
            {
                Image result = Image.FromStream(stream);
                return result;
            }
        }

کد کلی مثال به شکل زیر هست ( اسم ستون عکس موجود در جدول pimage هست ) :


        private byte[] ImageToByteArray(System.Drawing.Image iimage) {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            {
                iimage.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                return stream.ToArray();
            }
        }

        private Image ByteArrayToImage(byte[] imageBytes) {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageBytes))
            {
                Image result = Image.FromStream(stream);
                return result;
            }
        }


        private void btnSaveImage_Click(object sender, EventArgs e)
        {
            
            System.Data.Linq.Binary imageBinary = new System.Data.Linq.Binary(ImageToByteArray(this.pictureBox1.Image));

            DataClasses1DataContext context = new DataClasses1DataContext();
            tablePersonel personel = new tablePersonel(){
                FirstName = "Siavash",
                LastName="Ebrahimi",
                pimage = imageBinary
            };

            context.tablePersonels.InsertOnSubmit(personel);
            context.SubmitChanges();

        }



        private void btnRestoreImage_Click(object sender, EventArgs e)
        {
            DataClasses1DataContext context = new DataClasses1DataContext();
            tablePersonel currentPersonel = context.tablePersonels.Where(p => p.Id == 27).Select(p => p).Single();
            this.pictureBox2.Image = ByteArrayToImage(currentPersonel.pimage.ToArray());
        }

 

-- سوالی در رابطه با کدها داشتید بپرسید . 

دمت گرم حاجی تونستم ذخیرە کنم ولی نتونستم اون رو با کوئری تطبیق بدم ریترایوش کنم یە ارور کوچولو میدە 

 

 کوئری بە این شکلە 

با name  سرج میکنم و فیلد یافت شدە در دیتاگرید ویو انتخاب میشە

ارور در ستون img هستش ، 

اینم سورس اگە چیزی نامفهوم بود 

 


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private byte[] ImageToByteArray(System.Drawing.Image iimage)
        {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            {
                iimage.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                return stream.ToArray();
            }
        }

        private Image ByteArrayToImage(byte[] imageBytes)
        {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageBytes))
            {
                Image result = Image.FromStream(stream);
                return result;
            }
        }

        private void buttonX1_Click(object sender, EventArgs e)
        {
            var db = new DataClasses1DataContext();
            var q = db.test_tables;
            dataGridViewX1.DataSource = q;
            
        }

        private void buttonX2_Click(object sender, EventArgs e)
        {
            System.Data.Linq.Binary imageBinary = new System.Data.Linq.Binary(ImageToByteArray(this.pictureBox1.Image));
            var db = new DataClasses1DataContext();
            test_table tb = new test_table()
            {
                id = int.Parse(textBoxX1.Text),
                name = textBoxX2.Text,
                date=dateTimeInput1.Value,       
                 img = imageBinary
            };

            db.test_tables.InsertOnSubmit(tb);
            db.SubmitChanges();
            dataGridViewX1.DataSource = db.test_tables;


        }

        private void buttonX3_Click(object sender, EventArgs e)
        {
             var db = new DataClasses1DataContext();
             int m = int.Parse(dataGridViewX1.CurrentRow.Cells[0].Value.ToString());
             var QEdit = db.test_tables.Where(c => c.id == m).Single();
             QEdit.name = textBoxX2.Text;
             QEdit.date = dateTimeInput1.Value;
             db.SubmitChanges();
             dataGridViewX1.DataSource = db.test_tables;

        }

        private void buttonX4_Click(object sender, EventArgs e)
        {
            var db = new DataClasses1DataContext();
            int m = int.Parse(dataGridViewX1.CurrentRow.Cells[0].Value.ToString());
            var QDel = db.test_tables.Where(c => c.id == m);
            if (QDel.Count() != 0) {
                db.test_tables.DeleteOnSubmit(QDel.Single());
                db.SubmitChanges();
                dataGridViewX1.DataSource = db.test_tables;
            }
        }

        private void buttonX5_Click(object sender, EventArgs e)
        {
            var db = new DataClasses1DataContext();
         
            var Qsearch = db.test_tables.Where(c => c.name.Contains(textBoxX3.Text));
            this.pictureBox2.Image = ByteArrayToImage(db.test_tables.img.ToArray());
            if (Qsearch.Count()==0)
            {
                MessageBox.Show("not found");

            }
            else {
              
                dataGridViewX1.DataSource = Qsearch;

            }
        }

        private void browse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "JPG Files(*.jpg)|*.jpg|PNG Files(*.PNG)|*.png|All Files (*.*)|(*.*)";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string picpath = dlg.FileName.ToString();
                txt_ipath.Text = picpath;
                pictureBox1.ImageLocation = picpath;
            }
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {

        }
       
    }

}

 

توسط (121 امتیاز) 1 4 10
سلام دوست عزیز...

متن اروری که در ستون img هست رو بنویس تا راهنمایی کنم
توسط (6,480 امتیاز) 6 17 129

درود 

این ارور میدە 

Error	1	'System.Data.Linq.Table<WindowsFormsApplication1.test_table>' does not contain a definition for 'img' and no extension method 'img' accepting a first argument of type 'System.Data.Linq.Table<WindowsFormsApplication1.test_table>' could be found (are you missing a using directive or an assembly reference?)	C:\Users\Sky Net\Desktop\test\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs	92	70	WindowsFormsApplication1

 

توسط (121 امتیاز) 1 4 10
این img رو کجا تعریف کردین، ستونه، فیلده، متغیره... چیه؟ طوری که از ارور مشخصه میگه که این img تعریف نشده...
توسط (6,480 امتیاز) 6 17 129

دوست عزیز این img اسم ستون هستش اون ستونی کە عکس رو بە صورت رشتە باینری توش ذخیرە میکنم

توسط (121 امتیاز) 1 4 10

سلام ببخشید دیر جواب دادم ، شما کدتون رو به صورت زیر نوشتید :

var Qsearch = db.test_tables.Where(c => c.name.Contains(textBoxX3.Text));
            this.pictureBox2.Image = ByteArrayToImage(db.test_tables.img.ToArray());

اومدید کل ستون img جدول رو به این تابع دادین ، مشخص نکردید کدوم سطرش ، کد رو به صورت زیر تغییر بدین به احتمال زیاد مشکل حل میشه ( متاسفانه الان به سیستمم در منزل دسترسی ندارم و امکان تست نیست ، هر خطایی داد متنش رو بنویسید تا اشکال زدایی بشه ) : 


var Qsearch = db.test_tables.Where(c => c.name.Contains(textBoxX3.Text));
            if (Qsearch.Count()==0)
            {
                MessageBox.Show("not found");
 
            }
            else {
                this.pictureBox2.Image = ByteArrayToImage(Qsearch.First().img.ToArray());             
                dataGridViewX1.DataSource = Qsearch;
 
            }

 

 
 
 
توسط (6,145 امتیاز) 5 11 116

مثل قبل جواب داد دمت گرم 

حالا هر کاری میکنم نمیتونم اونو داخل کوئری Edit و Delete بکنم 

برای dateTimeInput از value   استفادە کردم 

ولی برای تصویر چە باید کرد ؟

این کوئری Edit هست 

  private void buttonX3_Click(object sender, EventArgs e)
        {
             var db = new DataClasses1DataContext();
             int m = int.Parse(dataGridViewX1.CurrentRow.Cells[0].Value.ToString());
             var QEdit = db.test_tables.Where(c => c.id == m).Single();
             QEdit.name = textBoxX2.Text;
             QEdit.date = dateTimeInput1.Value;
            
             db.SubmitChanges();
             dataGridViewX1.DataSource = db.test_tables;

        }

 

و این کوئری Delete 

 

private void buttonX4_Click(object sender, EventArgs e)
        {
            var db = new DataClasses1DataContext();
            int m = int.Parse(dataGridViewX1.CurrentRow.Cells[0].Value.ToString());
            var QDel = db.test_tables.Where(c => c.id == m);
            if (QDel.Count() != 0) {
                db.test_tables.DeleteOnSubmit(QDel.Single());
                db.SubmitChanges();
                dataGridViewX1.DataSource = db.test_tables;
            }

حاجی ببخش زیاد میپرسم ..  frown

توسط (121 امتیاز) 1 4 10
سلا م این مشکل رو در قالب یه سوال جدیدمطرح بفرمایید با تشکر
توسط (6,480 امتیاز) 6 17 129
سوال جدید

2,337 سوال

2,871 پاسخ

3,725 دیدگاه

3,924 کاربر

دسته بندی ها

...