ورود

View Full Version : سوال: كار كردن با insert در Sql server



E_Alikhani
یک شنبه 24 آبان 1388, 10:28 صبح
سلام دوستان

من برنامه هايي كه مي نويسم بانك اطلاعاني Sql server 2000 است و دلفي كه از كانكشن Ado استفاده مي كنم اما بعد از مدتي سرعت خواندن از بانك خيلي كم ميشه (از Locate براي جستجو و از Append و post براي ايجاد و ذخيره كردن استفاده مي كنم) حالا دنبال يك روش بهتر مي گردم كه از SP هم استفاده كردم بهتر شد ولي حال براي اضافه كردن داده در بانك مشكل دارم يعني نمي دونم كه وقتي با Insert كار مي كنم اونا چطوري هدايت كنم براي اينه خودش مستقيم توي بانك اضافه ميشه و اگر كاربر بخواد انصراف بده چكار بايد كرد و مشكلات ديگر ....
اگر دوستان سريع كمك بكنند ممنون مي شم

alinikaein
یک شنبه 24 آبان 1388, 13:21 عصر
سلام دوست عزيز؛

فرقي نمي‌كنه، (البته شايد من متوجه منظورم شما نشدم). ولي شما چه از طريق Post و چه از طريق Insert اطلاعات را وارد كنيد، در هر صورت اطلاعات ذخيره مي‌شه و كاربر ديگه نمي‌تونه انصراف بده.

حالا دقيقاً مشكل شما چيه؟

اگه دقيق بفرماييد، بهتر مي‌شه راهنمايي كرد.



يا علي... موفق باشيد...

E_Alikhani
یک شنبه 24 آبان 1388, 14:06 عصر
سلام
اولا : كاربر ديگري كه نمي خواهد انصراف بدهد همان كاربري كه داره اطلاعات را وارد ميكنه را ميگم

ثانيا : فرق مي كنه شما يك بانك درست كن كه حدود 200 هزار ركورد داشته باشه و بعد روش search بذار متوجه مي شي و يا با دستور append يك ركورد اضافه و ذخيره كن. متوجه مي شي كه چقدر سرعت براي ذخيره و يا جستجو پايين مياد.

ما كه تست كردم و فرق مي كرده

alinikaein
یک شنبه 24 آبان 1388, 14:15 عصر
دوست عزيز منظورم اين بود كه براي انصراف Post كردن و Insert تفاوتي نداره.

كاربر بعد از اين كه اطلاعات را Post كرد، چطوري انصراف مي‌ده؟ متوجه اين نشدم.

E_Alikhani
یک شنبه 24 آبان 1388, 15:16 عصر
شما LockTyoe را در حالت ltBatchOptimistic قرار بده و بعد از post اگر خواستي ذخيره بكني از UpdateBatch مي كني و اگر خواستي انصراف بدي CancelBatch مي كني در صورتي كه عمل insert بصورت مستقيم در بانك ذخيره مي كنه و ديگه حالت انصراف نداري؟!

Hadi_Fayyaz
یک شنبه 24 آبان 1388, 16:01 عصر
سلام دوست عزيز
در دستور هاي SQL هم امكان برگشت وجود داره كافيه قبل از Insert , Delete , Update دستور Begin Trasaction رو بنويسي و در پايان اگه خواستي اطلاعات واقعا ثبت بشه دستور Commite Transaction و در غير اين صورت دستور Rolback رو استفاده كني.
اما در مورد سرعت من فكر ميكنم اگه دستوراتتون رو توي يك Stored Procedur بنويسيد و از داخل برنامه فقط دستور اجراي اون رو بديد سرعت خيلي بهتر ميشه من خودم يك بانك اطلاعاي دارم كه خيلي بيشتر از اوني كه فكرش رو بكنيد داراي ركورد و تراكنش هست ولي هيچ وقت هم با كمبود سرعت در ذخيره سازي اطلاعات مواجه نشدم البته در مورد گرفتن Query يك مقدار سرعت كم شده.
موفق باشيد

