آموزش و سوالات مربوط به استفاده از دستورات Sql در دلفی

آموزشها تا اينجا چطور بود؟

  • برو بابا دلت خوشه

    رای: 0 0.0%
  • حيف فضايي كه به تاپيك اختصاص داده شده

    رای: 0 0.0%

  • مجموع رای دهندگان
    18

Sampro

Member
سلام دوستان
با عرض شرمندگی یه سوال دیگه هم داشتم.
من تو دیتابیسم تعدادی رکورد دارم و این رکورد ها بر دو نوعند یه تعدادیشون مقدار یک کالا رو افزایش می دن مثلا کالا به انبار اضافه شده
و
یک تعدادیشون از مقدار کالا کم می کنند مثلا کالا از انبار کم شده . حالا من می خوام مقدار نهایی کالا رو داشته باشم یعنی همه ی این جمع و تفریق ها انجما بشه و مقدار نهایی رو بگیرم .

می خواستم بدونم تو دستورات خود اس کیو ال راهی هست و یا اصلا می شه با خود دلفی هم این کار رو انجام داد .
 

farhad110

Member
سلام دوستان
با عرض شرمندگی یه سوال دیگه هم داشتم.
من تو دیتابیسم تعدادی رکورد دارم و این رکورد ها بر دو نوعند یه تعدادیشون مقدار یک کالا رو افزایش می دن مثلا کالا به انبار اضافه شده
و
یک تعدادیشون از مقدار کالا کم می کنند مثلا کالا از انبار کم شده . حالا من می خوام مقدار نهایی کالا رو داشته باشم یعنی همه ی این جمع و تفریق ها انجما بشه و مقدار نهایی رو بگیرم .

می خواستم بدونم تو دستورات خود اس کیو ال راهی هست و یا اصلا می شه با خود دلفی هم این کار رو انجام داد .

شما با دستورات sql ميتونيد هر عبارت جبري رو روي فيلدها پياده سازي كنيد. مثلا: field1*field2 (جاي پرسيدن اين سوال در تاپيك sql بود)
در خود دلفي هم با calculatedfield ميشه اين كار رو انجام داد، اما با سرعت كمتر و كدنويسي و دردسر بيشتر
 

farhad110

Member
SELECT INTO
این دستور اغلب برای BackUp گرفتن از جدول ها مورد استفاده قرار میگیره. دقت کنید که شما با کامپوننت ها هم میتونید backup بگیرید اما از تمام دیتابیس. پس زمانی که نیازی به backup تمام دیتابیس نیست بهتره که از select into استفاده کنید.
شکل کلی دستور:

کد:
SELECT column_name(s) INTO newtable [IN externaldatabase] 
FROM source

این دستور فوق العاده انعطاف پذیر هست، چون هم میتونید پشتیبان جدولها رو در همون دیتابیس ذخیره کنید و هم میتونید به یک دیتابیس دیگه انتقال بدید.
حالت اول:
کد:
SELECT * INTO table_backup FROM table
حالت دوم:
کد:
SELECT * INTO table_backup IN backup.mdb FROM table

حالتهای دیگر: انتخاب چند فیلد مشخص به جای استفاده از * ، به کار بردن عبارات شرطی مانند where و گرفتن پشتیبان از وضعیت جاری، پشتیبان گیری از چند جدول درون یک جدول.

موفق باشید
 

Sampro

Member
به نام خدا
سلام دوستان.
با اجازه ی صاحب تاپیک

برای سریعتر کردن و کم حجمتر کردن جداول و پایگاه داده ای که می سازید ترفند هایی وجود داره .
می تونید فیلد هایی که در یک محدوده ی خاص واقع می شن رو به نوع داه ای (DataType) صحیح (int) تبدیل کنید . مثلا اگه شما یه فیلد با نام "برگشت کتاب" دارید (یه برنامه ی کتابخانه) شما می تونید برای این فیلد سه حالت بزارید
مثلا:
اگه این فیلد مقدارش 1 بود یعنی کتاب برگشت داده شده
اگه 2 بود یعنی دیر برگشت داده شده و
اگه 3 بود یعنی با مشکل برگشت داده شده

