PDA

View Full Version : چگونگی آمار گیری از دیتا بیس access در vb.net 2005



shahrooz_tk
دوشنبه 13 آذر 1385, 22:06 عصر
کسی هست که بدونه چجوری میشه در VB.Net 2005 از یک بانک اطلاعاتی Access آمار گیری کرد ؟
مثلا در یک table از یک بانک چند تا اسم "علی" وجود دارد .


ممنون می شوم اگر مرا راهنمایی فرمایید

shahrooz_tk
سه شنبه 14 آذر 1385, 12:32 عصر
کسی نمی تونه در این باره منو راهنمایی کنه ؟

problem
سه شنبه 14 آذر 1385, 13:50 عصر
خوب سوال من اینه که آیا شما SQL بلدی یا نه. منظور زبان برنامه نویسی SQL هست ها! اگر بلد باشی، کافیه ساختن یک datatable رو یاد بگیری، و بعد دستوری که اون رو تغذیه میکنه رو همچین چیزی بذاری:


SELECT COUNT(*) As cnt FROM tblSomeThing WHERE Name=N'علی'

shahrooz_tk
سه شنبه 14 آذر 1385, 14:13 عصر
نه SQL بلد نیستم . مگر با access چنین چیزی ممکن نیست ؟

problem
سه شنبه 14 آذر 1385, 14:20 عصر
SQL زبان مشترکی برای برنامه نویسی و کار کردن با تمام دیتابیس ها است. در واقع وقتی شما با ویزاردهای Visual Studio کار می‌کنید، ظاهرا دارید به طور کاملاً ویژال کار می‌کنید، اما در باطن، Visual Studio تمام کارهایی که شما می‌کنید را به زبان SQL ترجمه می‌کند و برای دیتابیس می‌فرستد!