E_Alikhani
دوشنبه 25 آبان 1388, 07:14 صبح
دستور Begin Trasaction , Commite Transaction ,Rolback رو من كجا بايد استفاده كنم داخل دلفي و يا داخل Sql
اگر امكان داره يك تكه برنامه بذاري ممنون مي شم

البته دارم برنامه با Stored procedure مينويسم چون تست كردم خيلي تو سرعت تاثير دارد

benyaminrahimi
دوشنبه 25 آبان 1388, 07:57 صبح
هماه چیزایی که بچه نوشتن درست
ولی شما دقت کنید
گر بانکتون و روشتون درست طراحی نشده باشن سرعت fetch و exec در دلفی و sql زیاد فرقی نداره
بهترین مثال مه در این مورد تو books online میتونی پیدا کنی

اگه دیتا بیست یک دفعه کند شده دقت کن بببین حجم لاگ فایل چقدر شده
اگر خیلی غیر واقعی بود دیتا بی و لاگ فایل باید shrink بشه

Hadi_Fayyaz
دوشنبه 25 آبان 1388, 08:41 صبح
دستور Begin Trasaction , Commite Transaction ,Rolback رو من كجا بايد استفاده كنم داخل دلفي و يا داخل Sql
اگر امكان داره يك تكه برنامه بذاري ممنون مي شم

البته دارم برنامه با Stored procedure مينويسم چون تست كردم خيلي تو سرعت تاثير دارد
دوست عزيز
اگه اطلاعاتي روي ديتابيس ثبت نهايي شد ديگه قابل برگشت نيست مگه اينكه دوباره اونها رو Update كني اما دستوراتي كه براي برگردوندن اطلاعات در SQL پيشبيني شده براي اينه كه ممكنه شما چند تا دستور Insert و يا Update ويا Delete داشته باشيد كه به همديگه وابسته اند مثلا ميخوايد اول يك اطلاعاتي حذف بشه و بعد حتما اطلاعات ديگه اي ثبت بشه اين دو تا دستور يا بايد اصلا اجرا نشن و يا اگه اجرا ميشن هر دوتاشون اجرا بشن حالا اگه به هر دليلي يكي از اين دوتا دستور اجرا نشد شما بايد بتونيد كل عمليات رو كنسل كنيد اين كار توي SQLSerever و توي كد هاي مربوط به STored Procedur معمول هست البته شايد ADOQuery دلفي هم اين كد ها رو قبول كنه ولي من تا حالا امتحان نكردم. به كد زير توجه كن

Begin Transaction
Insert........
Delete.......
Commite Transaction
تو دستور بالا اگه دستورات بين Begin Trans و Commite بدون اشكال اجرا بشن دستور Commite هم اجرا ميشه و اطلاعات ثبت نهايي ميشن ولي اگه قبل از رسيدن به Commite اشكالي بوجود بياد و دستور commite اجرا نشه هيچ كدوم از دستور ها به صورت نهايي روي ديتابيس اعمال نميشند. طور خلاصه اگه شما قبل از دستوراتون Begin Trans گذاشتيد تا زماني كه دستور Commite يا EndTrans اجرا نشه قابل برگشته و ميشه با دستور RolBack تغييرات رو برگردوند.
البته اين مبحث خيلي طولانيه و دستور هاي commite و RolBack كاربرد هاي زيادي دارند كه من پيشنهاد ميكنم يك نگاهي به كتاب A Guide to SQL/DS نوشته C.J.Date بندازيد فكر ميكنم ترجمه فارسيش هم اين روزها تو بازار پيدا بشه