خوب این جوری بهتر شد و پایگاه داده کمتر اشغال می شه . حتی برای مواردی که یه فیلد دو مقدار بشتر نداره (مثلا خانم یا آقا شب یا روز روشن یا خاموش) می تونید از نوع Bit استفاده کنین (Boolean) که در این صورت 1 یعنی True و 0 یعنی false .

حالا یه مشکلی اینجا پیش می یاد .
اون ور کاربر برنامه ی شما می خواد بیاد و کتابخانه رو ببینه که هر کی چی برده و چه طوری تحویل داده خوب شما هم به راحتی یه DBGrid رو فرم گذاشتی و مقادیر رو به کاربر نشون می دی . ولی کاربر برای ستون "برگشت کتاب" یک سری عدد رو می بینه که اصلا متوجه نمی شه چی به چیه .
خوب امیدوارم که متوجه شدین می خوام چی بگم :

این دستوری که می خوام بگم به جای برگشت دادن مقادیر مشخصی از یک کوئری اون هایی که شما می خواید رو برمی گردونه مثلا اگه 2 بود برمیگردونه "کتاب با تاخیر برگشت داده شد " . جالبه نه ؟
با یه مثال عرض می کنم:
کد:
SELECT Username,
        CASE Desposite_Status
           WHEN 1 THEN 'KETAB TAHVIL DADE SHOD'
           WHEN 2 THEN 'KETAB BA TAKHIR TAHVIL DADE SHOD'
           WHEN 3 THEN 'KETAB BA MOSHKEL TAHVIL DADE SHOD'
       END
,Date
FROM Library
این کوئری کامل نیست ولی منظورمو می رسونه Desposite_Status همون فیلد مورد نظرمون هست که سه حالت داره .
به خاطر مشکلات فارسی اون قسمت رو به صورت فینگلیش نوشتم . برای هر حالت یه WHEN THEN دیگه ایجاد می کنیم.
در آخر هم END یادتون نره.

در ضمن این دستور هیچ تغییری روی مقادیر پایگاه داه ایجاد نمی کنه .
ممنون و موفق باشید
 

fatemeh_rose

New Member
سلام. خسته نباشيد. يك سوال: جدولهاي بانك من در sql server 2005 داراي فيلدهايي است كه تاريخي است! مثل تاريخ تولد و ... اما sql تنها تاريخ ميلادي قبول ميكنه! چي كار بايد بكنم؟
 

farhad110

Member
سلام. خسته نباشيد. يك سوال: جدولهاي بانك من در sql server 2005 داراي فيلدهايي است كه تاريخي است! مثل تاريخ تولد و ... اما sql تنها تاريخ ميلادي قبول ميكنه! چي كار بايد بكنم؟

نوع فيلد رو string بگذاريد و از كامپوننتهاي تبديل تاريخ استفاده كنيد.
 

farhad110

Member
استفاده از كاراكتر هاي خاص براي دستورات شرطي:
قبلا به همراه LIKE كاراكتر % رو به كار برده بودم. اين كاراكتر تمام فيلدهايي رو كه با شرط دستور مطابقت داشتند و داراي طول مساوي و يا بيشتر از رشته بودند رو بر مي گردوند.
امروز ميخوام در مورد كاراكتر _ و [] توضيح بدم.
فرض كنيد به دنبال فيلد هايي هستيم كه سه حرفي هستند و دو حرف اول اونها AB هست. اگر شرط رو به صورت
کد:
[LEFT] LIKE AB_[/LEFT]
بنويسيم تمام فيلدهاي abc, aba, abr, abz, … در نتيجه حاصل هست.
حالا اگر از اين كه فيلد با چه كاراكتري شروع شده اطلاعي نداشته باشيم و مجموعه اي از كاراكترهاي فيلدها رو بخوايم چي؟ از [] استفاده ميكنيم
مثال:
کد:
[LEFT]LIKE [a-g]%[/LEFT]
تمام فيلدها رو كه با حروف a,b,c,d,e,f,g شروع ميشند رو در نتيجه حاصل بر مي گردونه.
پيروز باشيد
 