با این حساب توصیه من به شما دو چیز است (که خیلی هم مهم و اساسی است و به درد آینده هم می‌خورد.) یکی یاد گرفتن SQL مثلا با رفتن به این سایت (http://www.w3schools.com/) (بخش آموزش SQL اش)، و دوم یاد گرفتن ارتباط با دیتابیس بدون استفاده کردن از ویزاردهای VS که در واقع فقط آدم را تنبل و خنگ بار می‌آورند!

با ارادت

vahidiran
سه شنبه 14 آذر 1385, 16:06 عصر
در ضمن دوست عزیز برای اینکه بنونی با database کار کنی و خروجی های database رو در بیاری باید ado.net رو بلد باشی که داخل اون سه تا کلاس است Oledbconnection برای اتصال به بانک oledbdataadapter موتوری که اطلاعات رو از دیتا بیس واکشی کرده یا اونا رو در database ذخیره می کنه و همچنین DataSet که مثل یک ظرف پر از دیتا می باشه که می تونی اطلاعات رو توی اون دستکاری کنی مثلا نتیجه دستورات sql رو بریزی داخل این ظرف بعد این dataset رو اطلاعلتش رو بریزی تو جدول یا اینکه بریزیشون توی crystalReport برای گزارش در ضمن تمامی ترانس اکشن های database رو هم میتونی با oledbadapter انجام بدی مثلا اضالفه کردن به بانک ، حذف رکورد از بانک و یا بروز رسانی اطلاعات ولی تکنیک های خاص خودش رو داره ، نمی دونم قبلا با هیچ Interface مثلado و یا dao و یا حتی odbc کار کرده ای یا نه اگر کار کردهای بگو که من فرق بزرگ واساسی بین ado.net و دیگر Interface ها رو به شما بگم ،

problem
سه شنبه 14 آذر 1385, 16:14 عصر
البته فکر میکنم دونستن SQL فعلا بیشتر از دونستن تفاوت ado.net و بقیه به درد بخوره، اما اگر خود شهروز هم مایل باشه، من هم دوست دارم بشنوم، و این وسط چیزهایی هم یاد بگیرم.

shahrooz_tk
سه شنبه 14 آذر 1385, 17:12 عصر
من فقط با ADO بلد هستم کار کنم .

shahrooz_tk
سه شنبه 14 آذر 1385, 17:16 عصر
دوباره ممنون از کمک شما Problem ، به خاطر فایل . در مورد تایپیک هم منو بخشید . بیسوادی دیگه !

shahrooz_tk
سه شنبه 14 آذر 1385, 17:56 عصر
آیا شما می توانید مثل فایلی که برای من قرار دادید ( فایل کد ذخیره کردن فایل ) فایلی هم برای روش آمار گیری در DB برای من قرار دهید ؟

vahidiran
سه شنبه 14 آذر 1385, 19:31 عصر
دوست عزیز یه برنامه نوشتم ، یعنی تعدا کلمه "علی" رو توی جدول می خونه و چاپ می کنه از دستور sql که problem نوشته بود استفاده نکردم چون خودم هم بلدش نبودم و از ویزاد استفاده کردم تا یه خورده برای شما راحت تر باشه ، از یک sql دیگه اسفاده کردم ، در ضمن به راحتی می تونی روی این فرم سه تا کلاسی که گفتن ببینی
ولی می گم یه هفته بخونی ado.net یه عمر حالشو می بری من یکی که لذت می برم :لبخند:

البته بگم جگرم در آمد با یک کامپیوتر 1.5 سلرون نوشتن برنامه با vb.net 2005
life is beautiful :لبخند: :لبخند: :گیج: :قهقهه:


تفاوت اصلی میان ado.net و دیگرinterface ها اینه که ado.net ماهیت connection less داره ؟ یعنی اینکه وقتی که توسط oledbconnection ( که خاصیت مسیر فیزیکی دیتا بیس در این کلاس set می شه ) یه لحظه وصل شده بر اساس تنظیمات و نوع query که برایش تعریف کرده اید ( که شامل sql ) هم می تونه باشه داده ها مورد نظر رو می خونده و در dataset می ریزه و ارتباطش رو با دیتا بیس قطع می کنی و زمانی دوباره وصل می شه که داده ها رو بخواهی بروز رسانی کنی یا یه داده جدید بخواهی واکشی کنی . در interface های قبلی وقتی که به دیتابیس وصل می شدی تا زمان فراخوانی متد close دیتا بیس در اختیار برنامه بود و اگر برنامه دیگر می خواست از دیتا بیس استفاده کنه اجازه نمی داد و یا اگه دیتا بیس اشتراکی بود بحث قفل کردن رکورد و یا batch کردن دیتا بیس و .... پیش می آمد>

حالا دوستان شما به من بگید فرض کنید در یک برنامه تحت شبکه اطلاعات مربوط به یک رکورد هر لحظه توسط کاربران عوض می شه و کاربران هم باید همیشه از آخرین مقدار آن رکورد با خبر باشند ؟ فکر می کنید می توان از ado.net استفاده کرد یا نه ؟ اگر جواب بله هست چه جوری و اگه نه چرا نمی توان؟

problem
سه شنبه 14 آذر 1385, 19:36 عصر
اگر شما MSDN نصب کردی، از توی Visual Studio‌ تو منوی Help گزینهٔ How Do I رو بزن، و همهٔ موارد رو بخون. برای آموزش اولیه خوبه. هم سوالی که این‌جا پرسیدی و هم اونی که برات کد فرستادم، با کمک همین‌ها قابل حله. من هم برنامه‌نویس حرفه‌ای نیستم (تازه بیشتر مبتدی‌ام تا مثلاً متوسط!)، فقط زبانم خوبه و Help می‌خونم! توصیه‌ام اینه که مفاهیم پایه رو از همون‌جا که گفتم یاد بگیری.

در ضمن، اگر زبانت خوبه، و / یا به انترنت پر سرعت دسترسی داری، چندتا منبع عالی برای یادگیری مقدماتی می‌شناسم که رایگان بگیری و لذت ببری. بهم بگو، خوب؟

چون دوست دیگه‌مون زحمت برنامه رو کشید، من دیگه ننوشتمش. بعدا برنامه‌اش رو چک می‌کنم ببینم چرا چیزی که من گفتم رو بلد نبوده، و اگر رسیدم، توضیح می‌دم همه یاد بگیریم.

problem
سه شنبه 14 آذر 1385, 19:38 عصر
جواب سوال شما رو هم با کمی تحقیق می*دم وحیدجان، اما یک سوال: این سوال که پرسیدی جوابش رو خودت نمی*دونی، یا این که می*خوای ببینی ما چند مرده حلاجیم؟ (که از نظر من ایرادی نداره.)

problem
سه شنبه 14 آذر 1385, 20:56 عصر
وحید این SQL رو استفاده کرده:


"select * from table1 where table1.name like 'علی'"

مال من به جای 'علی' می‌گفت 'علی'N که این N یعنی چیزی که در ادامه می‌آد متن Unicode هست (تا SQL سرور یه وقت دچار خطا نشه و مثل متن ASCII‌ تلقی‌اش نکنه.) به جای like هم من مساوی گذاشتم که فرقش روشنه (این like یعنی متن شامل سه کاراکتر ع و ل و ی به همین ترتیب باشه، طوری که قبل و بعدش چیز دیگه‌ای نباشه! خوب اینم می‌شه همون WHERE با مساوی دیگه!)
به جای این که تمام ردیف‌ها رو بگیرم، بعد بشمرمشون هم، من زرنگی کردم و از اول از SQL خواستم تعدادشون رو بگه : (*)SELECT COUNT
دست آخر این که برای این که این تعداد رو بتونم فراخونی کنم، بهش اسم دادم: AS cnt یعنی این که یک فیلد مجازی در Recordset بازگشتی تعریف کنه به نام cnt که مقدارش همون مقدار عددی COUNT مربوطه باشه!!

shahrooz_tk
سه شنبه 14 آذر 1385, 21:25 عصر
باز هم تشکر از راهنماییتون .
خدمت شما باید عرض کنم کنم که من برای خودم بهتر دیدم که برای یادگیری VB.net با یک پروژه شروع کنم . این سوالات هم که می پرسم برای همین است و بزرگترین مشکلی هم که دارم به گفته ی دوستمان ضعیف بودن زبان من است که واقعا من رو آزار می دهد . من هنوز برنامه را امتحان نکردم و اگر در پروژه من جواب داد حتما جوابش رو به شما خبر می دهم .

vahidiran
چهارشنبه 15 آذر 1385, 08:08 صبح
اولندش با این دستور Count چه جوری می توان خروجی را داشته باشیم در ado.net رکورد ست معنایی نداره
بعدش اگه بخواهیم همون دستور Like من یونیکد بشه چه جوری باید بنویسمش ؟

در ضمن من هیچ ادعایی ندارم ، چون اگه مالی بودم سر از این سایت در نمی آوردم ولی قبول دارم طوری سوال رو مطرح کردم که یه بادی تو گردنم انداخته باشم معذرت خواهی من رو بپذیرید:ناراحت:

در مورد جواب سوال بگم جوابش من می دونم ولی ناقص اولندش تو شبکه نمی شه یا اینکه یه عالم کلک سوار کنی تا بتونی استفاده کنی که این سبب از دست دادن منابع ات از جمله زمان می شه که این کد استاندارد یا بهتر بگم الگوریتم استانداردش نیست من از یک اهل فن سوال کردم ( از جواب های قبلی به نظر من اهل فن بود ) گفت نمی شه و باید ado استفاده کنی ولی من مطمئنم که می شه چون ماکروسافت یه عالم تبلیغ و ادعا داره روی ado.net که روی دو platform کار می کنه یعنی application و web حالا چنین مبحثی رو که از قدیم بوده و جزو تکنیک ها ی (DBMS (database manager system هسته یعنی فراموش کرده :متفکر: :متفکر: :متفکر:

problem
چهارشنبه 15 آذر 1385, 09:37 صبح
کی گفته در ADO.Net رکوردست معنی نداره؟! همه دیتابیس‌ها رکوردست بر می‌گردونن (این قدری که من می‌فهمم) اما ADO.Net این رو به یک DataTable یا DataSet تبدیل می‌کنه و به ما نشون می‌ده!

برای SQL Server یک متن (String) همیشه بین دوتا ' قرار می‌گیره، اما برای تاکید بر یونیکد بودنش، باید قبل از اولین ' یه دونه N بزرگ گذاشت. این به خصوص موقعی که خودت دستور INSERT لازم برای کار با یک جدول رو تعیین می‌کنی به درد می‌خوره. (وقتی خود VS دستورات رو می‌سازه هم همیشه این رو رعایت می‌کنه.)

معذرت خواهی لازم نیست. اعدامش کنید!! ؛)

اما درباره سوال، خوب من تا حالا برام پیش نیامده بوده که بهش فکر کنم، یا تحقیق کنم، و سوال هم خیلی کلی پرسیده شده؛ اما چند نکته:

۱) اگر منظور از این که همه باید از تغییرات خبر داشته باشن، اینه که مثلاً اشتباهی تغییرات هم رو Overwrite نکنن که، این رو ADO.Net ساپورت می‌کنه. با روشی که الآن جزئیاتش یادم نیست، قبل از اعمال تغییراتی که شما دادی، چک می‌کنه تو این فاصله کسی تغییر نداده باشه. تو همون فرم‌های ویزاردش هم یک checkbox برای این که این مساله رو چک بکنه یا نکنه داره انگار.

۲) اگر منظور اینه که مثلاً هر تغییر کوچکی که صورت گرفت، DataGridView‌ برای همه باید به روز رسانی بشه (منظور همهٔ کاربرانی که برنامه‌شون بازه) خوب مگه فکر کردی روش‌های connected مثل ADO چه هنری می‌کنن؟ که connected‌ هستن؟ در دنیای شبکه، همه چیز یه جورایی disconnected هست! connected بودن یعنی یک چیز disconnected هر ثانیه (یا هر میلی‌ثانیه) داره Refresh می‌شه! خوب شما هم می‌تونی همچین کدی رو بنویسی! درسته که برنامه رو کند می‌کنه (گرچه اگر با یک Thread جدا بنویسی شاید کند هم نکنه) اما خوب این بهایی هست که باید بپردازی برای نتیجه‌ای که می‌گیری.

