PDA

View Full Version : update تصویر در بانک



programmermp
دوشنبه 05 شهریور 1386, 21:08 عصر
سلام

من از کد زیر برای update فیلدهای متنی nchar که با textbox مقدار دهی می شن در جداول

استفاده می کنم




sqldel = "Update Questionnaire SET FNO='" & FNO.Text & "',Code=" & Val(txtCode.Text)



حالا سئوال من اینه که

1-آیا می شه از کد فوق برای checkbox هم استفاده کرد یا نه مثلا کد زیر



sqldel = "Update Questionnaire1 SET FNO='" & FNO.Text & "',Home=" & chkHome.Checked

که خواستم فیلد home را با مقدار chkhome.checked بروز رسانی (update ) کنم؟

2-برای update تصویر در msdn خوندم که می شه از دو دستور زیر استفاده کرد

UPDATETEXT و WRITETEXT اما نمی تونم ازش استفاده کنم به شکلی که از دستور

update در کد بالا استفاده کردم در این زمینه لطفا من رو راهنمایی کنید

با تشکر فراوان

malizadeh
سه شنبه 06 شهریور 1386, 09:45 صبح
برای سوال اول بله می توان اما شما خودتون امتحان می کردید اگه به مشکل بر میخوردید اینجا مشکل رو مطرح می کردید .

__H2__
سه شنبه 06 شهریور 1386, 10:43 صبح
سلام
در کل بهتر است از روش پارامتری استفاده کنید، حتی در مورد String ها!!!
چون اگر میخواهید یک String کلی را ذخیره کنید باید حواستان به دوتایی کردن گیومه باشد!
اگر دستور SQL آپدید را با تک گیومه در شروع String استفاده کرده اید باید تمام تگ گیومه های احتمالی موجود در String را با جفت عوض کنید.
(مثلاً همان کد اول هم که نوشته اید، اگر کاربرتان در FNO یک تگ گیومه وارد کند، اجرا کد فوق باعت بروز خطای runtime میشود.)

در مورد مقادیر Boolean مشکل خاصی وجود ندارد ولی بهتر است که به صورت واضح به String تبدیل شوند (با CStr یا ToStrung) یک کم قانون مند تر است!!!

در مورد تصویر هم به کرات جواب داده شده:
http://barnamenevis.org/forum/showthread.php?t=73763
http://barnamenevis.org/forum/showthread.php?t=60966
و...

programmermp
پنج شنبه 08 شهریور 1386, 10:15 صبح
سلام H2 عزیز

تاپیک هایی که دادی بنده قبلا مطالعه کرده بودم اما یه مشکلی که هست اینه که

من دستور update که در بالا نوشته بودم واسه استرینگ ها پارامتری نبود درسته ؟

خوب دستوری که شما توی تاپیک دومی که لینک دادی در قالب برنامه گذاشته شده بود

دستور update اون واسه تصویر به صورت پارامتری هست حالا مشکل چیه :

1- من می خواهم اگه بشه مثل استرینگ در حالت پارامتری انجام نشه

مثلا اگه در برنامه من برای ذخیره تصویر از یک متغیر به نام mydata از نوع byte واسه ذخیره

عکس استفاده کردم توسط sqlcommand می خواهم همون متغیر رو به عنوان مرجع اطلاعات

استفاده کنم در دستور update

2- من تا به حال از روش پارامتری استفاده نکردم نمی دونم چطور باید استفاده بشه

متغیر ها یا همون پارامترها رو باید کجا و چطوری تعریف کنم

اگه امکانش هست از همون روش اول استفاده بشه خیلی بهتره اگر هم که نیست

لطفا در مورد روش دوم به من کمک کنید

با تشکر فراوان

programmermp
شنبه 10 شهریور 1386, 13:29 عصر
ای بابا یکی به داد ما برسه فوریه

saeed_rezaei
شنبه 10 شهریور 1386, 22:18 عصر
سلام
من هم اغلب اوقات با استفاده از رشته کار خودم رو راه می اندازم اما بهترش استفاده از روش پارامتری هست. مخصوصا برای استفاده از داده های نوع byte که قرار تصاویر و یا فایلها رو نگهداری کنه که خیلی راحت تر هست.

