View Full Version : پایگاه داده در ویژوال بیسیک - شروع تا پایان
اوبالیت به بو
پنج شنبه 24 بهمن 1387, 14:22 عصر
سلام خدمت دوستان عزيز تالار VB
راستش هدف از احداث اين تايپيك آموزش برنامه نويسي پايگاه داده هستش. شايد براي بعضي از دوستان برنامه نويسي پايگاه داده در VB6 مشكل دارن.
اين تايپيك با حمايت و كمك دوستان بايد راه اندازي بشه تا هم سوالات تكراري از بين برن و هم مطلب جديدي رو ياد گرفته باشيم.
مطالبي كه دربارش اين دوستان خواستن راجبش صحبت بشه اينها هستن:
كار با ADODB از ابتدا تا انتها با obalitjoOon (http://barnamenevis.org/forum/member.php?u=47457)
كار با Crystal Report و چاپ با mpmsoft (http://barnamenevis.org/forum/member.php?u=17067)
ايجاد يك Setup براي برنامه با vbhamed (http://barnamenevis.org/forum/member.php?u=10624)
بازي با Interface با ؟؟؟
امنيت برنامه با ???
گسترش برنامه با ؟؟؟؟
من خودم در ابتدا به عنوان نمونه چند مثال رو با توضيح براي دوستاني كه مشكل دارن پست مي كنم تا به اميد خدا بقيه دوستان با نحوه كار آشنا بشن و اونها هم در اين تايپيك شركت كنن.
اين تايپيك براي همه كاربران تالار VB هستش پس مثل هميشه مي گم "اميدوارم تنهاش نذارين"
ADODB
شي Connection
تنظيم ConnectionString (http://www.barnamenevis.org/forum/showpost.php?p=678458&postcount=2)
تنظيم Provider (http://www.barnamenevis.org/forum/showpost.php?p=678458&postcount=2)
نشانه گذاري سمت سرور، سمت كلاينت (http://www.barnamenevis.org/forum/showpost.php?p=678458&postcount=2)
متد Open (http://www.barnamenevis.org/forum/showpost.php?p=678458&postcount=2)
بررسي وضعيت اتصال (http://www.barnamenevis.org/forum/showpost.php?p=678458&postcount=2)
شي RecordSet
انواع نشانه ها (http://barnamenevis.org/forum/showpost.php?p=682525&postcount=10)
نشانه گذاري سمت سرور، سمت كلاينت (http://barnamenevis.org/forum/showpost.php?p=682525&postcount=10)
پر كردن يك Recordset (http://barnamenevis.org/forum/showpost.php?p=682525&postcount=10)
شي Command
مقداردهي Connection دستور (http://www.barnamenevis.org/forum/showpost.php?p=678473&postcount=3)
مشخص كردن CommandType (http://www.barnamenevis.org/forum/showpost.php?p=678473&postcount=3)
نوشتن دستور SQL (http://www.barnamenevis.org/forum/showpost.php?p=678473&postcount=3)
كار با Store Procedure ها
بزودي...
كار با Parameters ها
ايجاد Parameters - مقدمه (http://www.barnamenevis.org/forum/showpost.php?p=678474&postcount=4)
ايجاد Parameters - روش اول {استفاده از ADODB.Command} (http://www.barnamenevis.org/forum/showpost.php?p=678499&postcount=5)
ايجاد Parameters - روش دوم {استفاده از ADODB.Command} (http://barnamenevis.org/forum/showpost.php?p=680549&postcount=7)
ايجاد Parameters - روش سوم {استفاده از ADODB.Parameters} (http://barnamenevis.org/forum/showpost.php?p=680574&postcount=8)
ايجاد اشيا نمونه در حافظه
نحوه ايجاد شي جديد نمونه در حافظه (http://barnamenevis.org/forum/showpost.php?p=680580&postcount=9)
بازيابي اطلاعات از منابع
با استفاده از Connection (http://barnamenevis.org/forum/showpost.php?p=684722&postcount=11)
با استفاده از Command (http://barnamenevis.org/forum/showpost.php?p=684726&postcount=12)
با استفاده از Recordset (http://barnamenevis.org/forum/showpost.php?p=684730&postcount=13)
نمايش در DataGrid
نمايش در MSFlexGrid
متد ها
متد Connect (http://barnamenevis.org/forum/showpost.php?p=684742&postcount=14)
متد LoadAll (http://barnamenevis.org/forum/showpost.php?p=684753&postcount=15)
متد Insert (http://barnamenevis.org/forum/showpost.php?p=684761&postcount=16)
متد Update (http://barnamenevis.org/forum/showpost.php?p=684766&postcount=17)
متد Delete (http://barnamenevis.org/forum/showpost.php?p=684770&postcount=18)
پروژه
http://www.barnamenevis.org/forum/images/icons/icon2.gif پروژه شماره 1 (http://barnamenevis.org/forum/showpost.php?p=691685&postcount=18)
Crystal Report
ساخت گزارش (http://barnamenevis.org/forum/showpost.php?p=716009&postcount=20)
Setup & Wizard
با كمك دوستان تكميل خواهد شد
:لبخندساده: جا داره از دوستان عزيز mpmsoft (http://barnamenevis.org/forum/member.php?u=17067)و vbhamed (http://barnamenevis.org/forum/member.php?u=10624)كه در ادامه كار اين تايپيك اعلام همكاري كردند تشكر كنم. همچنين از مدير محترم تالار جنابmbt925 (http://barnamenevis.org/forum/member.php?u=34702)كه اجازه فعاليت در اين تالار رو مي دهند تشكر مي كنم.
(http://barnamenevis.org/forum/member.php?u=10624)
اوبالیت به بو
پنج شنبه 24 بهمن 1387, 15:52 عصر
از اسمش پيداست. براي برقراري ارتباط با بانك اطلاعاتي مورد استفاده قرار ميگيره. براي همين بايد يه متغير از جنس Connection بسازيم تا بتونيم ازش در برنامه براي اتصال به بانك اطلاعاتي استفاده كنيم:
Dim Conn As ADODB.Connection
چند تا ويژگي مهم داره كه براي ايجاد ارتباط بايد مقداردهي بشن.
خاصيت Provider:
اين خصيصه مشخص مي كنه كه تهيه كننده بانك اطلاعاتي كيه(!) (چي شد...:لبخند:) چندين تدارك بيننده يا تهيه كننده براي اين خاصيت وجود داره كه احتياج به دونستن همه اونها نيست. معمولاً از تهيه كننده OLEDB استفاده مي كنن كه خودش به چندين تهيه كننده براي كار با بانك هاي اطلاعاتي مختلف تقسيم بندي ميشه. مثل:
Microsoft.JET.OLEDB.3.51
SQLOLEDB
and more ...
براي همين بايد مشخص بشه كه تدارك بيننده بانك اطلاعاتي چي هست. به عنوان مثال براي كار با MS Access از اين تدارك بيننده استفاده مي كنيم:
Conn.Provider= "Microsoft.JET.OLEDB.4.0"
اين Provider ها به ما كتابخانه هايي رو از اشيا و كلاس ها مي دن كه مي تونيم باهاشون برنامه هاي پايگاه داده رو بنويسيم. اين Provider چندين آرگومان ديگه داره مثل Remote Server, Remote Provider و ... كه براي دسترسي از راه دور به هنگام باز كردن بانك اطلاعاتي استفاده ميشه كه من نحوه كار كردن باهاش رو بلد نيستم.
خاصيت ConnectionString:
اگر بخوايم به صورت جزئي نگاهش كنيم تمامي خاصيت ها رو مثل Provider, DB Path, UserName,Password و ... در خودش مي تونه نگه داره اما براي خوانايي بيشتر كد ميان اين مشخصه ها رو جدا جدا مي نويسن. ما چون provider رو مشخص كرديم ديگه احتياجي به نوشتن اون در اين خاصيت نيست و فقط آدرس بانك اطلاعاتي رو توش مي نويسيم:
Conn.ConnectionString = App.Path + "\DataBase.mdb"
در واقع كد فوق همون آرگومان Data Source رو مقدار دهي مي كنه.
خاصيت CursorLocation - نشانه گذاري سمت سرور، سمت كلاينت:
گفتيم كه منابع يا تدارك دهنده هاي ما يه سري اشيا و كلاس هايي رو در اختيار ما قرار مي دن كه يكي از اونها يه Libary از Sign ها يا نشانه هاست كه مشخص مي كنه كه سيستم اين نشانه ها رو از سمت Server يا Client تدارك بيننده ها بگيره:
Server:
Conn.CursoreLocation = adUseServer
Client:
Conn.CursorLocation = adUserClientمتد Open:
بعد از ايجاد و برقراري اتصال ما بايد اين پايگاه داده رو باز كنيم كه متد Open اين كار رو انجام مي ده. اشنايي بيشتر با اين متد:
http://barnamenevis.org/showpost.php?p=511373&postcount=3
خاصيت State:
وضعيت موجود و فعلي Connection رو مشخص مي كنه. البته زياد به اين گزينه اعتماد نكنيد چون به هرحال VB6 يا كلي تر بگيم ADO به صورت Connect با بانك اطلاعاتي كار مي كنه و شايد به ظاهر شما فكر كنيد اتصال بسته ولي اينجوري نيست و اتصال از لحاظ منطقي باز هستش. ولي خوب دونستنش ضرري نداره.
معمولاً در جواب يك شرط از اين ويژگي استفاده مي كنن تا ببينن اگر اتصال باز هستش اتصال قبلي رو ببندن و دوباره باز كنن:
If Conn.State = adStateOpen Then Conn.State = adStateClosed
ثابت adStateOpen از لحاظ عددي مقدار 1 و ثابت adStateClosed از لحاظ عددي مقدار 0 رو مشخص مي كنه.
اگر مي خواين ببينيد كه وضيعيت اتصال به چه صورت هست مي تونيد از اين ويژگي استفاده كنيد:
MsgBox Conn.State
اوبالیت به بو
پنج شنبه 24 بهمن 1387, 16:32 عصر
شي Command دستورات مربوط به SQL رو اجرا مي كنه. متد ها و خاصيت هاي مختلفي داره كه به وسيله اونها ميشه يك دستور SQL رو به اجرا درآورد. درواقع كار اصلي رو اين شي انجام مي ده. براي استفاده از اين شي بايد يه متغير از جنس Command بسازيم:
Dim Cmd As ADODB.Command
وقتي ما مي خوايم عملياتي رو در بانك اطلاعاتي به اجرا در بياريم احتياج به چندين مورد داريم كه خودشون به چندين زير عمليات تقسيم بندي ميشن. بستگي داره كه كدومشون رو انتخاب كرده باشيم:
مسير اتصال بانك اطلاعاتي
نوع اجراي عمليات
استفاده از دستور SQL
نوشتن دستور SQL - مثل Insert,Update,Join,...
ارسال Parameters در صورت نياز
استفاده از جدول يا Table
استفاده از رويه ذخيره شده (Store Procedure)
فراخواني رويه مورد نظر
ارسال Parameters در صورت نياز
و غيره
خاصيت ActivatedConnection:
اين خاصيت مسير اتصال به بانك اطلاعاتي رو مشخص مي كنه كه اين دستور SQL يا S.P مجا بايد اجرا بشه. تنها مقداري كه بايد بهش بديم همون متغير Conn در بخش قبل هستش چون بسياري از ويژگي هاي Command و Connetion با هم يكسان هستند:
Cmd.ActivatedConnetion = Conn
خاصيت CommandType:
اينم از اسمش پيداست. نوع دستور يا عمليات رو بايد اينجا مشخص كنيم. مثلاً اگر بخوايم يه S.P رو به اجرا در بياريم بايد با ثابت adCmdStoredProc مقداردهي كنيم. اگر بخوايم از يك دستور SQL مشخص استفاده كنيم بايد خاصيت adCmdText رو انتخاب كنيم و ديگر مواردي كه با يه نگاه جزئي ميشه فهميد كه چه كاري انجام مي دن.
cmd.CommandType = adCmdText
cmd.CommandType = adCmdTable
cmd.CommandType = adCmdStoredProc
and more ...
خاصيت CommandText:
اگر ما خاصيت CommandType رو با adCmdText مقدار دهي كرده باشيم بايد در اينجا دستور SQL رو بنويسيم. اگر بخوايم Store Procedure رو اجرا كنيم بايد نامش رو اينجا به صورت رشته قيد كنم:
Cmd.Commandtext = "Insert Into Table (Code,FName,Age) Values (1254,'Barnamenevis',18)
.
Cmd.CommandText = "Select * From tblClass"
....
اوبالیت به بو
پنج شنبه 24 بهمن 1387, 16:35 عصر
ايجاد Parameters:
فرض كنيد كه مي خواين يه دستور SQL رو بنويسيد كه مي خواد عمل حذف كردن يك ركورد رو بر اساس تست يك شرط انجام بده. خوب طبيعتاً مي نويسيم:
Delete From TblTest WHERE ID = 5
اين دستور ركورد شماره پنجم جدول tblTest رو پاك مي كنه. حالا در برنامه ما نمي دونيم كه كدوم ركورد بايد پاك بشه و مي خوايم اين امكان در برنامه قرار داده بشه كه كاربر خودش يك مقداري رو دلخواه وارد كنه و ركورد مورد نظر پاك بشه. اين ورودي مي تونه از طريق نوشتن در يك TextBox باشه، مي تونه انتخاب يك گزينه از ComboBox يا ListBox باشه، مي تونه انتخاب يك سطر از DataGrid يا MSFlexGrid باشه يا هر كنترل ورودي ديگه اي كه اين مقدار رو به شرط دستور SQL مي ده. مي نويسيم:
"Delete From TblTest WHERE ID = " + Val(Trim(Text1.Text))
حالا فرض كنيد مي خوايم يه دستور Update بنويسيم كه قراره فيلدها رو با يك Select تودر تو مقدار دهي كنه و اين Select تودر تو با كنترل هاي ورودي برنامه فيلدهاش مقداردهي ميشه و دوباره در پايان دستور Update يه شرط وجود داره كه اون هم بايد از يه TextBox يا DataGrid گرفته بشه. آيا به نظر شما بازهم بايد به روش بالا كد نوشت؟ يعني بيايم اين رشته ها رو تيكه تيكه به هم بچسبونيم؟؟
اين روش خيلي خيلي اشتباه هستش به چند دليل:
خوانايي كد بسيار پايين مياد
امكان اشتباه نوشتن و خطاي ديد بسيار بالا ميره
خطايابي يا اشكالزدايي دستور خيلي سخت ميشه
استاندارد نيست
چي كار بايد كرد؟ درستش اينه كه از خود Syntax دستور SQL استفاده كنيم. يعني بنويسيم:
Insert Into tblTest (Field1,Field2) Values (@Field1,@Field2)
...
More SQL Command's....
در دستور SQL علامت @ يا آقا دورت بگردم:قهقهه: مياد يه متغير ايجاد مي كنه. حالا ما بايد اين Syntax دستورات SQL رو در Visual Studio پياده سازي كنيم. چي جوري؟ اينجا مساله هستش كه چي جوري ميشه يه زبان ديگه رو با يه زبان ديگه ادغام كرد؟ ADODB اين امكان رو به ما مي ده كه اين متغيرهاي به جا مانده از دستورات SQL رو به صورت Parameters از VB6 به SQL پاس بديم.
در كل به 3 روش (شايد بيشتر) ميشه اين parameters ها رو مقداردهي كرد.
نكته اي كه شايد باعث بشه اين پست كمي گمراه كننده به نظر بياد اين هستش كه اشيا ADODB خيلي از خاصيت هاشون با هم مشترك هستش يعني با هم هيچ فرقي نمي كنن براي همين برنامه هاي پايگاه داده رو ميشه به چندين چند روش نوشت. ما بايد از تمامي امكانات برنامه نويسي استفاده كنيم.
اوبالیت به بو
پنج شنبه 24 بهمن 1387, 17:42 عصر
روش اول - استفاده از ADODB.Command:
شي ADODB.Command كه ما ازش يه متغير به اسم Cmd ساختيم يك خاصيت داره به اسم Parameters. اين خاصيت به اين صورت استفاده ميشه:
Cmd.CommandText = "Insert Into tblTest (Field1)Values(@Field1)"
Cmd.Parameters.Refresh
Cmd.Parameters.Item(0).Value = ValueMember...
دستور SQL كه واضح هست چي كار مي كنه.
@Field1: همون متغيري هستش كه قراره مقدارش درون ستون يا فيلد Field1 در جدول tblTest بانك اطلاعاتي ريخته بشه.
اما اون صفر سبز رنگ كه زيرش خط كشيده شده چيه؟ اگر دقت كرده باشيد من فقط و فقط يك متغير بيشتر ندارم. من تويه دستورات SQL مي تونم چندين و چند متغير داشته باشم (فكر كنم تا 255 تا) كه اينها همشون يه انديس دارن كه از صفر شروع ميشه. فكر كنم كه تا آخرش رو با اين توضيح متوجه شدين. براي اينكه متغيرها مقدار دهي بشن بايد با انديس هاشون جداگانه مقداردهي بشن. يعني:
Cmd.CommandText = "Insert Into tblTest (Field1,Field2,Field3)Values(@Field1,@Field2,@Fiel d3)"
Cmd.Parameters.Refresh
Cmd.Parameters.Item(0).Value = ValueMember...
Cmd.Parameters.Item(1).Value = ValueMember...
Cmd.Parameters.Item(2).Value = ValueMember...
به همين راحتي. حالا با Execute كردن Command مي تونيد Recordset رو پر كنيد.
اوبالیت به بو
دوشنبه 28 بهمن 1387, 22:19 عصر
روش دوم - استفاده از ADODB.Command:
با استفاده از شي ADODB.Command مي شه به روش ديگه اي يه Parameters رو به دستور SQL پاس داد:
Cmd.CommandText = "Insert Into tblTest (Field1,Field2)Values(@Field1,@Field2)"
Cmd.Parameters.Refresh
Cmd.Parameters("@Field1").Value = ValueMember...
در اين روش بعد از متد Cmd.Parameters بايد نام Parameters مورد نظر رو به صورت رشته اي بنويسيم و با خاصيت Value مقدار دهي كنيم. در واقع نحوه استفاده از دستور به اين صورت هستش:
Cmd.parameters ("ParametersName").Value = Value
كد واضح هستش فكر نمي كنم توضيح اضافه ديگه اي رو بخواد.
Cmd.CommandText = "Insert Into tblTest (Field1,Field2)Values(@Field1,@Field2)"
Cmd.Parameters.Refresh
Cmd.Parameters("@Field1").Value = ValueMember...
Cmd.Parameters("@Field2").Value = ValueMember...
.
.
.
اوبالیت به بو
دوشنبه 28 بهمن 1387, 23:07 عصر
روش سوم- استفاده از ADODB.parameter:
اين روش درواقع يه جورهايي به دو روش قبلي مربوط ميشه يعني ADODB.Command اما به
طور غير مستقيم. يكم اين روش نياز به دقت داره وگرنه سخت نيست. اول بايد ببينيم كه دستور SQL مورد نظر ما چند تا Parameters نياز داره و به همون تعداد متغير از نوع ADODB.Parameter تعريف مي كنيم. به عنوان مثال من مي خوام يك دستور Update رو بنويسم و اين دستور من حداقل دو تا parameters نياز داره:
Public Parameters1 As ADODB.Parameter
Public Parameters2 As ADODB.Parameter
حالا دستور مورد نظر رو مي نويسيم. مثلاً:
Cmd.CommandType = adCmdText
Cmd.CommandText = "Update tblTest SET Field1=@Field1 WHERE Field2=@Field2"
حالا بايد parameters رو به متغيرمون Set كنيم:
Set Parameters1 = Cmd.CreateParameter("@Field1", adInteger, adParamInput)
Set Parameters2 = Cmd.CreateParameter("@Field2", adInteger, adParamInput)
حالا دوباره بر مي گرديم سراغ ADODB.Command و از خاصيت Parameters اون دوباره استفاده مي كنيم با اين تفوت كه از متد Append اون استفاده مي كنيم:
Cmd.Parameters.Append Parameters1
Cmd.Parameters.Append Parameters2
مقداردهي Parameters هاي ساخته شده:
اما حالا نوبت به مقدار دهي Parameters ميشه. از تابع Array كه همه باهاش آشنايي دارن استفاده كنيم.
Set Rst = Cmd.Execute(, Array(Value1, Value2))
به طور مستقيم اينجا مقادير رو وارد Cmd.Execute مي كنيم. درواقع شكل كلي دستور به اين صورت هستش:
Cmd.Execute (RecordAffected,Parameters,Option As Long=-1)
كه هر سه آرگومان اختياري هستن.
Cmd.CommandType = adCmdText
Cmd.CommandText = "Update tblTest SET Field1=@Field1 WHERE Field2=@Field2"
Set Parameters1 = Cmd.CreateParameter("@Age", adInteger, adParamInput)
Cmd.Parameters.Append Parameters1
Set Parameters2 = Cmd.CreateParameter("@Code", adInteger, adParamInput)
Cmd.Parameters.Append Parameters2
.
.
.
Set Rst = Cmd.Execute(, Array(Value1, Value2))
اوبالیت به بو
دوشنبه 28 بهمن 1387, 23:17 عصر
كلمه كليدي New اين عمل رو انجام مي ده. اين كلمه كليدي كه واقعاً خيلي كليدي هستش يك از متغير در حافظه يك شي مي سازه كه در ابتدا همه مقاديرش با Null مقداردهي ميشه. اگر ما ليست متغيرهامون اينها باشن:
Public Conn As ADODB.Connection
Public Cmd As ADODB.Command
Public Rst As ADODB.Recordset
public Param as ADODB.Parameter
و براي ايجاد شي نمونه اونها رو Set مي كتيم:
Set Conn = New ADODB.Connection
Set Cmd = New ADODB.Command
Set Rst = New ADODB.Recordset
Set Param = New ADODB.Parameter
اوبالیت به بو
جمعه 02 اسفند 1387, 12:25 عصر
اين شي بهترين نوع در بين اشيا VB6 براي كار با مجموعه ركورد يا در اصطلاح Recordset هستش. متدهاي نسبتاً قوي تر و كاملتري نسبت به اشيا ديگه داره. مثلاً شما مي تونيد يك ركورد رو جوري فراخواني كنيد كه به صورت فقط خواندني باشه يا در اصطلاح مي گن به صورت قفل ركورد كار كنيد.
با متد هاي شي RecordSet مي تونيد در اين پست و در اين پست آشنا بشيد اما يك شكل كلي از اين دستور رو مي نويسم و يه توضيح كوچكي راجبشون مي دم:
Dim Rst As ADODB.Recordset
Set Rst = New ADODB.Recordset
.
.
.
Rst.Open strQuery, ActiveConnection, CursorType, LockType, Optimize
اگر يادتون باشه در اين پست تمام آرگومان هاي متد Conn.Open به صورت جدا جدا توضيح داده شد. عرض كردم كه روش هاي مختلفي براي نوشتن برنامه هاي پايگاه داده وجود داره. شما مي تونيد تمام اين مشخصه ها رو در يك خط مقداردهي كنيد يا اينكه به صورت جدا جدا dddمقداردهي كنيد دركل فرقي نمي كنه.
خاصيت strQuery:
دستور SQL مورد نظرتون رو به صورت رشته در اين قسمت مي نويسيد. مثلاً:
Dim strQuery As String
strQuery = "Select * From tblTest"
Rst.Open strQuery,...
يا اينكه اينجوري بنويسيد:
Rst.Open "Select * From tblTest",...
در كل زياد فرقي نمي كنه.
خاصيت ActiveConnection:
بعد از اينكه دستور SQL خودتون رو مشخص كردين حالا بايد مسير منبع داده رو هم به Recordset بديم تا بدونه كه از كجا بايد اين درخواست رو اجرا كنه. خوب مي تونيد بر اساس همون متغير Conn كه قبلاً ايجاد كرديم اين خاصيت رو مقدار دهي كنيم. مثلاً:
Rst.Open strQuery, Conn, ...
يا اينكه:
Set Rst.ActiveConnection = Conn
تقريباً دستور انتساب اين خاصيت مشابه Command هستش.
خاصيت CursorType:
اين خاصيت اختياري هستش و مقاديري كه به صورت ثابت هاي VB6 مي پذيره اينها هستن:
adOpenForwardOnly: شي Recordset به صورت روبهجلو و فقط خواندني باز مي شه.
adOpenDynamic : شي Recordset به صورت دايناميك باز مي شود.
adOpenKeyset: نمي دونم...!!!!!!
adOpenStatic: شي Recordset به صورت ايستا باز مي شود.
مي تونيد اين مقادير رو وقتي اين خطوط رو مي نويسيد ببينيد:
Rst.Open ...,..., CursorTypeValues,...
OR
Rst.CursorType = CursorTypeValues
اما براي استفاده از اين سرويس ها بايد يه سري نكاتي رو بهش توجه كنيم. قبل از اينكه بخوايم مشخص كنيم كه يك Recordset چي جوري باز بشه بايد اول نشانه گذاري سمت سرور و سمت كلاينت رو مشخص كنيم. علت بسياري از خطاهايي كه در هنگام باز كردن Recordset رخ مي ده همين توجه نكردن به اين موضوع هستش. مثلاً شخصي كدي رو نوشته ظاهر كد درست هستش و هرچقدر كه دنبال خطي كه توش خطا داشته باشه مي گردي پيدا نمي كني اما بعداً متوجه ميشي كه خطا از مقداردهي يك خاصيت پدر صورت گرفته.
خاصيت CursorLocation:
براي تكميل توضيح فوق بايد نشانه گذاري رو مشخص كنيم. دقيقاً اين خاصيت مانند شي Connection هستش:
Server:
Rst.CursorLocation = adUseServer
Client:
Rst.CursorLocation = adUseClient
خاصيت LockType:
اين خاصيت درواقع يه حاشيه امنيت در هنگام كار با داده براي ما فراهم مي كنه. مثلاً وقتي كه درحال Update يك ركورد هستيم ركورد رو قفل مي كنه و ... من زياد باهاش كار نكردم براي همين نمي تونم توضيحي راجب اين خاصيت بدم فقط در اين حد مي دونم كه وقتي مي خوام ركوردهام رو فقط نمايش بدم(مثلاً در يك Grid) از مقدار adLockReadOnly استفاده كنم و اگر بخوام داده هام رو به روزرساني كنم از خاصيت adLockOptimistic استفاده كنم:
Rst.LockType = adLockReadOnly
Rst.LockType = adLockOptimistic
more...
يا:
Rst.Open ...,...,...,adLockReadOnly,...
Rst.Open ...,...,...,adLockOptimistic,...
more...
خاصيت Optimize:
متاسفانه نمي دونم چي هستش.
اوبالیت به بو
سه شنبه 06 اسفند 1387, 16:44 عصر
براي بازيابي اطلاعات يك جدول از پايگاه داده ميشه از خود شي Connection استفاده كرد. شي Connection يك متدي رو در اختيار ما قرار مي ده به اسم Execute كه از اسمش پيداست يعني اجرا كن. اين متد از ما يك دستوري رو براي بازيابي اطلاعات مي خواد كه مي شه از Store Procedure ها هم در اينجا استفاده كرد.
با اين دستور هم ميشه از Recordset استفاده كرد هم استفاده نكرد. همون طور كه مي دونيد Recordset يك حافظه Forward Only هستش يعني روبه جلو كه در خودش يك مجموعه ركورد رو ذخيره مي كنه.
شكل كلي كار به اين صورت هستش:
Set Rst = Conn.Execute (SQLStatment, Recordaffected, Option)
Recordaffected يك آرگومان اختياري هستش كه فكر مي كنم اكثر شما وقتي در داخل نرم افزار بانك اطلاعاتي كه باهاش يك Query اجرا مي كنيد (Access, SQL Server,...) ديده باشيد كه تعداد ركوردهاي درگير شده از اون دستور SQL رو به شما مي ده.
آرگومان Option مشخص مي كنه كه شما چگونه مي خواين اطلاعات رو بازيابي كنيد. درواقع همون CommandType در شي Command هستش با كمي تغييرات.
و اگر از Recordset هم استفاده نكرديد هيچ ايرادي نداره:
Conn.Execute SQLStatment, Recordaffected, Option
يك مثال:
Public Sub LoadAll_1()
Set Conn = New ADODB.Connection
Set Rst = New ADODB.Recordset
Conn.Provider = "Microsoft.JET.OLEDB.4.0"
Conn.ConnectionString = App.Path + "\Data Base\Test.mdb"
Conn.CursorLocation = adUseClient
Conn.Open
SQLQuery = "Select * From tblTest"
Set Rst = Conn.Execute(SQLQuery, , adCmdText)
Set frmMain.DataGrid1.DataSource = Rst
frmMain.DataGrid1.Refresh
End Sub
اوبالیت به بو
سه شنبه 06 اسفند 1387, 16:51 عصر
شي Command كارش اجرا كردن فرامين SQL يا اجرا كردن روال هاي ذخيره شده (S.P) هستش. در كل براي انجام هر كاري استفاده از اين روش توصيه ميشه چون
بر اساس يك الگوريتم كار مي كنه
منظم هستش
خواناي بالايي داره
با شي Command در پست هاي قبلي آشنا شديم و توضيح اضافه اي رو نمي دم.
مثال:
Public Sub LoadAll_2()
Set Conn = New ADODB.Connection
Set Cmd = New ADODB.Command
Set Rst = New ADODB.Recordset
Conn.Provider = "Microsoft.JET.OLEDB.4.0"
Conn.ConnectionString = App.Path + "\Data Base\Test.mdb"
Conn.CursorLocation = adUseClient
Conn.Open
SQLQuery = "Select * From tblTest"
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandText = SQLQuery
Rst.CursorType = adOpenKeyset
Rst.CursorLocation = adUseClient
Set Rst = Cmd.Execute
Set frmMain.DataGrid1.DataSource = Rst
frmMain.DataGrid1.Refresh
اوبالیت به بو
سه شنبه 06 اسفند 1387, 16:56 عصر
بعضي ها هم دوست دارن كه مستقيم Recordset خودشون رو Open كنن و اونجوري اطلاعات رو بازيابي كنن:
Public Sub LoadAll_3()
Set Conn = New ADODB.Connection
Set Rst = New ADODB.Recordset
Conn.Provider = "Microsoft.JET.OLEDB.4.0"
Conn.ConnectionString = App.Path + "\Data Base\Test.mdb"
Conn.CursorLocation = adUseClient
Conn.Open
SQLQuery = "Select * From tblTest"
Rst.ActiveConnection = Conn
Rst.CursorType = adOpenKeyset
Rst.CursorLocation = adUseClient
Rst.Open SQLQuery
Set frmMain.DataGrid1.DataSource = Rst
frmMain.DataGrid1.Refresh
End Sub
اوبالیت به بو
سه شنبه 06 اسفند 1387, 17:14 عصر
حال براي اينكه از نوشتن كد هاي اضافي پرهيز كنم ميام يك روال به اسم Connect مي سازم كه كارش اتصال و باز كردن بانك اطلاعاتي هستش و در هر جا كه خواستم ازش استفاده مي كنم:
Public Conn As ADODB.Connection
.
.
.
Public Sub Connect()
Set Conn = New ADODB.Connection
Conn.Provider = "Microsoft.JET.OLEDB.4.0"
Conn.ConnectionString = App.Path + "\Data Base\Test.mdb"
Conn.CursorLocation = adUseClient
Conn.Open
End Sub
اوبالیت به بو
سه شنبه 06 اسفند 1387, 17:23 عصر
در اين پست (http://barnamenevis.org/forum/showpost.php?p=684722&postcount=11) و اين پست (http://barnamenevis.org/forum/showpost.php?p=684726&postcount=12) و اين پست (http://barnamenevis.org/forum/showpost.php?p=684730&postcount=13) با نحوه بازيابي اطلاعات يك جدول آشنا شديم. هر سه روش يك كار رو انجام مي دن اما من از روش دوم (http://barnamenevis.org/forum/showpost.php?p=684726&postcount=12) يعني استفاده از Command رو پيشنهاد مي كنم. عرض كردم كه هيچ فرقي نمي كنه شما مي تونيد يك برنامه پايگاه داده رو به روش ها و شكل هاي مختلفي بنويسيد.
متد LoadAll من به اين شكل خواهد بود:
Public Sub LoadAll()
Set Cmd = New ADODB.Command
Set Rst = New ADODB.Recordset
Connect
SQLQuery = "Select * From tblTest"
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandText = SQLQuery
Rst.CursorType = adOpenKeyset
Rst.CursorLocation = adUseClient
Set Rst = Cmd.Execute
Set frmMain.DataGrid1.DataSource = Rst
frmMain.DataGrid1.Refresh
End Sub
من از اين روش براي درج، حذف و ويرايش نيز استفاده خواهم كرد.
اوبالیت به بو
سه شنبه 06 اسفند 1387, 17:30 عصر
اين متد كارش درج كردن يك ركورد در يك جدول هستش. همچنين براي ارسال Parameters از اين روش (http://barnamenevis.org/forum/showpost.php?p=678499&postcount=5) استفاده شده:
Public Sub Insert(ByRef َArgum...)
Set Cmd = New ADODB.Command
Set Rst = New ADODB.Recordset
Connect
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandText = "Insert Into tblTest (Field1)Values(@Field1)"
Cmd.Parameters.Refresh
Cmd.Parameters.Item(0).Value = Argum...
Rst.CursorType = adOpenKeyset
Rst.CursorLocation = adUseClient
Set Rst = Cmd.Execute
End Sub
اوبالیت به بو
سه شنبه 06 اسفند 1387, 17:35 عصر
اين روال كارش ويرايش كردن يك ركورد هستش. براي ارسال Parameters از اين روش (http://barnamenevis.org/forum/showpost.php?p=680574&postcount=7) استفاده شده:
Public Sub Update(ByRef strArgum As String, ByRef NumericField As Integer,....)
Set Cmd = New ADODB.Command
Set Rst1 = New ADODB.Recordset
Set Rst2 = New ADODB.Recordset
Connect
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandText = "Update tblTest SET Field1=@Field1 WHERE NumericField=@NumericField"
Set Parameters1 = Cmd.CreateParameter("@Field1", adInteger, adParamInput)
Cmd.Parameters.Append Parameters1
Set Parameters2 = Cmd.CreateParameter("@NumericField", adInteger, adParamInput)
Cmd.Parameters.Append Parameters2
Set Rst = Cmd.Execute(, Array(strArgum, NumericField))
End Sub
اوبالیت به بو
سه شنبه 06 اسفند 1387, 17:41 عصر
كار اين روال حذف يك ركورد هستش. براي ارسال Parameters از اين روش (http://barnamenevis.org/forum/showpost.php?p=680549&postcount=6) استفاده كردم:
Public Sub Delete(ByRef NumericValue As Integer, and more....)
Set Cmd = New ADODB.Command
Set Rst = New ADODB.Recordset
Set Param = New ADODB.Parameter
Connect
Cmd.ActiveConnection = Conn
Cmd.CommandType = adCmdText
Cmd.CommandText = "Delete From tblTest WHERE NumericField=@NumericField"
Cmd.Parameters.Refresh
Cmd.Parameters("@NumericField").Value = NumericValue
Rst.CursorType = adOpenKeyset
Rst.CursorLocation = adUseClient
Set Rst = Cmd.Execute
End Sub
اوبالیت به بو
چهارشنبه 21 اسفند 1387, 14:49 عصر
تمامي مطالبي كه تا كنون آموزش داده شد در اين برنامه گنجانده شده.
از هر سه روش براي ارسال Parameters استفاده شده
هر پنج متد آموزش داده شده در اين پروژه وجود دارند
اتمام اشيا Connection، Command، Recordset و parameters در اين پروژه استفاده شده
و...
mpmsoft
دوشنبه 14 اردیبهشت 1388, 22:07 عصر
خوب دوستان خیلی سریع شروع به کار می کنیم من خیلی خوشحال هستم از بابت این که می تونم اطلاعات و تجربیات کاری خودم رو در زمینه کریستال در اختیار جامعه برنامه نویسان ایرانی به اشتراک بذارم.
من سعی می کنم که این درسهارو خیلی مختصر ولی در عین حال کاربردی توضیح بدم.دوستان اگر سوالی داشتن می تونن مطرح کنند و بنده پاسخ می دم.
خوب دوستان بنده طی تجربیاتی که با انواع نرم افزار های گزارش ساز همچون DataReport - Crystal Report - Active Report - Fast Report و ... داشته ام به این نتیجه رسیدم که کریستال نسخه 10 جهت طراحی گزارشات بهترین آیتم برای وی بی 6 هست. البته نرم افزار های دیگر هم قابلتهای بسیار خوبی دارند ولی در کل سرعت عمل و منابع موجود جهت کریستال بسیار بیشتر از سایر نرم افزارهاست و از طرفی مورد تایید شرکت ماکروسافت هم هست.
mpmsoft
دوشنبه 14 اردیبهشت 1388, 22:23 عصر
خوب دوستان ابتدا برنامه کریستال ریپورت 10 رو اجرا کنید.
http://i44.tinypic.com/15nmyw8.jpg
و سپس گزینه New را جهت ایجاد گزارش جدید انتخاب کنید
در پنجره بعدی جهت درک بیشتر مطالب ساخت گزارش گزینه As a Blank report را انتخاب کنید
در این پنجره باید پایگاه اطلاعاتی رو به کریستال معرفی کنیم.
خوب دوستان کریستال تقریبا می تونه به تمامی بانکهای اطلاعاتی با پروتوکل های مختلف وصل بشه.
بنده هم نحوه اتصال به بانک Access و هم نحوه اتصال به بانک SQL Server را توضیح خواهم داد
به تصویر زیر دقت کنید....
http://i40.tinypic.com/24v8mtl.jpg
جهت ایجاد ارتباط با بانک گزینه Create New Connection را انتخاب کرده و سپس گزینه OLE DB ADO را انتخاب کنید.
در شکل زیر جهت ارتباط با بانک Access گزینه Microsoft Jet OLE DB 4.0 Provider و جهت ارتباط با بانک SQL Server گزینه Microsoft OLE DB Provider For SQL Server را انتخاب می کنیم.
http://i39.tinypic.com/31478t0.jpg
در مثالهای این دروس بنده از بانک SQL Server استفاده کردم.
در پنجره زیر تنظیمات مربوط به ارتباط با بانک اطلاعاتی را مشخص می کنیم.
نکته
دوستان به این نکته دقت کنید که در این قسمت ما فقط زمان طراحی گزارش این ارتباط را برقرار می کنیم و زمانی که نرم افزار رو روی سیستم دیگری نصب می کنید این ارتباط از طریق برنامه مجدد توسط کد نویسی انجام می شه.پس نگران این نباشید که اگر برنامه رو جایی کپی کنید دوباره باید این تنظیمات رو دستی عوض کنید !!!
Babak.Hassanpour
دوشنبه 14 اردیبهشت 1388, 22:35 عصر
ممنون که آموزش رو برای کریستال شروع کردید.
اگه ممکنه قبل از شروع مباحث مبتنی بر SQl Server ، یه راهنمای مختصر برای راه اندازی SQL Server همراه با نسخه مناسب برای ویندوز XP معرفی کنید.
با تشکر
sohrab o
دوشنبه 19 مرداد 1388, 15:13 عصر
دوستان در این قسمت من هم تعداد زیادی نمونه سورس کار با بانک اطلاعاتی معرفی کردم
http://barnamenevis.org/showthread.php?t=37168&page=16
rasoul babadi
دوشنبه 26 آبان 1393, 20:26 عصر
درود بر همه دوستان خوبم. من دارم یه برنامه با اکسس 2010 و ویژوال بیسیک 6 می نویسم بانکم رو ساختم برنامه رو هم تا حدودی طراحی کردم. می خواستم صاحب نظران عزیز بانک من رو با خواسته هام مورد ارزیابی قرار بدن ببینم درست هست یا نه
1- من قصد دارم با وارد کردن مشخصات فرم لاگین نام کاربری و وضعیت کاربر مثلا مدیر یا کاربر است در فرم اصلی نمایش داده شود. ماننده تصویر زیر
2- قصد دارم یک سند رو توی صندق خودم ذخیره کنم و توی فرم اصلی جمع برداشت از صندوق و جمع واریزی یا دریافت های صندوق و همچنین موجودی واقعی صندوق رو نمایش بده
3- توی فرم سند اگر کمبو باکس دریافت رو انتخاب کرد به موجودی اضافه شود و اگر برداشت رو انتخاب کرد از موجودی کم شود.
4 - اگر بانک نیاز به اصلاح داره من رو همراهی کنید با سپاس بیکران
تصویر زیر شامل جداول بانک است
125810
تصویر زیر فرم اصلی و فرم سند.
125811
pooyagh
پنج شنبه 21 خرداد 1394, 14:43 عصر
سلام راستش به یه مشکلی برخوردم
یه بازی نوشتم ک باید رکورد هر کس ارسال شه به یه پایگاه داده انلاین میشه راهنمایی کاملم کنید ممنون
alireza_58
دوشنبه 08 تیر 1394, 10:34 صبح
سلام به دوستان و اساتید گرامی
بنده قصد اخذ گزارش به کریستال ریپورت رو در vb6 برای اولین بار دارم که پس از تعریف بانک اطلاعات و ایجاد فرم گزارش پیغام "server dad not yet been opened " صادر میشه لطفا در صورت امکان راهنمایی فرمایید.
blogeshg
دوشنبه 20 مهر 1394, 16:23 عصر
سلام دوست عزیز ممنون از تایپیک خوبتون
یه سوال ؟؟؟ من میخوام یه نرم افزار طراحی کنم که به دیتا بیس سایت متصل بشه و اطلاعات وارد کنم یا اطلاعات رو ویرایش کنم و تو اون جدول ها جستجو کنم ولی نمی تونم چجوری به دیتا بیس سایت وصل بشم خواهش میکنم جواب بدین خیلی واجبه
A.ardalan far
دوشنبه 13 اردیبهشت 1395, 09:38 صبح
دوستان این روش ها برای دیتابیس mysql هم کاربرد دارد یا فقط برای sql serevr هست؟
omid aboozari
سه شنبه 27 مهر 1395, 11:40 صبح
سلام منم مانند دوستانی که بالا گفتن می خوام از پایگاه داده تو سایتم استفاده کنم. چیکار باید بکنم.
یه پروژه نوشتم و الان می خوان این امکان رو تو دستور کار قرار بدن که فرد برای گرفتن نوبت تو تاریخ معیین از سایت استفاده کنه و نوبت بگیره . راهی هست که بتونم برنامه خودم رو به پایگاه داده توی اینترنت وصل کنم و اون اطلاعات رو بگیرم نمی خوام چیز جدیدی بهش اضافه کنم و یا پایگاه داده سایت رو تغییر بدم .
اطلاعات مورد نیاز رو از فرد توی سایت بگیره تو پایگاه داده سایت ذخیره کنه . بعد من از طریق برنامه اطلاعات پایگاه داده سایت رو بخونم و اونا رو بریزم تو پایگاه داده برنامم
اگه کمکم کنین ممنون می شم
فقط زود و سریع
مرسی همه دوستان
isaac23
دوشنبه 11 بهمن 1395, 08:00 صبح
دوست عزیز فکر کنم شما نیاز به یک هاست ویندوزی دارید که داخل هاست چایگاه داده رو بسازید و از طریق اون این کار رو انجام بدید اینجوری نمیشه که یه بانک خود بسازی و اونو اپلود کنی جایی و به عنوان پایگاه داده انلاین ازش استفاده کنی ....
توی سایت ها بگردی هاست ویندز که قابلیت اتصال به پایگاه داده اکسس و sql و غیره زیاد هست .. کد نویس هم فرقی با افلاین نداره فقط بجای ادرس بانک ای پی سایتی که بهت میدن رو میزنی و بقیه کار مثل قبلی هست . فقط از لحاظ امنیت باید دقت کنی اطاعات مهمی اگه هست اینکارو نکنی بهتره
GHOLAMIH4
سه شنبه 06 آذر 1397, 09:52 صبح
سلام
یه سوال داشتم ممنون میشم کمکم کنین...
برای ضرب یک عدد در ستونی از داده در ویژوال بیسیک چطوری باید عمل کنم ؟؟
در واقع در یک Form ، یک textbox وجود دارد که توسط کاربر عدد وارد میشود. و یک ستون داده ای از access داخل ویژوال بیسیک دارم که میخوام عدد داخل textbox در تک تک سطر های این ستون ضرب بشه و حاصل نمایش داده بشه. با چه دستوری میشه اینکارو کرد ؟؟
abbasmirzaeinia
شنبه 18 دی 1400, 10:49 صبح
سلام دوستان من میخواستم از طریق کد نویسی نام یک تیبل رو عوض کنم خیلی ضروریه بانکم اسکیو ال هست ممنون
vblink
دوشنبه 20 دی 1400, 09:36 صبح
سلام در ویژوال بیسیک 6 ار قسمت References تیک گزینه Microsoft DAO 3.6 را بزنید
بعد از طریق کد زیر می توانید نام یک تیبل را تغییر دهید.
Dim dbSS As Database
Dim strDbName As String
strDbName = "c:\temp\test.mdb"
Set dbSS = OpenDatabase(strDbName)
dbSS.CreateTableDef
dbSS.TableDefs("R2").Name = "Org_R2"
dbSS.Close
Set dbSS = Nothing
abbasmirzaeinia
شنبه 02 بهمن 1400, 10:39 صبح
سلام در ویژوال بیسیک 6 ار قسمت References تیک گزینه Microsoft DAO 3.6 را بزنید
بعد از طریق کد زیر می توانید نام یک تیبل را تغییر دهید.
Dim dbSS As Database
Dim strDbName As String
strDbName = "c:\temp\test.mdb"
Set dbSS = OpenDatabase(strDbName)
dbSS.CreateTableDef
dbSS.TableDefs("R2").Name = "Org_R2"
dbSS.Close
Set dbSS = Nothing
ممنونم از وقتی که گذاشتید اما این کد فقط در مورد بانک اکسس جواب میده و در واقع نمیتونه نام تیبل اسکیو ال رو عوض کنه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.