اما در مورد سرعت بايد تاكيد كنم تفاوت زيادي بين استفاده از دستورات SQL در دلفي و استفاده از اونها در StoredProcedur هست شما وقتي در دلفي دستور SQL مينويسيد دلفي در زمان اجرا شروع به تفسير دستور نوشته شده ميكنه بعد اطلاعات لازم رو از ديتابيس استخراج ميكنه و روي اونها عمليات لازم رو انجام ميده و بعد تغييرات رو دوباره روي ديتابيس ذخيره ميكنه. در حالي كه وقتي شما از StoredProcedure استفاده ميكنيد كار تفسير دستورهاي نوشده شده در Stored Procedure در همون زمان ذخيره StoredProcedur براي يكبار انجام ميشه و در زمان اجرا هم چون StoredProcedure داخل خود ديتابيس هست ديگه لازم نيست تبادل اطلاعات زيادي بين برنامه و ديتابيس انجام بشه بنا بر اين سرعت افزايش پيدا ميكنه
البته حجم Log در SQL و نوع طراحي ديتابيس و به خصوص حجم اطلاعاتي كه داخل يك ركورد نگهداري ميكنيد هم بي تاثير نيست. مثلا اگه شما در ديتابيستون تصوير نگهداري ميكنيد و حجم هر تصويز هم خيلي زياد باشه اونوقت نبايد انتظار داشته باشيد كه اين اطلاعات در مدت كمتر از يك ثانيه ذخيره بشه.

حسین شهریاری
دوشنبه 25 آبان 1388, 09:13 صبح
با سلام

با تشکر از کلیه اساتید
همه جوابها به نوعی درست و نظر همه عزیزان محترم است.ولی خدمت دوستمون که سوال بالا را مطرح کردند عرض کنم که اگه شما دلفی کار هستید نیازی نیست نگران باشید.چراکه متدهای دلفی همه بر اساس SQL هستند و همیشه بهترین انتخاب برای کار نیز هستند.مثلا متد INSERT را در نظر بگیرید،
اگر چند لایه عقب برگردید دقیقا خواهید دید که در پشت صحنه دقیقا دستور Insert into مربوط به Sql را میسازد.وسایر متدها نیز به همین شکل هستند.برای جستجو نیز Locate بهترین کارایی را دارد.به عرض برسونم که توی هر زبان یا توی هر ساختاری به هیچ عنوان استفاده از زیر برنامه سرعت را افزایش نمیده
این برای همه اشتباه جا افتاده و تا اسم زیر برنامه میاد سریع میگن سرعت افزایش پیدا میکنه.استفاده ار زیر برنامه فقط خانایی برنامه را بالا میبره و هیچ سرعتی به اجرای برنامه نمیده بلکه باعث تسریع در کد نویسی میشه.اگه اسمبلی کار کرده باشید میدونید که سرعت ماکرو از پروسه بالا تره چراکه پروسه(توی هر زبانی) در زمان آدرس مکان فعلی را در استک ذخیره کرده ، میره دستورات روال را اجرا میکنه سپس آدرس ادامه کار را ار استک بر میدادره و خطوط بعدی را اجرا میکنه.پس همین امر چند سیکل ماشین وقت نیاز داره.
توی بحث شما هم همینطوره یعنی شما اگه از متدهای تعبیه شده خود دلفی استفاده کنید و خودتون کدنویسی کنید بهتر از اینه که کار را به StoredProcedure بسپارید.
اینم که دوستان بالا فرمودن درسته ولی باید بگیم که استفاده از StoredProcedure فقط باعث میشه لایه
کاربردی از لایه دیتابیس مجزا شده و برنامه شما روتین تر بشه.پس توصیه میکنم از خود متدها استفاده کن.

موفق باشید

Hadi_Fayyaz
دوشنبه 25 آبان 1388, 11:04 صبح
با سلام