farhad110

Member
ساخت اشیا در پایگاه داده و تنظیم ویژگی ها و خصوصیات پایگاه داده (دستورات DDL)
به عنوان مثال اضافه كردن فيلد در زمان اجرا:
براي اين كار بايد از ALTER TABLE استفاده كنيم.
شكل كلي دستور:
کد:
ALTER TABLE table_name 
ADD column_name datatype

table_name: نام جدول
column_name: نام فيلد
datatype: نوع فيلد

فرض كنيد ميخوايم فيلد MyField رو با طول 50 كاراكتر به جدول inventory اضافه كنيم:

کد:
[LEFT]alter table inventory add MyField varchar(50)[/LEFT]

موفق باشيد
 

راحله-م

New Member
:sad: سلام خواهش میکنم یکی به من بگه وقتی بخوام تو delphi یه select رو تو یه listbox نشون بدم چیکار کم
 

farhad110

Member
سلام خواهش میکنم
سلام. خوش آمديد
من هم خواهش ميكنم :)
یکی به من بگه وقتی بخوام تو delphi یه select رو تو یه listbox نشون بدم چیکار کم
کد:
listbox.items.add('string value')
اگر در دستورات sql مشكل داشتيد اينجا بپرسيد، وگرنه تاپيك جديد ايجاد كنيد
موفق باشيد
 

راحله-م

New Member
سلام . میشه لطف کنید یه سری دیگه آموزش مربوط به استفاده از دستورات sql در دلفی بذارید .
من بیشتر در رابطه با اینکه چطور اطلاعات در یافت شده از دلفی رو داخل مثلا edit یا stringgrid نشون بدم دارم .
می خوام یه اسم رو که داخل edit نوشته میشه کدش رو جستجو کنه و داخل یه فرم دیگم از اطلاعات اون کد استفاده کنم . مرسی !!!
 

farhad110

Member
سلام . میشه لطف کنید یه سری دیگه آموزش مربوط به استفاده از دستورات sql در دلفی بذارید .
اگر وقت شد چشم
من بیشتر در رابطه با اینکه چطور اطلاعات در یافت شده از دلفی رو داخل مثلا edit یا stringgrid نشون بدم دارم .
می خوام یه اسم رو که داخل edit نوشته میشه کدش رو جستجو کنه و داخل یه فرم دیگم از اطلاعات اون کد استفاده کنم . مرسی !!!
قبلا تذكر دادم: "اگر در دستورات sql مشكل داشتيد اينجا بپرسيد، وگرنه تاپيك جديد ايجاد كنيد"
لطفا دقت بيشتري كنيد كه كجا سوال بپرسيد
چرا یکی جواب منو نمیده بابا تا بیستم باید پروژمو تحویل بدم !!!!!!!!!!!!!!!!!!
به تذكر بنده مراجعه كنيد
موفق باشيد
 

Sampro

Member
سلام به تمام دوستان گلم خصوصا فرهاد جان
اینم یه اموزش کوچیک تقدیم به تمام بروبچز

Paging در SQl Server 2005
توسعه گارن و مدیران پایگاه داده ها تمایل دارند تا نتایج پایگاه داده هایشان را به صورت صفحه بندی ارائه دهند تا کارایی پابگاه داده بالانس شود . راه آسان تر یعنی دریافت یک باره ی کل داده ی که می خواهیم راه بهینه ای نیست و راه حل آن صفحه بندی نتایج البته با کد های پیچیده تر می باشد .
در MySQL این کار به راحتی با استفاده از دستور Limit انجام می شود و شما جلو دستور شماره ی رکورد و بعد از کاما تعداد رکوردی که می خواین دریافت کنین رو می نویسین . به همین راحتی
ولی در SQL Server فرق می کنه .

