وجزاكم الله خير
هل ممكن مثال حذف واضافة ورفع لبيانات وفيها حقل صورة
سؤالك يبيله شوية بهارات اخوي لاني ما فهمته
بس عندي احساس انه يتكلم عن ادخال البيانات للقاعدة مع امكانية ادخال الصور
اذا ما كنت غلطانة بس وضح و ابشر باللي تبيه
سبحان الله و بحمده سبحان الله العظيم
القصد كيف أبرمج الحذف الأضافة والتعديل على قاعدة بيانات أحد حقولها صورة ويتم تحيلها من جهاز العميل
اللهم أطل عمري وأحسن عملي واختم بالشهادة أجلي
انشأ الجدول Products بالحقول:
ID int not null with identity
Name varchar(50)
Picture image
كما ترى فان نوع حقل الصورة هو image
الان في صفحة FormViewWithImageSaving.aspx,انشأ الSQLDataSource
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyConnectionString %>" DeleteCommand="DELETE FROM [Products] WHERE [Id] = @Id" InsertCommand="INSERT INTO Products(Name, Picture) VALUES (@Name, @Picture)" ProviderName="<%$ ConnectionStrings:MyConnectionString.ProviderName %>" SelectCommand="SELECT [Id], [Name], [Picture] FROM [Products]" UpdateCommand="UPDATE Products SET Name = @Name, Picture = coalesce(@Picture, Picture) WHERE (Id = @Id)" OnInserting="SqlDataSource1_Inserting" OnUpdating="SqlDataSource1_Updating"> <InsertParameters> <asp:Parameter Name="Name" Type="String" /> <asp:Parameter Name="Picture" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="Name" Type="String" /> <asp:Parameter Name="Picture"/> <asp:Parameter Name="Id" Type="Int32" /> </UpdateParameters> <DeleteParameters> <asp:Parameter Name="Id" Type="Int32" /> </DeleteParameters> </asp:SqlDataSource>
ثم ال FormView :
<asp:FormView ID="FormView1" runat="server" DataKeyNames="Id" OnItemInserting="FormView1_ItemInserting" AllowPaging="True" DataSourceID="SqlDataSource1" OnItemUpdating="FormView1_ItemUpdating">
<EditItemTemplate>
Id:
<asp:Label ID="IdLabel1" runat="server" Text='<%# Eval("Id") %>'></asp:Label><br />
Name:
<asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>'>
</asp:TextBox><br />
Picture:
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Id", "ImageView.aspx?id={0}") %>' />
<asp:FileUpload ID="FileUpload1" runat="server" /><br />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
Text="Update">
</asp:LinkButton>
<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
Text="Cancel">
</asp:LinkButton>
</EditItemTemplate>
<InsertItemTemplate>
Name:
<asp:TextBox ID="NameTextBox" runat="server" Text='<%# Bind("Name") %>'>
</asp:TextBox><br />
Picture:
<asp:FileUpload ID="FileUpload2" runat="server" /><br />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
Text="Insert">
</asp:LinkButton>
<asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
Text="Cancel">
</asp:LinkButton>
</InsertItemTemplate>
<ItemTemplate>
Id:
<asp:Label ID="IdLabel" runat="server" Text='<%# Eval("Id") %>'></asp:Label><br />
Name:
<asp:Label ID="NameLabel" runat="server" Text='<%# Bind("Name") %>'></asp:Label><br />
Picture:
<asp:Image ID="Image2" runat="server" ImageUrl='<%# Eval("Id", "ImageView.aspx?id={0}") %>'/><br />
<asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit"
Text="Edit">
</asp:LinkButton>
<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete"
Text="Delete">
</asp:LinkButton>
<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New"
Text="New">
</asp:LinkButton>
</ItemTemplate>
</asp:FormView>و في FormViewWithImageSaving.aspx.cs :
protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
{
FileUpload FileUpload2 = (FileUpload)FormView1.FindControl("FileUpload2");
if (FileUpload2.HasFile)
e.Values["Picture"] = FileUpload2.FileBytes;
}
protected void SqlDataSource1_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@Picture"].DbType = DbType.Binary;
}
protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
{
FileUpload FileUpload1 = (FileUpload)FormView1.FindControl("FileUpload1");
if (FileUpload1.HasFile)
e.NewValues["Picture"] = FileUpload1.FileBytes;
}
protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@Picture"].DbType = DbType.Binary;
}الملاحظات:
في كود العرض لدينا الصورة Image1 مربوطة مع الصفحة imageview.aspx وذلك لانه الويب يختلف عن الويندوز و لا نستطيع قراءة image مباشرة من قاعدة البيانات و انما ننشأ صفحة لقراءة الصورة ثم نربطها مع img src .
ثانيا في كود الاضافة و التحديث لدينا العنصر FileUpload لنتمكن من تنزيل الصورة الجديدة ,وتتم قراءة البايتات و ارسالها الى الSqlDataSource عن طريق الحدث FormView1_ItemInserting ,نتأكد هل المستخدم اختار حقا صورة للتنزيل ام لا,لانه قد يحدث الحقول الاخرى و يترك الصورة مثلما هي
protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
{
FileUpload FileUpload2 = (FileUpload)FormView1.FindControl("FileUpload2");
if (FileUpload2.HasFile)
e.Values["Picture"] = FileUpload2.FileBytes;
}نفس الشيء يقال عن التحديث
FileUpload FileUpload1 = (FileUpload)FormView1.FindControl("FileUpload1");
if (FileUpload1.HasFile)
e.NewValues["Picture"] = FileUpload1.FileBytes;واذا ترك الصورة كما هي فاننا قد قمنا بالواجب في استعلام الSqlDataSource حيث بايتات الصورة كما هي في قاعدة البيانات اذا كانت القيمة الجديدة هي Null (الدالة coalesce جيدة في هذا المجال)
UPDATE Products SET Name = @Name, Picture = coalesce(@Picture, Picture) WHERE (Id = @Id)
لنتفادى المشاكل التي تنتج من ارسال بايتات فارغة الى الحقل Picture فاننا نحدد نوع الحقل اثناء الاضافة و التحديث:
e.Command.Parameters["@Picture"].DbType = DbType.Binary;
الان الى صفحة قراءة الصورة imageview.aspx :
protected void Page_Load(object sender, EventArgs e)
{
string connString = "Data Source=sps1;Initial Catalog=MyDB;Integrated Security=True";
string cmdText = "SELECT picture FROM Products WHERe Id=" + Request["id"];
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(cmdText, conn);
byte[] img = null;
conn.Open();
try
{
object obj = cmd.ExecuteScalar();
if (obj != null && obj!=DBNull.Value)
{
img = (byte[])obj;
}
else
{
FileStream empty = File.Open(Server.MapPath("~/images/empty.gif"), FileMode.Open);
img = new byte[(int)empty.Length];
empty.Read(img, 0, (int)empty.Length);
}
Response.Clear();
Response.ContentType = "image/jpeg";
Response.OutputStream.Write(img, 0, img.Length);
}
catch(Exception ex)
{
throw ex;
}
conn.Close();
}
}الصفحة تتصل بقاعدة البيانات و تقراء حقل الصورة على شكل بايتات ثم تكتبه و ترسله الى المتصفح.في حالة كانت الصورة null فاننا نقرأ صورة فارغة من مجلد images ونعرضها في الصفحة (كي نتفادى ظهور اطار احمر يدل على صورة غير موجودة)
تحياتي
مدني
تم تعديل هذه المشاركة بواسطة madani في 18 فبراير 2008 في 18:26
بارك الله فيك يا اخي مدني على هذا الشرح الرائع
واسأل الله العلي العظيم ان يكون في ميزان حسناتك
و لي سؤال صغير
اقتباسPicture imageكما ترى فان نوع حقل الصورة هو image
طب هل من الممكن تغيير حقل الصورة بدل ما يكون من النوع IMAGE يكون VARCHAR(100)
ويتم تخزين مسار الصورة فيه بدل ما يتم تخزين الصورة في قاعدة البيانات حتى لا تأخذ مساحة كبيرة منها
طبعا الصور يتم وضعها في مجلد .....
وياريت لو حضرتك عندك مثال تقدر تضعه .. لأنني محتاجه فعلا ......
وجزاك الله خيرا .....
احترامي
مطور مواقع وتطبيقات الانترنت
PHP
CodeIgniter , jQuery,AJAX ,CSS Coder
مطور تطبيقات الايفون والاندرويد
مدونتي الخاصة