در روش پارامتری نیز، همانند روش رشته، باید یک رشته ایجاد کنید اما این رشته کمی متفاوت هست. سپس این رشته رو به یه sqlcommand می دید، همراه با مقادیر و سپس این sqlcommand رو اجرا می کنید. خیلی راحته.
این نمونه کد رو در نظر بگیرید:




1: Dim northwindConnection AsNew SqlConnection(connectionString)
2: Dim strSQL AsString = _
"INSERT INTO Picture (Filename, Picture)" & _
"VALUES (@Filename, @Picture)"

' A SqlCommand object is used to execute the SQL statement.
3: Dim cmd AsNew SqlCommand(strSQL, northwindConnection)

With cmd

' Add parameters required by SQL statement. PictureID is an
' identity field (in Microsoft Access, an AutoNumber field),
' so you only need to pass values for the two remaining fields.
4: .Parameters.Add(New SqlParameter("@Filename", SqlDbType.NVarChar, 50)).Value = arrFilename(0)
5: .Parameters.Add(New SqlParameter("@Picture", SqlDbType.Image)).Value = arrImage

EndWith

' Open the connection, execute the command, and close the
' connection. It is more efficient to ExecuteNonQuery when data
' is not being returned.
6: northwindConnection.Open()
7: cmd.ExecuteNonQuery()
8: northwindConnection.Close()

اینی که می بینید یه نمونه کد هست.
در خط یک، کانشکنم رو معرفی کردم
در خط دوم رشته ای رو که گفتم ایجاد کردم. دقت کنید. دراین رشته من خواستم که به جدول picture دو فیلد رو اضافه کنم. فیلدهای filename, picture
در همین خط هم می بینید که از دو مقدار که با کاراکتر @ شروع شده اند استفاده شده. این کاراکتر مشخص می کنه که مقدار معرفی شده، یک پارامتر هست و نه یه مقدار.
در خط سوم، یک sqlcommand ایجاد شده. این sqlcommand نیازمند یک سری اطلاعات اولیه برای شروع به کار هست. در خط سوم، رشته ای رو که ایجاد کرده ایم و همچنین کانکشنمون رو بهش می دیم.
در خطوط بعدی یعنی 4-5 باید پارامترها رو هم بهش بدیم.
در خط 4 پارامتر رشته ای جدید رو اضافه کرده ایم. سپس اون رو به پارامتر filename @ لینک کرده ایم. در این قسمت نوع داده رو اجباری باید مشخص کنیم و همچنین سایز فیلد رو، که البته سایز فیلد کاملا اختیاری هست. در انتهای این خط، مقدار این پارامتر رو هم مشخص کرده ایم، یعنی

arrFilename(0)

در خط 5 بازهم یه پارامتر البته این دفعه از نوع image که از انواع داده تعریف شده در sql برای نگهداری تصاویر هست ، ایجاد کرده ایم و به اون مقدار اولیه داده ایم.
عموما در هر انتصاب پارامتر (خطوط 4و5) بایستی پارامتر جدید ایجاد، لینک، تعریف نوع و مقدار دهی شود.
در سه خط آخر نیز 7-9 این دستور sqlcommand رو اجرا کرده ایم.

__H2__
یک شنبه 11 شهریور 1386, 10:57 صبح
سلام
اولاً بسیار بسیار شرمنده از بابت تاخیر پیش آمده، کمی کار و مشکلات زیر و درشت داشتم که نشد زودتر خدمت برسم و حالا میبینم که کاربر saeed_rezaei هم لطف کرده اند و توضیحی دادند، من هم متنی را که حاضر کرده ام پست میکنم شاید بیشتر کمکتان کند و امیدوارم زیاد دیر نشده باشد.
--------------------------------------------------------------------
مثلاً شما میخواهید یک فیلتر سازی معمولی را با حالت پارامتری انجام دهید.
در داخل String دستور SQL خود پارامتر را یا با علامت سوال یا با یک نام که قبلاً استفاده نشده مشخص میکنید (مثلاً برای تضمین اینکه نام شما منحصر باشد و با نام یک جدول یا فیلد برخورد پیدا نکند طبق یک عرف قدیمی یک علامت @ اولش اضافه کنید بد نیست.)


SELECT * FROM tablename WHERE fieldname=@FieldName
یا
SELECT * FROM tablename WHERE fieldname=?