با تشکر از کلیه اساتید
همه جوابها به نوعی درست و نظر همه عزیزان محترم است.ولی خدمت دوستمون که سوال بالا را مطرح کردند عرض کنم که اگه شما دلفی کار هستید نیازی نیست نگران باشید.چراکه متدهای دلفی همه بر اساس SQL هستند و همیشه بهترین انتخاب برای کار نیز هستند.مثلا متد INSERT را در نظر بگیرید،
اگر چند لایه عقب برگردید دقیقا خواهید دید که در پشت صحنه دقیقا دستور Insert into مربوط به Sql را میسازد.وسایر متدها نیز به همین شکل هستند.برای جستجو نیز Locate بهترین کارایی را دارد.به عرض برسونم که توی هر زبان یا توی هر ساختاری به هیچ عنوان استفاده از زیر برنامه سرعت را افزایش نمیده
این برای همه اشتباه جا افتاده و تا اسم زیر برنامه میاد سریع میگن سرعت افزایش پیدا میکنه.استفاده ار زیر برنامه فقط خانایی برنامه را بالا میبره و هیچ سرعتی به اجرای برنامه نمیده بلکه باعث تسریع در کد نویسی میشه.اگه اسمبلی کار کرده باشید میدونید که سرعت ماکرو از پروسه بالا تره چراکه پروسه(توی هر زبانی) در زمان آدرس مکان فعلی را در استک ذخیره کرده ، میره دستورات روال را اجرا میکنه سپس آدرس ادامه کار را ار استک بر میدادره و خطوط بعدی را اجرا میکنه.پس همین امر چند سیکل ماشین وقت نیاز داره.
توی بحث شما هم همینطوره یعنی شما اگه از متدهای تعبیه شده خود دلفی استفاده کنید و خودتون کدنویسی کنید بهتر از اینه که کار را به StoredProcedure بسپارید.
اینم که دوستان بالا فرمودن درسته ولی باید بگیم که استفاده از StoredProcedure فقط باعث میشه لایه
کاربردی از لایه دیتابیس مجزا شده و برنامه شما روتین تر بشه.پس توصیه میکنم از خود متدها استفاده کن.



موفق باشید

سلام دوست عزيز
از راهنمايي شما هم ممنون ولي منظور از StoredProcedure زير برنامه نيست و همونطور كه خود شما گفتيد StoredProcedure لايه برنامه رو از لايه Data جدا ميكنه بنا بر اين براي انجام يك فرايند روي DataBase لازم نيست Data به Application منتقل بشه و بعد از پردازش دوباره روي DataBase برگرده. حالا اينكه سرعت دستورات دلفي بيشتر هست يا نه قضاوتش با كسايي هست كه با ديتابيس هاي بزرگ اونم تحت شبكه كار ميكنند.
ممنون.

حسین شهریاری
دوشنبه 25 آبان 1388, 11:32 صبح
دوست عزیزم من خاک پای همه شما هستم!
ولی بنده حسین شهریاری حدود 10 سال هستش که با پایگاه داده سر وکار دارم و بهترین و بزرگترین کاری هم که انجام دادم اتوماسیون انبار و حسابرسی دانشگاه صنعتی اصفهان بوده.
حالا به نظر شما جزو اونایی که شما فرمودید هستیم یا نه؟

البته باز هم تاکید میکنم بنده شاگرد همه شما هستم....

Hadi_Fayyaz
دوشنبه 25 آبان 1388, 12:45 عصر
دوست عزیزم من خاک پای همه شما هستم!
ولی بنده حسین شهریاری حدود 10 سال هستش که با پایگاه داده سر وکار دارم و بهترین و بزرگترین کاری هم که انجام دادم اتوماسیون انبار و حسابرسی دانشگاه صنعتی اصفهان بوده.
حالا به نظر شما جزو اونایی که شما فرمودید هستیم یا نه؟

البته باز هم تاکید میکنم بنده شاگرد همه شما هستم....

سلام دوست و همشهري عزيز
بنده به هيچ عنوان قصد جسارت خدمت شما را نداشتم و فقط تجربه خودم رو نوشتم حالا اگه اين موضوع باعث رنجش شما شده من معذرت ميخوام و هيچ ادعايي هم در مورد كار با پايگاه داده ندارم چون فكر نميكنم اينجا براي مطرح كردن سوابق كاري جاي مناسبي باشه به هر حال معذرت ميخوام

Ebrahim Asadi
دوشنبه 25 آبان 1388, 17:32 عصر
سلام دوستان

من برنامه هايي كه مي نويسم بانك اطلاعاني Sql server 2000 است و دلفي كه از كانكشن Ado استفاده مي كنم اما بعد از مدتي سرعت خواندن از بانك خيلي كم ميشه (از Locate براي جستجو و از Append و post براي ايجاد و ذخيره كردن استفاده مي كنم) حالا دنبال يك روش بهتر مي گردم كه از SP هم استفاده كردم بهتر شد ولي حال براي اضافه كردن داده در بانك مشكل دارم يعني نمي دونم كه وقتي با Insert كار مي كنم اونا چطوري هدايت كنم براي اينه خودش مستقيم توي بانك اضافه ميشه و اگر كاربر بخواد انصراف بده چكار بايد كرد و مشكلات ديگر ....
اگر دوستان سريع كمك بكنند ممنون مي شم

