PDA

View Full Version : مشكل با ذخیره عکس در دیتا بیس



User-os
جمعه 27 اردیبهشت 1387, 19:20 عصر
دوستان من یک datagrid گذاشتم .یه دکمه برای لود عکس +picturebox+یه دکمه برای
save to database

تو رویدادکلیک دکمه لود عکس نوشتم
:

openFileDialog1.ShowDialog();
pictureBox1.Load(openFileDialog1.FileName);
System.IO.FileStream f = new System.IO.FileStream(openFileDialog1.FileName, System.IO.FileMode.Open);
byte[] ar = new byte[f.Length];
f.Read(ar, 0, (int)f.Length);
dataSet1.Tables["personality"].Rows[bindingSource1.Position]["pic"] = ar;

و در دکمه save to database :


personalityTableAdapter.Update(dataSet1.personalit y);
تا موقعی که فیلدهای دیگر datagridview تغییر میکنندتغییرات ذخیره میشه اما موقعی که فیلد عکس رو عکس لود میکنم با زدن دکمه save to database این پیغام رو میده

Update requires a valid UpdateCommand when passed DataRow collection with modified rows.

User-os
جمعه 27 اردیبهشت 1387, 19:28 عصر
امیدوارم تاپیک پاک نشه .چون از تاپیکهای مشابه به نتیجه نرسیدم
http://barnamenevis.org/forum/showthread.php?t=65997
http://barnamenevis.org/forum/showthread.php?t=65882
...

User-os
یک شنبه 29 اردیبهشت 1387, 19:15 عصر
اکثر مطالب مشابه خلاصشون همون کد insert to ... اما من بدون اون کد نویسیهای طولانی و با bindingsource میخوام این کار رو بکنم .میدونم میشه و کدی مشابه این داره


personalityTableAdapter.Update(dataSet1.personalit y);
نمیدونم چرا گیر کرده؟

behzadk
یک شنبه 29 اردیبهشت 1387, 20:20 عصر
البته خیلی بحث شده


BinaryReader reader = new BinaryReader(stream);
byte[] photo = reader.ReadBytes((int)stream.Length);
stream.Close();
reader.Close();
cmd.Parameters.Add("@etiad", SqlDbType.VarBinary, photo.Length).Value = photo;

top7news
دوشنبه 30 اردیبهشت 1387, 08:18 صبح
سلام
نمیدونم راهنماییم به کارت بیاد یا نه ،ولی جدولت برای ذخیره اطلاعات و عکس یکیه؟
اگه یکی هستن یه جدول جدید درست کن و با کلید خارجی اونو ربط بده به جدول اصلی
فکر کنم اینطوری مشکلت حل بشه.واسه من که اینطوری حل شد مشکل .

hosseini_87
چهارشنبه 15 خرداد 1387, 02:08 صبح
MEMORY STREAM stream1=new memorystream();
try
{picturebox1.image.save(stream1,picturebox1.image. rawFormat);}
catch(exeption exeption1){messagebox.show("error");}
byte[] buffer1=stream1.getbuffer();
stream1.close();
connection.open();
string str="insert into tbl_pic (pic) values(@pic)";
sqlcommand cm=new sqlcommand(str,connection);
cm.parameters.add(new sqlparameter("@pic",sqldbtype.image)).value=buffer1;
cm.executenonquery();
connection.clos();

این برای ذخیره در sql

danial82
پنج شنبه 17 اردیبهشت 1388, 22:55 عصر
برای لود دوباره عکس چی؟
باینری ---> عکس ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

amin-soft
چهارشنبه 11 شهریور 1388, 02:50 صبح
گام اول یک پروژه جدید باز کنید

این کد صفحه aspx اول مثلا Default.aspx


<%@ Page Language="C#‎‎‎‎‎‎" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>ذخیره عکس به صورت باینری در دیتابیس و نمایش ان در دیتالیست</title>
<link href="Css/Styleone.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<table cellpadding="0" cellspacing="0" width="100%">
<tr><td colspan="2"><br /><hr /><br /></td></tr>
<tr><td width="50%" align="center" nowrap="nowrap"><a href="http://amin-soft.com" target="_blank">www.<font color=red>amin-soft</font>.com</a></td>
<td width="50%" align="center" nowrap="nowrap"><a href="http://barnamenevis.org" target="_blank">www.<font color=red>barnamenevis</font>.org</a></td></tr>
<tr><td colspan="2"><br /><hr /><br /></td></tr>
</table>
</div>
<div>
<table cellpadding="0" cellspacing="0" width="100%" align="center">
<tr><td align="center">
<fieldset dir="rtl"><legend>صفحه نمایش</legend>

