PDA

View Full Version : تغییر مقادیر یک datatable در dataset (برای گزارش گیری)



aliaghaaaaa
شنبه 25 آبان 1392, 12:59 عصر
سلام.
من یه مشکل تو گزارش گیری دارم و یه راه حل براش به ذهنم رسیده. ولی به یه مشکل دیگه برخوردم. حالا همش رو می نویسم و از دوستان تقاضا دارم اگه راه حل بهتری دارن یا می تونن مشکم رو برطرف کنند یه کمک بکنن. ممنون.
من یه فرم تو گزارشم درست کردم که یه عکس باید بیوفته بالاش و عکس تو هارد هست نه تو دیتابیس.
من یه view از دیتابسم درست کردم ( به عنوان منبع اطلاعاتی برای گزارشم) بعد اونو گذاشتم تو دیتاست و ازش گزارشم رو ساختم.

مشکل:
از اونجایی که فیلد عکس تو دیتاستم نیست نتونستم عکس خاصی که می خوام رو بزارم تو گزارش.
البته توسط هر کوئری که گزارش چاپ میشه، باید عکس خاص خودش بیاد تو گزارش. مثل گزارش مشخصات فردی که عکس شخص باید چاپ بشه.
راه حل من:
من می خوام یه فیلد باینری تو datatable ای که بوسیله view توی دیتاستم ساختم اضافه کنم. بعدش موقعی که می خوام فرم گزارش رو لود کنم عکسم رو از هارد بخونم و تبدیل به باینری کنم و بریزم تو اون فیلدی که به datatable اضاف کردم.
Datatable هم که تو گزارش لود میشه، عکس رو نشون میده.
حالا مشکلی که با این روش دارم اینه:
اینکه یه فیلد باینری اضاف کنم به datatable رو بلدم. اما کدی که بتونم بهش مقدار بدم رو بلد نیستم
اگه میشه در این مورد کمک کنید.
مرسی.

fmehrvarzi
شنبه 25 آبان 1392, 15:10 عصر
من برا کار با تصویر از این کدها استفاده کردم و این کدها برا من کار کرد:

/*****اضافه کردن عکس به فرم*********/
عکس رو میتوان از این طریق به یک پیکچر باکس اضافه کرد.


if (openFileDialog.ShowDialog() == DialogResult.OK)
{
fileName = openFileDialog.FileName;
pictureBox1.Image = Image.FromFile(fileName);
}


/********ذخیره کردن عکس از کامپیوتر به دیتابیس اس کیو ال********/
تبدیل ایمیج به باینری



private string fileName = @"C:\Users\Windows\Documents\client.jpg";
Image img;
img = Image.FromFile(fileName);
byte[] bar = ImageToByteArray(img);


که در آن تابع ImageToByteArray
را به صورت زیر تعریف کنید:


public byte[] ImageToByteArray(Image img)
{
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
return ms.ToArray();
}
}


و یادت باشه ذخیره تصویر در دیتابیس اس کیو ال باید در یک ستونی از نوع varbinary(MAX)
باشد.

/********* فراخوان عکس از اس کیو ال به روی فرم ویندوزی********/
تابع loadPicture عکس را در دیتا ستتان پر می کند
که در آن از تابع
byteArrayToImage()
استفاده شده که در زیر تعریف شده است.


private void loadPicture()
{
string conn = global::Motaleh.Properties.Settings.Default.Conn;
SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT Pic FROM Users WHERE UserID = "+FormMain.UserID, conn);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);

if (dataSet.Tables[0].Rows.Count == 1)
{

Byte[] data = new Byte[0];
data = (Byte[])(dataSet.Tables[0].Rows[0]["Pic"]);
Image img = byteArrayToImage(data);
yourPictureBox.Image = (Image)img.Clone();

}
}

و تابع byteArrayToImage به صورت زیر تعریف می شود

public System.Drawing.Image byteArrayToImage(byte[] byteArrayIn)
{
System.Drawing.Image returnImage = null;
try
{
MemoryStream ms = new MemoryStream(byteArrayIn);
returnImage = System.Drawing.Image.FromStream(ms); // Here I am getting Parameter is not valid' error.
}
catch (Exception e)
{
//string str = e.Message;
MessageBox.Show(e.Message);
}
return returnImage;
}

aliaghaaaaa
یک شنبه 26 آبان 1392, 08:27 صبح
سلام.
من نمی خوام عکس رو تو دیتابیس بریزم.
من می خوام عکس رو از تو هارد یه راس بریزم تو دیتاست. (بدون اینکه دیتابیس رو دخیل کنم).

fmehrvarzi
شنبه 02 آذر 1392, 20:10 عصر
در این صورت باید جدول را خودتان تعریف کنید و سپس به دیتا ست اضافه کنید این کدها برا من کار کردن
کافیه یه پروژه ویندوزی ایجاد کنید که یک پیکچرباکس و یه باتن داشته باشه اصل کدهاش به صورت زیر است :


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 imageFromHardToDataTableToForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

DataSet ds;
private void button1_Click(object sender, EventArgs e)
{
//Create a new DataTable.
DataTable dt = new DataTable("tblTest");
DataColumn column;
DataRow row;

//Create new DataColumn, set DataType, ColumnName
//and add to DataTable.
column = new DataColumn();
column.DataType = System.Type.GetType("System.Byte[]");
column.ColumnName = "Pic";
column.AutoIncrement = false;
column.Caption = "ParentID";
column.ReadOnly = false;
column.Unique = false;
dt.Columns.Add(column);
ds = new DataSet();
//add datatable to dataset
ds.Tables.Add(dt);

//read image from hard
string fileName = @"C:\Users\Windows\Documents\client.jpg";
Image img;
img = Image.FromFile(fileName);
byte[] bar = ImageToByteArray(img);

//Create a row and add to dt
row = dt.NewRow();
row["Pic"] = bar;
dt.Rows.Add(row);



if (ds.Tables[0].Rows.Count == 1)
{

Byte[] data = new Byte[0];
data = (Byte[])(ds.Tables[0].Rows[0]["Pic"]);
Image imgTemp = byteArrayToImage(data);
pictureBox1.Image = (Image)imgTemp.Clone();

}
}

private Image byteArrayToImage(byte[] byteArrayIn)
{
System.Drawing.Image returnImage = null;
System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArrayIn);
returnImage = System.Drawing.Image.FromStream(ms);
return returnImage;
}

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