۳) یه چیز دیگه هم هست. این که هر اطلاعاتی باید به موقع‌اش آپدیت شه. هر ثانیه آپدیت کردن DGV ای که باز نیست، به هیچ کار نمی‌آد! هم‌چین DGV‌ای باید موقع Show شدن فرمی که توشه، و بعد از اون مثلا هر ثانیه، تا وقتی فرم Hide شدش آپدیت شه! این نکات کوچیک می‌تونه تاثیر زیادی رو عملکرد برنامه بذاره.

vahidiran
چهارشنبه 15 آذر 1385, 16:53 عصر
درسته راه هایی شما می گید
ولی من دنبال الگوریتم استاندار ش هستم حالا زیاد هم مهم نیست هز وقت یخ پروژه شبکه ای خورد به طور مون درستش می کنیم

problem
چهارشنبه 15 آذر 1385, 17:40 عصر
راستش گمان نکنم راه استانداردی براش باشه، ولی اگر یادم موند دنبالش می*گردم.
موفق باشید.

titbasoft
چهارشنبه 15 آذر 1385, 18:00 عصر
حالا دوستان شما به من بگید فرض کنید در یک برنامه تحت شبکه اطلاعات مربوط به یک رکورد هر لحظه توسط کاربران عوض می شه و کاربران هم باید همیشه از آخرین مقدار آن رکورد با خبر باشند ؟ فکر می کنید می توان از ado.net استفاده کرد یا نه ؟ اگر جواب بله هست چه جوری و اگه نه چرا نمی توان؟اگر درست متوجه سوال شده باشم، کاری رو که شما می خواهید انجام بدید، Service Broker در SQL Server 2005 به زیبایی انجام میده. برای اطلاعات بیشتر در مورد Service Broker سوالتون رو در بخش SQL Server مطرح کنید.