<asp:DataList ID="DataList1" runat="server" RepeatColumns="3" RepeatDirection="Horizontal"
Width="100%" BorderColor="#336699" BorderStyle="Solid" BorderWidth="2px">

<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("ProductName") %>' Font-Bold="True"
Font-Size="10pt" ForeColor="#336699" Width="100%" />
<br />
<asp:Image ID="Image1" runat="server"
ImageUrl='<%# "Default2.aspx?id=" + Eval("ProductID") %>' />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" VerticalAlign="Top" />
</asp:DataList>
</fieldset>
</td></tr>

<tr><td><hr /></td></tr>

<tr><td> <p align="center">
<asp:Label ID="Label2" runat="server" ForeColor="C#‎‎‎‎‎‎C0000"></asp:Label>
</p>
</td></tr>
<tr><td><hr /></td></tr>
<tr><td>
<fieldset dir="rtl"><legend>انتخاب</legend>
<table cellpadding="0" cellpadding="0" width="100%" align="left">
<tr><td colspan="2" align="left" dir="ltr"><asp:FileUpload ID="FileUpload1"
runat="server" CssClass="inputbox" /></td></tr>
<tr><td align="left" width="100%"><font color="#006600">نام فایل</font></td>
<td align="left" width="130px" dir="ltr"><asp:TextBox ID="TextBox1" runat="server"
CssClass="inputbox"></asp:TextBox></td>
</tr>
<tr><td colspan="2" align="left">
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="ذخیره"
CssClass="inputbox" Width="90px" /></td></tr>
</table>
</fieldset>
</td></tr>

</table>
</div>
</form>
</body>
</html>
این هم کد Default.aspx.cs که برای ذخیره عکس است و نماش اطلاعات عکس مثل نام ان و کد ان و بریم سراغ صفحه دوم برای نمایش عکس





using System;
using System.Collections;
using System.ComponentModel;
using System.Data.SqlClient;
using System.Drawing;
using System.Configuration;
using System.Drawing.Imaging;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Data;
// Create Amin Malakuti Khah
// www.Amin-Soft.Com (http://www.amin-soft.com/)
// info@amin-soft.com
// www.barnamenevis.org (http://www.barnamenevis.org/)
// ذخیره عکس به صورت باینری در دیتابیس و نمایش ان در دیتالیست
public partial class _Default : System.Web.UI.Page
{
private int SaveToDB(string imgname, byte[] imgbin, string imgcontenttype)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["DatabaseConnectionString1"].ConnectionString);
SqlCommand command = new SqlCommand("SpInsert", con);
command.CommandType = CommandType.StoredProcedure;
SqlParameter param0 = new SqlParameter("@img_name", SqlDbType.VarChar, 30);
param0.Value = imgname;
command.Parameters.Add(param0);
SqlParameter param1 = new SqlParameter("@img_file", SqlDbType.VarChar, 30);
param1.Value = imgcontenttype;
command.Parameters.Add(param1);
SqlParameter param2 = new SqlParameter("@img_type", SqlDbType.Image);
param2.Value = imgbin;
command.Parameters.Add(param2);
con.Open();
int num = command.ExecuteNonQuery();
con.Close();
return num;

}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["DatabaseConnectionString1"].ConnectionString);
string query = "ShowInfo";
SqlDataAdapter da = new SqlDataAdapter(query, con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataTable table = new DataTable();
da.Fill(table);
DataList1.DataSource = table;
DataList1.DataBind();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
try
{
string filePath = FileUpload1.PostedFile.FileName;
string filename = Path.GetFileName(filePath);
string ext = Path.GetExtension(filename);
string contenttype = String.Empty;
//تست برای شناسایی پسوند فایل معتبر
switch (ext)
{
case ".JPG":
case ".jpg":
contenttype = "image/jpg";
Label2.Text = ": پسوند فایل شما برای اپلود مورد تایید است و برابر است با" + ext.ToString();
break;
case ".GIF":
case ".gif":
contenttype = "image/gif";
Label2.Text = ": پسوند فایل شما برای اپلود مورد تایید است و برابر است با" + ext.ToString();
break;
case ".PNG":
case ".png":
contenttype = "image/png";
Label2.Text = ": پسوند فایل شما برای اپلود مورد تایید است و برابر است با" + ext.ToString();
break;
case ".BMP":
case ".bmp":
contenttype = "image/bmp";
Label2.Text = ": پسوند فایل شما برای اپلود مورد تایید است و برابر است با" + ext.ToString();
break;
default: // پسوند های دگر هم به همین صورت می شود اضافه کرد
// کاربر گرامی پسوند فایل مورد تایید نمی باشد با تشکر ملکوتی خواه امین
Label2.Text = "کاربر گرامی پسوند فایل مورد تایید نمی باشد با تشکر ملکوتی خواه امین جهت قدردانی از مدیران سایت برنامه نویس ";

break;
}
if (contenttype != String.Empty)
{
Stream fs = FileUpload1.PostedFile.InputStream;
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
int result = SaveToDB(TextBox1.Text.ToString(), bytes, contenttype.ToString());
}
}
catch (Exception eq)
{
Label2.Text = eq.Message.ToString();
}
finally // برای نمایش و بروز رسانی عکس اضافه شده است Refrash Page
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["DatabaseConnectionString1"].ConnectionString);
string query = "ShowInfo";
SqlDataAdapter da = new SqlDataAdapter(query, con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataTable table = new DataTable();
da.Fill(table);
DataList1.DataSource = table;
DataList1.DataBind();
} // اگر سوالی بود در سایت برنامه نویس مطرح شود
}

}