سلام آقاي عليخاني. هيچ وقت از متد Append استفاده نكن. Append باعث مي شود كه يك ركورد به انتهاي ديتاست اضافه شود. براي اين كار بايد cursor به آخرين ركورد جدول منتقل شود كه در صورتي كه تعداد ركوردها زياد باشد باعث كاهش شديد performance برنامه مي شود. هميشه از متد Insert استفاده كن. (adoTable1.Insert) اين متد cursorمحل را تغيير نمي دهد و درست بعد از cursor يك ركورد ايجاد مي كند.

E_Alikhani
سه شنبه 26 آبان 1388, 08:28 صبح
سلام
من از تمام دوستاني كه زمان گذاشتند و يكسري سوالات وجوابها رد و بد شد تشكر مي كنم
اما ما بيشتر ميخواهيم مشكلات را حل كنيم نه ....
وهر كس نظر خودش ميگه (چه درست و اشتباه ) بقيه خودشان متوانند تصميم بگيرند و امتحان كنند
من قبلا با صحبت آقاي shahriar63 موافق بودم اما خودم با اينه ديدم كه دستورات دلفي خيلي ضعيف تر از دستورات SQL عمل ميكنه چون حجم ديتابيس خيلي بالا رفته داخل بانك هم تصوير ندارم
وهمچنين حجم داه هاي كه هر كلاينت در روز وارد ميكنند زياد است و توي اين حالت برنامه با دلفي ديگه جواب نميده

از آقاي Ebrahim Asadi تشكر ميكنم اين روش هم چك مي كنيم ببينيم درست است يا نه

راستي يكه سوال ديگه

دوستاني كه دلفي كار هستند و برنامه نوشتن در محيطهاي واقعي

شما در ورود اطلاعات از DBEdit1 استفاده ميكنيد يا از روش ديگه به بانك ارتباط مي گيريد من تا حالا هرچي برنامه نوشتم از DBEdit1 استفاده مي كردم ولي اگر بخوام از دستورات خود Sql مانند Insert استفاده كنم چي؟

با يكي از دوستان صحبت كردم مي گفت كه براي ورود داده ما از يك بانك Temp‌استفاده مي كنيم بعد از انتخاب كليد ذخيره از بانك Temp داده ها را به بانك اصلي اضافه ميكنيم اين كار درسته؟

خواهشان سريعتر جواب بدين

با تشكر عليخاني

حسین شهریاری
سه شنبه 26 آبان 1388, 11:00 صبح
سلام بر کلیه عزیزان

من خودم هم مثل شما از Dbedit استفاده میکنم.ولی باید عرض کنم که بستگی داره که چیکار میخاین بکنین و یا به عبارتی بهتر بستگی به شرایط برنتامتون داره.
اگه بخاین از دستورات Sql استفاده کنید به نظر من از Edit معمولی استفاده کنید.همونطور که میدونین در این گونه موارد بیشتر از Adoquery استفاده میشه و دستور Sql مربوطه توسط رشته های بهم پیوسته به خاصیت Text مربوط به Adoquery نسبت داده شده و سپس متد ExecSql فراخوانی میگردد.

در این صورت باید خیلی دقت کنید و تمام حالات را خودتون چک کنید.
به مثال توجه کنید:


Adoquery1.sql.clear;
Adoquery1.sql.text:='insert into Table1 values('+Edit.text;
Adoquery1.sql.text:=Adoquery1.sql.text+','+Quoteds tr(Edit2.text)+',';
Adoquery1.sql.text:=Adoquery1.sql.text+Edit3.text+ ')';
Adoquery1.ExecSql;
کد بالا دستور زير را شبيه سازي ميکند.فرض کنيد کاربر در اديتها مقادير زير را به ترتيب براي کد،نام و معدل وارد کرده باشد

insert into Table1 values(100,'Ali',15)