problem
چهارشنبه 15 آذر 1385, 18:42 عصر
اگر سیستم تشکر بود، من یک تشکر از کامنت بالا می*کردم!

vahidiran
پنج شنبه 16 آذر 1385, 08:33 صبح
حقیقتش اینی که دوست خوبمون گفتن تا حالا من نمی دونستم چون اصولا که چه عرض کنم من همیشه با access کار می کنم و از sql server زیاد چیز نمی دونم

در ضمن از اول بحث این تاپیک روی Access بود

problem
پنج شنبه 16 آذر 1385, 09:11 صبح
خوب از اول هم توقع نمیرفت که Access بتونه همچین کاری رو انجام بده. Access محیط Multiuserی نیست، که چند تا کامپیوتر رو بتونه تغذیه اطلاعاتی کنه.

titbasoft
پنج شنبه 16 آذر 1385, 10:23 صبح
اولا ببخشید که در مورد SQL Server توضیح دادم، ثانیا فلسفه وجودی Access استفاده Desktop است پس ابزار مناسبی برای توسعه نرم افزار به صورت توزیع شده (Distributed) نیست.

problem
پنج شنبه 16 آذر 1385, 10:53 صبح
منظور من هم همین بود که titbasoft گفت، اما اون بهتر از من گفت.

vahidiran
جمعه 17 آذر 1385, 16:44 عصر
ولی برای یه نرم افزار که بدون دردسر بخواد نصب شه و دیگه لازم نباشه sqlserver روش نصب شه access بهترینه ولی اگه ترانس اکشن های سیستم وحشتناک زیاد باشه و رشد داده ها در سیستم هم زیاد (بیشتر 5 مگابایت در روز ) و همچنین ارزش داده ها زیاد البته که هیچی Sqlserver نمی شه

problem
جمعه 17 آذر 1385, 18:25 عصر
اما شما پرسیدی که:


الا دوستان شما به من بگید فرض کنید در یک برنامه تحت شبکه اطلاعات مربوط به یک رکورد هر لحظه توسط کاربران عوض می شه و کاربران هم باید همیشه از آخرین مقدار آن رکورد با خبر باشند ؟ فکر می کنید می توان از ado.net استفاده کرد یا نه ؟ اگر جواب بله هست چه جوری و اگه نه چرا نمی توان؟

و برای برنامه چند کاربرهٔ تحت شبکه، Access اصلا گزینه نیست، چه برسه به گزینهٔ خوب!