خوب حالا صفحه aspx دیگه ایجاد کنید مثلا Default2.aspx : این صفحه برای نمایش عکس است و من از دیتالیست برای نمایش استفاده کردم به نظرم بهتره و زیاد فرقی هم با گرید ویو نمی کنه و اگر باز مشکلی بود با گرید ویو هم یک نمونه قرار می دهم

کد Default2.aspx



<%@ Page Language="C#‎‎‎‎‎‎" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>

</div>
</form>
</body>
</html>

کد Default2.aspx.cs



using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
// Create Amin Malakuti Khah
// www.Amin-Soft.Com (http://www.Amin-Soft.Com)
// info@amin-soft.com
// www.barnamenevis.org (http://www.barnamenevis.org)
//ذخیره عکس به صورت باینری در دیتابیس و نمایش ان در دیتالیست
// هم نوشت Handler.ashx دوستان می شود این قسمت را در
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["id"] != null)
{
string id = Request.QueryString["id"];
string constr = ConfigurationManager.ConnectionStrings["DatabaseConnectionString1"].ConnectionString;
string query = "ShowImg";
SqlConnection con = new SqlConnection(constr);
SqlCommand com = new SqlCommand(query, con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = id;
con.Open();
SqlDataReader r = com.ExecuteReader();
if (r.Read())
{
byte[] imgData = (byte[])r["ProductImage"]; // برای برگرداندن از حالت باینری به حالت قبلی
Response.BinaryWrite(imgData);
}
con.Close();
}
}
}

خوب کار این قسمت تمام شد برویم سراق database

اول یک جدول ایجاد می کنیم با 3 تا فیلد

1-ProductID نوع ان nvarchar(50)
2-ProductName نوع ان nvarchar(50)
3-ProductImage نوع ان image

3 رویه نیاز داریم یکی برای ذخیره و دومی برای نمایش اطلاعات و سومی نمایش عکس

1- برای ذخیره



ALTER PROCEDURE SpInsert
@img_name varchar(50),
@img_file varchar(50),
@img_type image
AS
insert into Products(ProductID,ProductName,ProductImage) values (@img_name,@img_file,@img_type)

RETURN

-- Create Amin Malakuti Khah
-- www.Amin-Soft.Com
-- www.barnamenevis.org
2- برای نمایش اطلاعات



ALTER PROCEDURE ShowInfo
AS
SELECT ProductID, ProductName FROM Products
RETURN
-- Create Amin Malakuti Khah
-- www.Amin-Soft.Com
-- www.barnamenevis.org
3- برای نمایش عکس



ALTER PROCEDURE ShowImg
@ProductID nvarchar(50)
AS
SELECT ProductImage FROM Products WHERE ProductID = @ProductID
RETURN
-- Create Amin Malakuti Khah
-- www.Amin-Soft.Com
-- www.barnamenevis.org