در حالتی که از علامت سوال استفاده میکنید، ترتیب علامت سوالها و ترتیب اضافه شدن پارامترها به Command ملاک جایگذاری میشود و وقتی از نام استفاده میکنید همان نام (FieldName@) ملاک است (ولی بهتر است ترتیب را رعایت کنید، چون بعضی از موتورهای دیتابیسها مثل موتور JET که فایلهای mdb را مدیریت میکند نام را قبول ندارد! ایراد و خطا نمیگیرد ولی با نام هم مثل علامت سوال رفتار میکند و فقط ترتیب پارامتر ها در String دستور SQL و ترتیب ارسال مقادیر در Command برایش مهم است.)

خوب پس دستور SQL را نوشتیم، طریقه مقدار دهی اش به وسیله خصوصیت Parameters شی Command است.
دستور Add یک نمونه کلاسس پارامتری اضافه میکند
دستور AddWithValue (برای SQL SERVER) یک پارامتر را با صرف داشتن نام و مقدار اضافه میکند (گرچه خودش به صورت داخلی دستور Add قبلی را اجرا میکند)
دستور AddRange یک دسته آرایه ای از پارامترها را اضافه میکند که خیلی بهتر از Add کردن تک تکی پارامترها است.
Insert هم پارامتر را در محل خاصی از نظر ترتیبی اضافه میکند.

در آخر هم که Command را با یکی از دستورات سری ExecuteXXXXXX اجرا میکنید. (که احتمالاً تفاوت سری دستورات فوق را میدانید.)
در دستورات زیر فرض شده نوع فیلد FieldName@ عددی و Int32 است.


Dim iValue As Integer
dbCommand.Parameters.Add("@FieldName", SqlDbType.Int)
یا
dbCommand.Parameters.Add("@FieldName", SqlDbType.Int, 4)
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.Int))
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.Int, 4))

dbCommand.Parameters.Item(0).Value = iValue
dbCommand.Parameters.Item("@Fieldname").Value = iValue

و یا اینکه کاملترین است و مقدار را هم در زمان Add میدهد
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.Int, 4, ParameterDirection.Input, False, 0, 0, Nothing, DataRowVersion.Default, iValue))


روش پارامتری برای همه فیلدها ثابت است و نمیخواهید به چیزهای دیگر فکر کنید فقط نوع فیلد و اگر هم خواستید سایز را دستکاری کنید، مثال فوق برای رد کردن یک پارامتری Integer بود و مثال زیر برای رد کردن یک آرایه بایتی، میبینید که چندان تفاوتی نکرده!


Dim arrValue() As Byte
dbCommand.Parameters.Add("@FieldName", SqlDbType.VarBinary)
یا
dbCommand.Parameters.Add("@FieldName", SqlDbType.VarBinary, 1024)
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.VarBinary))
یا
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.VarBinary, 1024))

dbCommand.Parameters.Item(0).Value = arrValue
dbCommand.Parameters.Item("@Fieldname").Value = arrValue

و یا اینکه کاملترین است و مقدار را هم در زمان Add میدهد
dbCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@FieldName", SqlDbType.VarBinary, 1024, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Default, arrValue))

توضیح هر پارامتر هم در زمان تایپ در محیط VS.Net نشان داده میشود، مثلاً پارامتر پنجم آخرین دستور نشان میدهد که مقدار میتواند در بانک NULL هم باشد یا نه!

موفق باشید و مجدداً از بابت تاخیر عضرخواهی میکنم.

programmermp
یک شنبه 11 شهریور 1386, 12:30 عصر
سلام

با تشکر فراوان از اقایان سعید رضایی و h2 عزیز

راستشو بگم یکم جوابتون دیر بود ولی در کل دستتون درد نکنه من از کدهای زیر واسه ذخیره

و بازیابی و ویرایش عکس استفاده می کنم ولی یه مشکل دارم