در SQL Server دستوری به نام ROW_NUMBER وجود داره که اگه به همراه SELECT استفاده بشه خروجی SELECT رو شماره گذاری می کنه

نتیجه ی دستور روبرو جدول زیر هستش​

کد:
SELECT ROW_NUMBER() OVER(ORDER BY person), person, income
FROM Salaries

برای استفاده از دستور ROW_Number حتما باید داده ها مرتب باشن و این کار رو دستور OVER و همچنین ORDER BY داخل پرانتش برامون انجام می ده .​

کد:
[RIGHT][B](No column name)........person................income...............[/B]
1................Amelia..............36000.00..............
2..................Anna..............49000.00..............
3.............Constance..............51000.00..............
4..............Danielle..............68000.00..............
5.............Elizabeth..............23000.00..............
6...............Emerson..............84000.00..............
7...................Eva..............51000.00..............
8...................Joe..............28000.00..............
9..................John..............67000.00..............
10................Jorge..............48000.00..............
11................Karen..............73000.00..............[/RIGHT]


همونطور که می بینید یه ستون اضافه شده که قبلا تو Table وجود نداشت .

برای رسیدن به مقصودمون (صفحه بندی) با استفاده از دستور ROW_NUMBER باید این SELECT رو داخل یه SELECT دیگه به کار بریم یعنی Nested Select .
اینم دستورش :​

کد:
SELECT *
FROM   (SELECT ROW_NUMBER() OVER(ORDER BY person) AS
       rownum, person, income FROM Salaries) AS Salaries1
WHERE  rownum >= 5 AND rownum <= 9

خوب برا توضیحش بگم که ما از اون ستونی که قبلا ایجاد شده بود و گفتم نامی بهش داده نشده استفاده کردیم . در حقیقت با با بخش WHERE دستور SELECT خارجی ما از اون ستونی که در داخل SELECT داخلی ایجاد شده استفاده کردیم و چون اون ستون از یک تا آخر مرتب هست و عدد هم هست , پس ما گفتیم که از یک شماره ی خاص تا یک شماره ی خاص دیگه داده ها رو برامون برگردون .
اینم نتیجش :​
کد:
[RIGHT][B](No column name)........person................income...............[/B]
5............Elizabeth..............23000.00..............
6..............Emerson..............84000.00..............
7..................Eva..............51000.00..............
8..................Joe..............28000.00..............
9.................John..............67000.00..............
[/RIGHT]

البته برای اینکه در خورجی اون ستونی که اعداد داخلش ذخیره شده نمایش داده نشه خوب می شه تو SELECT خارجی به جای علامت * ای که گذاشتیم نام ستون هایی که می خوایم رو بنویسیم .
به همین راحتی

حالا برای موارد استفادش باید بگم که دوستان اگه ASP کار کرده باشند یه سری کنترل با نام GrideView (اسمش دقیقا یادم نیست) که شما با استفاده از یه خاصیتش می تونستی داده هایی که می خواد نشون بده رو صفحه بندی کنی . پایینشم یه چند تا کنترل برای رفتن به صفحه ی بعد و قبل نشون می داد . همین تو انجمن , همه ی پست ها و تاپیک ها به یک باره نشون داده نمی شن و باید شما صفحات رو یکی یکی برای پیدا کردن یه مورد خاص برگدین (اگه سرچ بلد نباشین:D)

با تشکر​
 

winer3549

New Member
سلام دوستان

واقعا بابت این تاپیک های مفید دستتون درد نکنه

من یه سئوال داشتم که واسه من خیلی مهم و حیاتیه ، اگر یه برنامه بنویسیم که دیتابیسش sql باشه و بخوایم اونو تویه یه کامپیوتر دیگه بریزیم و اجرا کنیم :