برای بازیابی عکس
----------------
PrivateSub DrawToScale(ByVal img As Image)
pic.Image = New Bitmap(img)
EndSub
PrivateSub LoadImage()
OnErrorGoTo fix
con.Open()
Dim SQLImage AsString = "SELECT Photo FROM Questionnaire WHERE FNO='" & FNO.Text & "'"
Dim cmd AsNew SqlClient.SqlCommand
cmd.Connection = con
MsgBox(SQLImage)
cmd.CommandText = SQLImage
Dim b() AsByte
b = cmd.ExecuteScalar
If (b.Length > 0) Then
Dim stream AsNew MemoryStream(b, True)
stream.Write(b, 0, b.Length)
DrawToScale(New Bitmap(stream))
stream.Close()
EndIf
con.Close()
fix:
EndSub
---------------
برای ذخیره عکس
----------------
txtFileName.Text = ImagePath
Dim fs AsNew FileStream(txtFileName.Text, FileMode.OpenOrCreate, FileAccess.Read)
Dim MyData(fs.Length) AsByte
fs.Read(MyData, 0, CInt(fs.Length))
fs.Close()
newrow("Photo") = MyData
--------------
برای ویرایش عکس
---------------
Dim Cmd AsNew SqlClient.SqlCommand
Dim strq AsString
Dim strcon AsString
Dim con As SqlClient.SqlConnection
strcon = "Data Source=" & serverip & ";Initial Catalog=" & dbuser & ";Integrated Security=True"
con = New SqlClient.SqlConnection(strcon)
con.Open()
Try
strq = " UPDATE Questionnaire "
strq &= " SET Photo = @ImageF "
strq &= " WHERE FNO = '" & FNO.Text & "'"
'Cmd = New SqlCommand
Cmd.CommandType = System.Data.CommandType.Text
Cmd.Connection = con
Cmd.CommandText = strq
Dim fs AsNew FileStream(OpenDialog.FileName, FileMode.OpenOrCreate, FileAccess.Read)
Dim MyData(fs.Length) AsByte
fs.Read(MyData, 0, CInt(fs.Length))
fs.Close()
Cmd.Parameters.Add(New SqlClient.SqlParameter("@ImageF", System.Data.SqlDbType.Image, MyData.Length, System.Data.ParameterDirection.Input, 0, 0, 1, System.Data.DataRowVersion.Current, False, MyData, "", "", ""))
Cmd.ExecuteNonQuery()
ReturnTrue
Catch ex As Exception
MsgBox(".ویرایش تصویر انجام نشد" & vbCrLf & ex.Message.ToString, MsgBoxStyle.Critical)
ReturnFalse
Finally : Cmd.Dispose()
EndTry
con.Close()

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

مشکل حالا چیه؟

من هر بار که فرم رو باز می کنم و از تابع loadimage واسه نمایش عکس استفاده

می کنم در picturebox به اولین رکوردی که می رسه و عکس داره اون عکس رو می اندازه

تو پیکچر باکس و در ست نشون می ده ولی وقتی رکورد بعدی رو که شامل عکس هست

با زدن کلید next میارم عکس رو نشون نمی ده و همچنان عکس رکورد قبلی در پیکجر باکس

هست نمی دونم مشکلش چیه

البته گفتنیه که یک سری عکس رکورد دوم رو نشون داد بعد عکس رکورد هفتم رو نشون داد

( از بین 7 رکورد همین دوتا فقط عکس دارند) بعد دیگه هر چی بین رکوردها حرکت کردم

عکس عوض نشد که نشد

نمی دونم چشه لطفا کمکم کنید

با تشکر فراوان

__H2__
دوشنبه 12 شهریور 1386, 11:50 صبح
سلام

تابع DrawToScale برای چیست؟؟؟؟؟؟؟؟

شما باید Null بودن فیلد مربوطه را هم چک کنید و در صورتی که Null بو مقدار Nothing را در pic.Image بریزید تا خالی شود.




Try

...

If (b IsNot Nothing) AndAlso (b.Length > 0) Then

....

Else

pic.Image=Nothing

End If

...



Catch ex As Exception

pic.Image = Nothing

...










شما مطمئن هستید که سمپلی را که در تاپیک قبلی معرفی کرده بودم دیده اید؟ و مشکلتان حل نشده؟

www.h02.ir/Download.aspx?File=PictureInDatabase.zip (http://www.h02.ir/Download.aspx?File=PictureInDatabase.zip)

چون به نظر من کامل است و شما به راحتی با Copy و Paste و عوض کردن نام جدول میتوانید از آن استفاده کنید و تمام مسایل هم رعایت شده و باز همین الآن تست کردم و جواب داد.