1 - آیا باید روی اون کامپیوتر هم اس کیو ال رو نصب کنیم ؟

2 - راهی هست که بشه مثل اکسس فقط فایل دیتا بیس رو همراه پروژه بفرستیم ؟

ممنون میشم یه راهنمایی یا آموزش کلی رو بزارید .
 

farhad110

Member
سلام دوستان

واقعا بابت این تاپیک های مفید دستتون درد نکنه

من یه سئوال داشتم که واسه من خیلی مهم و حیاتیه ، اگر یه برنامه بنویسیم که دیتابیسش sql باشه و بخوایم اونو تویه یه کامپیوتر دیگه بریزیم و اجرا کنیم :

1 - آیا باید روی اون کامپیوتر هم اس کیو ال رو نصب کنیم ؟

2 - راهی هست که بشه مثل اکسس فقط فایل دیتا بیس رو همراه پروژه بفرستیم ؟

ممنون میشم یه راهنمایی یا آموزش کلی رو بزارید .

1. اگر از SDac استفاده كنيد، خير.
2. چرا كه نه.
ممنون ميشم كه در انتخاب محل سوال پرسيدن بيشتر دقت كنيد
اين تاپيك فقط مختص دستورات sql هست. سوالات غير مرتبط رو در تاپيك هاي ديگر بپرسيد و يا تاپيك جديد ايجاد كنيد
پيروز باشيد
 

Sampro

Member
سلام دوستان
امیدوارم خوب باشید .

مواقعی پیش می یاد که بخواین کل یک جدول تو یه دیتابیس رو خالی کنید
در این گونه مواقع تنها راهی که به ذهن می رسه استفاده از دستور DELETE هستش .

ولی این دستور در این گونه شرایط مشکلاتی داره
این دستور به خاطر اینکه هر بار که کوردی رو حذف می کنه تغییر اون رو هم در بخش Log می نویسه کارایی کمی داره .
یعنی برای هر رکورد حذف شده Log اون رو نیز در فایل ldf ذخیره می کنه .

راه حل بهتر استفاده از دستور TRUNCATE TABLE هستش.
این دستور نسبت به دستور DELETE کارایی بیشتری داشته و راحت تر هم هست. و log کمتری رو هم به نسبت DELETE ایجاد می کنه فقط کافیه نام جدول (به همراه نام دیتابیس) رو به عنوان آرگومان به هش بدید :

مثال : دستور زیر جدول send_get از پایگاه داده جاری رو خالی می کنه
کد:
TRUNCATE TABLE send_get

تبصره:
باید گفته بشه که این دستور فقط اطلاعات موجود در جدول تعیین شده رو حذف می کنه و کاری به تعریف جدول ، ایندکس ها ، ویو ها ، نقش ها و ... نداره
 

farhad110

Member
sampro عزيز تشكر ميكنم از مطلب مفيدي كه ارائه داديد. فقط چند توضيح تكميلي رو اضافه ميكنم.

از اونجا كه truncate در transaction log ثبت نميشه سرعت اجراي اون چندين برابر delete هست اما به چند دليل هميشه مفيد نيست:
اگر شما truncate رو در يك transaction به كار ببريد امكان rollback رو از خودتون ميگيريد
اگر شما از trigger ها براي delete استفاده كرده باشيد، اين trigger ها در زمان استفاده از truncate عمل نخواهند كرد
truncate در تمام ديتابيس ها پشتيباني نميشه و باعث ايجاد خطا ميشه

اما مزاياي اون رو هم كه sampro عزيز گفتند علاوه بر اينكه اگر از فيلد identity استفاده كرده باشيد بعد از استفاده از truncate مقدار اون reset ميشه.

به هر حال براي زماني كه بايد تمام ركوردها رو حذف كنيد و مواردي كه گفتم مشكلي براتون ايجاد نميكنه ميتونيد از truncate استفاده كنيد
موفق باشيد
 

جدیدترین ارسال ها

بالا