Data Base
Data Base
با توجه به اينکه اکثر دانشجويان قادر به شرکت در آزمايشگاه در اين زمان نيستند،
موافقت گرديد 6دستور کار اول را انجام دهند تا پس از آخرين امتحان پايان ترم
جلسات آزمايشگاه برگزار گردد.
با تشکر
تفضلي
بسمه تعالي
دستور کار آزمايشگاه پايگاه داده ها
آزمايش 1
آشنايي با محيط ، QUERY ANALYZERنحوه ايجاد پايگاه داده وجداول
پيش آگاهي
مقدمه :آشنايي با RDBMSها
از زماني که در سال 1970مقاله آقاي کادتحت عنوان "مدل رابطه اي داده ها براي بانک هععاي اطلعععاتي
اشتراکي بزرگ" منتشر شد ،زمان زيادي نمي گذرد .بعد از مطرح شدن اين ايده پروژه تحقيقاتي تحت عنععوان
SYSTEM/Rدر IBMشکل گرفت که حاصل آن ايجاد اولين DBMSوزبان SQLبود .از آن زمان شرکت
هاي مختلفي به توليد DBMSهاپرداختندتا اين که در سال SQL-SERVER،1988معرفي شد .علوه بر اين
در سال SQL ،1986توسط ANSIاستاندارد شد .نسخه اي از اين زبان را ،تحت عنوان TRANSACT-
SQLاستفاده مي نمايد .همان گونه که مي دانيد زبان SQLغيررويه اي است يعني در آن تنها درخواست
کاربرارائه مي گرددوالگوريتم لزم براي اجراي آن توسط بخش هايي از )DBMSبهينه ساز( توليد مي گردد .
هرسيستم مديريت پايگاه داده اي بر مبناي مدل رابطه اي ،يک RDBMSناميده مي شود .اين سيستم هاازدو
بخش عمده به شرح زيرساخته شده اند:
-1هسته :که کارهاي مديريتي را انجام مي دهد.
-2فرهنگ داده ها) : ( DataDictionaryکه شامل اطلعاتي در مورد عناصرواشياء مختلف پايگاه داده
مي باشد ازقبيل sysobjectsکه مشخصات اشياءمختلف تعريف شده درآن نگهعععداري اي تعريف شده
مي گردد يا sysindexesو syscolumnsکه مشخصات شاخص هاومشخصات ستون هاي تعريف
شده در آن ها ذکر مي گردد.
در SQL-SERVER به ثبت رساندن وحذف وتغيير يک پايگاه داده جديد
اصول اطلعات موجود در هر پايگاه داده در فايل ها ي آن پايگاه داده نگهداري مي شوند .اين امکان وجود
دارد که فايل هاي مختلف ،گروه هاي مختلفي را تشکيل دهند که هر فايععل بععه يکععي از آن هععا اختصععاص داشععته
باشد در اين صورت مي توان اشياء پايگاه داده را در يک فايل خاص يا فايل هاي يک گروه ذخيره کرد .علوه
بر اين مثل دراعمالي مانند پشتيباني ) (backupمي توان به جاي کل پايگاه داده اي ،گروه هاي فايل اصلي
را پشتيباني کرديا بااعمال برنامه زماني مورد نظر ،هر يک از گروه هارامستقلپشتيباني کرد .براي پايگاه داده
هاي تعريف شده در SQL-SERVERسه نوع فايل قابل تصور است :
-1فايل هاي )Primaryباپسوند : (mdf.که حاوي اطلعات راه اندازي پايگاه هستند وبه بقيه فايل هاي
اشاره دارند . پايگاه داده ها
-2فايل هاي )Secondaryباپسوند : (ndf.بقيه فايل هاي داده اي به جز فايل هاي داده اي اصلي در اين
مي گيرند . گروه قرار
-3فايل هاي )Logباپسوند : (ldf.براي ثبت تراکنش هاي موجود در پايگاه به کار مي روندو عضو هيچ
نيستند .براي بسياري از پايگاه هاي داده اي معرفي گروه 1و 3کععافي اسععت وممکععن اسععت گروه فايلي
نوع دوم داشته باشد يا هيچ فايلي از اين نوع نداشته باشد .يک فايععل نمععي پايگاه داده اي چندين فايل از
هاي سيسععتم در گععروه فايععل Primaryقرار مي گيرند. تواند عضو بيش ازيک گروه فايلي باشد وفايل
مي توانيد به مراجع SQL- ) براي اطلعات بيشتر در مورد نحوه استفاده از اين امکان در عمل
SERVERمراجعه کنيد (.
INNER JOIN
CRS AS C
#ON C.S#=S.S
شاخص ها در SQL-Server
خاصي هستند که اين امکان را فراهم مي آورند که بتوان بععر اسععا س شاخص ها در SQL-Serverاشياء
مقادير يک يا چند ستون به سرعت به سطر هععاي يععک جععدول دسترسععي پيععدا کععرد ،SQL-Server .دو نععوع
شععاخص Clusteredو Nonclusteredرادر اختيار کاربر براي تعريف قرار مي دهد SQL- .
B-TREEاستفاده مي کند که در آن برگ هععا حععاوي Serverبراي پياده سازي شاخص ها از ساختار
داده هاي واقعي هستند .
-1شاخص :Clusteredدراين نوع شاخص ،داده ها واقعا از نظر فيزيکي مرتب مي شوند .در اين نوع
داده هاي واقعي هستند .هميشه با معرفي يک ستون به عنوان کليد اصلي به صورت انديس برگ ها
ساخته مي شود . Clustered خودکار روي آن يک شاخص
-2شاخص :Nonclusteredدر اين نوع شاخص برگ ها بر مبناي ستون هايي که به عنوان شاخص
مرتب مي شوند ولي تفاوت آن با نوع قبلي ايععن اسععت کععه در صععورتي کععه قبل روي تعريف شده اند
نشده باشد برگ هاي انديس Nonclusteredحاوي آدرس ذخيره جدول شاخص Clusteredايجاد
اسععت ودرغيرايععن صععورت حععاوي مقععدار کليععد شععاخص تاپل)ونه خود تاپل ( متناسب با کليد شععاخص شععده
دارمتناسب با آن تاپل هستند .
با توجه به توضيحات بال رعايت نکات زير توصيه مي شود :
براي ستون داراي شععاخص Clusteredاز مقععاديرحجم داراسععتفاده نکنيععد .زيععرا علوه بععر •
اينکه زمان جستجو در ستون با شاخص Clusteredافزايش مي يابععد ،حجععم ذخيععره سععازي شععاخص
هاي Nonclusteredهم افزايش مي يابد) .چرا ؟ (
نکته :سعي کنيد ابتدا شاخص Clusteredرا ايجا دکنيد و بعد شاخص هاي Nonclusteredراتعريف
کنيد ) .چرا ؟(
تعريف شاخص:
دستور کار:
بخش اول-آشنايي با Query Analyzerونحوه اجراي دستورات T-SQL
-1بعد از loginکردن با نام عبوري که به شما داده مي شود و روي سروري که به شما معرفععي مععي شععود
شويد . وارد محيط Query Analyzer
-2روي سروري که به آن Loginکرده ايد کليک کنيد وپايگاه داده هاي موجود روي اين سرور را مشععاهده
پايگاه داده هايي روي اين سرور به ثبت رسيده است؟ کنيد .چه
-3به کمک دستور execرويه هاي ذخيره شده ) sp_helpبراي پايگاه داده ( pubsو sp_help
در پنجره resultsخروجي هايي هر کدام را مشاهده مي کنيد .در مورد عملکرد dbرا اجرا کنيد .
آن ها توضيح دهيد؟
) اين دوازرويه هاي ذخيره شده ) (stored procedureسيستمي هستند که بعدا با نحوه ايجاد
آشنا مي شويد (. ومديريت اين رويه ها
-4الف -اسکريپت زير را به يکباره اجرا کنيد ويک فايل را به عنوان محل ذخيره خروجي ها تعريف کنيععد .
مجموعه اي از دستورات T-SQLاست که همگي به يکباره به موتور پايگاه ارسال مععي ) دسته
اجرا مي شوند .اسکريپت نيزمجموعه اي از يک يا چند دسته است که بععه شوند و کامپايل وبهينه سازي و
ها بععراي مثل بخشععي از کععار بارگععذاري داده هععا )Data صورت گروهي ذخيره مي شوند .از اسکريپت
اگر نياز به انجام چندکارمستقل باشد، ( overloadingيا نگهداري پايگاه داده استفا ده مي شود .مثل
بيععن آنهععا اسععتفاده مععي اسکريپتي از چنددسته مي نويسيم و براي مشخص کردن دسته ها از هععم از Goدر
قبلععي کنيم .بدين ترتيب خطاهاي روي هر دسته اعم از کامپايل ياخطاهاي زمان اجرا ،اجراي دسته هاي
وبعدي را مختل نمي کند ( .
Use pubs
Select * from authors
Go
Use Northwind
Select EmployeeID from Employees
'where City='London
ب -در دسته دوم EmployeeIDرا به Employeeتغييردهيدواين اسکريپت رااجرا کنيد .آياتغيير يک
کل اسکريپت تًاثير گذار است ؟ توضيح دهيد. دسته دراجراي
بخش دوم -ايجاد يک پايگاه داده جديد
-1اسکريپتي براي ايجاد پايگاه داده اي بانا م Testبا مشخصات زير اجرا کنيد :
يک فايععل اصععلي بععا مشخصععات انععدازه MB 20باحداکثررشد مساوي 100MBو بععا رشععد •
2MBدرهربارودر گروه فايل اصلي
يک فايل ثانويه با مشخصات اندازه 5MBحداکثر اندازه 10MBوبا رشععد 1MBو در گععروه •
فايلي با نام testواين گروه فايلي را گروه فايلي پيش فرض قرار دهيد .
يک فايل ثبت تراکنش) ( log fileبا مشخصات اندازه 10MBحداکثر اندازه 30MBوبععا •
رشد %20
-2رويه هاي ذخيره شده sp_helpfilegroupو sp_helpfileرا روي پايگاه داده اي که ايجاد کرده ايد
اجرا کنيد .چه خروجي هايي مشاهده مي کنيد ؟
-3اسکريپتي را اجرا کنيد که گروه فايلي testوفايل هاي آن را حذف کند ) .اصول براي حذف هر گروه
فايلي ديگري رابه عنوان گروه فايل پيش فرض تعريف ميکنيم در صورتي که گععروه فععايلي فايلي ابتدا گروه
باشد سپس تمام فايل هاي آن گروه فايلي وبعد خودآن را حذف مي کنيم (. حذف شوند پيش فرض
-4پايگاه داده فوق را به registrationتغيير نام دهيد ).از رويه sp_renamedbاستفاده کنيد (.
-5کليه جداول پايگاه داده registrationراکعععه درزيرمشعععخص شعععده ،بعععاتوجه بعععه محعععدوديت هعععاي
اسکريپت هاي نوشته شده را ذخيره کنيد (. موردنظرتعريف کنيد ).کليه
جداول موردنيازدرآزمايشگاه :
) STDTRM
فايل ترم دانشجو (
قيود کليدخارجي کليد اصلي نوع داده امکان نام فارسي نام لتين
و ارجاع اي null
رقم اول بين 3تا ، 9رقم دوم وسوم شماره ترم TrmNo
بين 0تا 9ورقم چهارم بين 1تا 3 × )Char(4
) ( PREREQ
فايل پيش نياز
قيود کليد خارجي کليد اصلي نوع داده اي امکان نام فارسي نام لتين
و ارجاع null
)CRS(c# × )Char(7 شماره درس C#
)CRS(c# × شماره درس Cp#
)Char(7 پيش نياز
× شماره چندمين SeqN
)Check(1=<seqno <=5 Tiny int پيش نيازيا هم o
نياز
) ( COREQ
فايل هم نياز
قيود کليد خارجي کليد اصلي نوع داده اي امکان نام فارسي نام لتين
و ارجاع null
)CRS(c# × )Char(7 شماره درس C#
)CRS(c# × شماره درس Cc#
)Char(7 هم نياز
)Check(1=<seqno<=5 × شماره چندمين SeqNo
Tiny int پيش نيازيا هم
نياز
) CODEFILE
( کد فايل
قيود کليد خارجي کليد اصلي نوع داده اي امکان نام فارسي نام لتين
و ارجاع null
× )varchar(8 رشته تحصيلي Field
× )Varchar(4 نوع Type
× شرح Desc
Varchar(3
)0
سوال :
-1آيا روي هر جدول محدوديتي روي تعداد ايندکس هاي قابل تعريف وجود دارد؟
-2آيا ساخت فهرست به طور نامحدود مشکلي براي سيستم )ازنظر زمان عمليات ( روي هريک ازعمليات
ايجاد مي کند؟ select,insert,delete,update
Creates a new database and the files used to store the database
Syntax
[ PRIMARY ]
( [ NAME = logical_file_name , ]
FILENAME = 'os_file_name'
[ , SIZE = size ]
[ , MAXSIZE = { max_size | UNLIMITED } ]
[ , FILEGROWTH = growth_increment ] ) [ ,...n ]
Arguments
database_name
Is the name of the new database. Database names must be unique within a server and
conform to the rules for identifiers. database_name can be a maximum of 128 characters,
unless no logical name is specified for the log. If no logical log file name is specified,
Microsoft® SQL Server™ generates a logical name by appending a suffix to
database_name. This limits database_name to 123 characters so that the generated logical
log file name is less than 128 characters.
ON
Specifies that the disk files used to store the data portions of the database (data files) are
defined explicitly. The keyword is followed by a comma-separated list of <filespec>
items defining the data files for the primary filegroup. The list of files in the primary
filegroup can be followed by an optional, comma-separated list of <filegroup> items
defining user filegroups and their files.
Is a placeholder indicating that multiple files can be specified for the new database.
LOG ON
Specifies that the disk files used to store the database log (log files) are explicitly defined.
The keyword is followed by a comma-separated list of <filespec> items defining the log
files. If LOG ON is not specified, a single log file is automatically created with a system-
generated name and a size that is 25 percent of the sum of the sizes of all the data files for
the database.
All databases have at least a primary filegroup. All system tables are allocated in the
primary filegroup. A database can also have user-defined filegroups. If an object is
created with an ON filegroup clause specifying a user-defined filegroup, then all the
pages for the object are allocated from the specified filegroup. The pages for all user
objects created without an ON filegroup clause, or with an ON DEFAULT clause, are
allocated from the default filegroup. When a database is first created the primary
filegroup is the default filegroup. You can specify a user-defined filegroup as the default
filegroup using ALTER DATABASE:
Each database has an owner who has the ability to perform special activities in the
database. The owner is the user who creates the database. The database owner can be
changed with sp_changedbowner.
To display a report on a database, or on all the databases for an instance of SQL Server,
execute sp_helpdb. For a report on the space used in a database, use sp_spaceused. For a
report on the filegroups in a database use sp_helpfilegroup, and use sp_helpfile for a
report of the files in a database.
Permissions
Examples
This example creates a database called Archive with three 100-MB data files and two
100-MB transaction log files. The primary file is the first file in the list and is explicitly
specified with the PRIMARY keyword. The transaction log files are specified following
the LOG ON keywords. Note the extensions used for the files in the FILENAME
option: .mdf is used for primary data files, .ndf is used for the secondary data files, and
.ldf is used for transaction log files.
USE master
GO
CREATE DATABASE Archive
ON
PRIMARY ( NAME = Arch1,
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archdat1.mdf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20),
( NAME = Arch2,
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archdat2.ndf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20),
( NAME = Arch3,
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archdat3.ndf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20)
LOG ON
( NAME = Archlog1,
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archlog1.ldf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20),
( NAME = Archlog2,
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archlog2.ldf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20)
GO
This example creates a database named products2. The file prods2_dat becomes the
primary file with a size equal to the size of the primary file in the model database. The
transaction log file is created automatically and is 25 percent of the size of the primary
file, or 512 KB, whichever is larger. Because MAXSIZE is not specified, the files can
grow to fill all available disk space.
USE master
GO
CREATE DATABASE Products2
ON
( NAME = prods2_dat,
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\prods2.mdf' )
GO
• The primary filegroup with the files Spri1_dat and Spri2_dat. The
FILEGROWTH increments for these files is specified as 15 percent.
Adds or removes files and filegroups from a database. Can also be used to modify the
attributes of files and filegroups, such as changing the name or size of a file. ALTER
DATABASE provides the ability to change the database name, filegroup names, and the
logical names of data files and log files.
Syntax
database
ADD FILE
TO FILEGROUP
filegroup_name
Is the name of the filegroup to add the specified file to.
REMOVE FILE
Removes the file description from the database system tables and deletes the physical file.
The file cannot be removed unless empty.
ADD FILEGROUP
filegroup_name
REMOVE FILEGROUP
Removes the filegroup from the database and deletes all the files in the filegroup. The
filegroup cannot be removed unless empty.
MODIFY FILE
Specifies the given file that should be modified, including the FILENAME, SIZE,
FILEGROWTH, and MAXSIZE options. Only one of these properties can be changed at
a time. NAME must be specified in the <filespec> to identify the file to be modified. If
SIZE is specified, the new size must be larger than the current file size. FILENAME can
be specified only for files in the tempdb database, and the new name does not take effect
until Microsoft SQL Server is restarted.
To modify the logical name of a data file or log file, specify in NAME the logical file
name to be renamed, and specify for NEWNAME the new logical name for the file.
Thus:
READONLY
Specifies the filegroup is read-only. Updates to objects in it are not allowed. The
primary filegroup cannot be made read-only. Only users with exclusive database
access can mark a filegroup read-only.
READWRITE
Reverses the READONLY property. Updates are enabled for the objects in the
filegroup. Only users who have exclusive access to the database can mark a
filegroup read/write.
DEFAULT
Specifies the filegroup as the default database filegroup. Only one database
filegroup can be default. CREATE DATABASE sets the primary filegroup as the
initial default filegroup. New tables and indexes are created in the default
filegroup—if no filegroup is specified in the CREATE TABLE, ALTER TABLE,
or CREATE INDEX statements
WITH <termination>
Specifies when to roll back incomplete transactions when the database is transitioned
from one state to another. Only one termination clause can be specified and it follows the
SET clauses.
<state_option>
Controls user access to the database, whether the database is online, and whether writes
are allowed.
SINGLE_USER | RESTRICTED_USER | MULTI_USER
Controls which users may access the database. When SINGLE_USER is specified,
only one user at a time can access the database. When RESTRICTED_USER is
specified, only members of the db_owner, dbcreator, or sysadmin roles can use
the database. MULTI_USER returns the database to its normal operating state.
OFFLINE | ONLINE
Controls whether the database is offline or online.
READ_ONLY | READ_WRITE
Specifies whether the database is in read-only mode. In read-only mode, users can
read data from the database, not modify it. The database cannot be in use when
READ_ONLY is specified. The master database is the exception, and only the
system administrator can use master while READ_ONLY is set. READ_WRITE
returns the database to read/write operations.
<cursor_option>
CURSOR_CLOSE_ON_COMMIT ON | OFF
If ON is specified, any cursors open when a transaction is committed or rolled
back are closed. If OFF is specified, such cursors remain open when a transaction
is committed; rolling back a transaction closes any cursors except those defined as
INSENSITIVE or STATIC.
CURSOR_DEFAULTLOCAL | GLOBAL
Controls whether cursor scope defaults to LOCAL or GLOBAL.
<auto_option>
AUTO_CLOSE ON | OFF
If ON is specified, the database is shut down cleanly and its resources are freed
after the last user exits. If OFF is specified, the database remains open after the
last user exits.
AUTO_CREATE_STATISTICS ON | OFF
If ON is specified, any missing statistics needed by a query for optimization are
automatically built during optimization.
AUTO_SHRINK ON | OFF
If ON is specified, the database files are candidates for automatic periodic
shrinking.
AUTO_UPDATE_STATISTICS ON | OFF
If ON is specified, any out-of-date statistics required by a query for optimization
are automatically built during optimization. If OFF is specified, statistics must be
updated manually.
<sql_option>
Controls the ANSI compliance options.
ANSI_NULL_DEFAULT ON | OFF
If ON is specified, CREATE TABLE follows SQL-92 rules to determine whether
a column allows null values.
ANSI_NULLS ON | OFF
If ON is specified, all comparisons to a null value evaluate to UNKNOWN. If
OFF is specified, comparisons of non-UNICODE values to a null value evaluate
to TRUE if both values are NULL.
ANSI_PADDING ON | OFF
If ON is specified, strings are padded to the same length before comparison or
insert. If OFF is specified, strings are not padded.
ANSI_WARNINGS ON | OFF
If ON is specified, errors or warnings are issued when conditions such as divide-
by-zero occur.
ARITHABORT ON | OFF
If ON is specified, a query is terminated when an overflow or divide-by-zero error
occurs during query execution.
CONCAT_NULL_YIELDS_NULL ON | OFF
If ON is specified, the result of a concatenation operation is NULL when either
operand is NULL. If OFF is specified, the null value is treated as an empty
character string. The default is OFF.
QUOTED_IDENTIFIER ON | OFF
If ON is specified, double quotation marks can be used to enclose delimited
identifiers.
NUMERIC_ROUNDABORT ON | OFF
If ON is specified, an error is generated when loss of precision occurs in an
expression.
RECURSIVE_TRIGGERS ON | OFF
If ON is specified, recursive firing of triggers is allowed.
RECURSIVE_TRIGGERS OFF, the default, prevents direct recursion only. To
disable indirect recursion as well, set the nested triggers server option to 0 using
sp_configure.
<recovery_options>
If SIMPLE is specified, a simple backup strategy that uses minimal log space is
provided. Log space can be automatically reused when no longer needed for
server failure recovery.
Important The simple recovery model is easier to manage than the other two
models but at the expense of higher data loss exposure if a data file is
damaged. All changes since the most recent database or differential database
backup are lost and must be re-entered manually.
The default recovery model is determined by the recovery model of the model
database. To change the default for new databases, use ALTER DATABASE to
set the recovery option of the model database.
TORN_PAGE_DETECTION ON | OFF
If ON is specified, incomplete pages can be detected. The default is ON.
Remarks
If the following objects, which are dependent on the database collation, exist in
the database, the ALTER DATABASE database COLLATE statement will fail. SQL
Server will return an error message for each object blocking the ALTER action:
• Computed columns.
• CHECK constraints.
Duplicate names resulting from the new collation will cause the alter action to fail
and SQL Server will return an error message specifying the namespace where the
duplicate was found.
To specify a fraction of a megabyte in the size parameters, convert the value to kilobytes
by multiplying the number by 1024. For example, specify 1536 KB instead of 1.5MB (1.5
x 1024 = 1536).
Permissions
Examples
A. Add a file to a database
This example creates a database and alters it to add a new 5-MB data file.
USE master
GO
CREATE DATABASE Test1 ON
(
NAME = Test1dat1,
FILENAME = 'c:\Program Files\Microsoft SQL
Server\MSSQL\Data\t1dat1.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
GO
ALTER DATABASE Test1
ADD FILE
(
NAME = Test1dat2,
FILENAME = 'c:\Program Files\Microsoft SQL
Server\MSSQL\Data\t1dat2.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
GO
This example creates a filegroup in the Test 1 database created in Example A and adds
two 5-MB files to the filegroup. It then makes Test1FG1 the default filegroup.
USE master
GO
ALTER DATABASE Test1
ADD FILEGROUP Test1FG1
GO
USE master
GO
ALTER DATABASE Test1
ADD LOG FILE
( NAME = test1log2,
FILENAME = 'c:\Program Files\Microsoft SQL
Server\MSSQL\Data\test2log.ldf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB),
( NAME = test1log3,
FILENAME = 'c:\Program Files\Microsoft SQL
Server\MSSQL\Data\test3log.ldf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
GO
This example removes one of the files added to the Test1 database in Example B.
USE master
GO
ALTER DATABASE Test1
REMOVE FILE test1dat4
GO
E. Modify a file
This example increases the size of one of the files added to the Test1 database in Example
B.
USE master
GO
ALTER DATABASE Test1
MODIFY FILE
(NAME = test1dat3,
SIZE = 20MB)
GO
This example makes the primary filegroup the default filegroup if another filegroup was
made the default earlier.
USE master
GO
ALTER DATABASE MyDatabase
MODIFY FILEGROUP [PRIMARY] DEFAULT
GO
3-Sql-Server Data Types:
Exact Numerics
Integers
bigint
int
smallint
tinyint
bit
bit
decimal
Fixed precision and scale numeric data from -10^38 +1 through 10^38 –1.
numeric
money
Monetary data values from -2^63 (-922,337,203,685,477.5808) through 2^63 - 1
(+922,337,203,685,477.5807), with accuracy to a ten-thousandth of a monetary unit.
smallmoney
Monetary data values from -214,748.3648 through +214,748.3647, with accuracy to a ten-
thousandth of a monetary unit.
Approximate Numerics
float
Floating precision number data from -1.79E + 308 through 1.79E + 308.
real
datetime
Date and time data from January 1, 1753, through December 31, 9999, with an accuracy
of three-hundredths of a second, or 3.33 milliseconds.
smalldatetime
Date and time data from January 1, 1900, through June 6, 2079, with an accuracy of one
minute.
Character Strings
char
varchar
text
nvarchar
ntext
Binary Strings
binary
varbinary
image
Syntax
CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
[ ON { filegroup | DEFAULT } ]
Arguments
table_name
Is the name of the new table. Table names must conform to the rules for identifiers. The
combination of owner.table_name must be unique within the database. table_name can
contain a maximum of 128 characters, except for local temporary table names (names
prefixed with a single number sign (#)) that cannot exceed 116 characters.
column_name
Is the name of a column in the table. Column names must conform to the rules for
identifiers and must be unique in the table..
computed_column_expression
ON {filegroup | DEFAULT}
DEFAULT
Specifies the value provided for the column when a value is not explicitly supplied during
an insert.
constant_expression
Is a constant, NULL, or a system function used as the default value for the column.
IDENTITY
Indicates that the new column is an identity column. When a new row is added to the
table, Microsoft® SQL Server™ provides a unique, incremental value for the column.
Identity columns are commonly used in conjunction with PRIMARY KEY constraints to
serve as the unique row identifier for the table. The IDENTITY property can be assigned
to tinyint, smallint, int, bigint, decimal(p,0), or numeric(p,0) columns. Only one
identity column can be created per table. Bound defaults and DEFAULT constraints
cannot be used with an identity column. You must specify both the seed and increment or
neither. If neither is specified, the default is (1,1).
seed
Is the value used for the very first row loaded into the table.
increment
Is the incremental value added to the identity value of the previous row loaded.
CONSTRAINT
constraint_name
Are keywords that determine if null values are allowed in the column. NULL is not
strictly a constraint but can be specified in the same manner as NOT NULL.
PRIMARY KEY
Is a constraint that enforces entity integrity for a given column or columns through a
unique index. Only one PRIMARY KEY constraint can be created per table.
UNIQUE
Is a constraint that provides entity integrity for a given column or columns through a
unique index. A table can have multiple UNIQUE constraints.
CLUSTERED | NONCLUSTERED
Are keywords to indicate that a clustered or a nonclustered index is created for the
PRIMARY KEY or UNIQUE constraint. PRIMARY KEY constraints default to
CLUSTERED and UNIQUE constraints default to NONCLUSTERED.
You can specify CLUSTERED for only one constraint in a CREATE TABLE statement.
If you specify CLUSTERED for a UNIQUE constraint and also specify a PRIMARY
KEY constraint, the PRIMARY KEY defaults to NONCLUSTERED.
FOREIGN KEY...REFERENCES
Is a constraint that provides referential integrity for the data in the column or columns.
FOREIGN KEY constraints require that each value in the column exists in the
corresponding referenced column(s) in the referenced table. FOREIGN KEY constraints
can reference only columns that are PRIMARY KEY or UNIQUE constraints in the
referenced table or columns referenced in a UNIQUE INDEX on the referenced table.
ref_table
(ref_column[,...n])
Is a column, or list of columns, from the table referenced by the FOREIGN KEY
constraint.
CHECK
Is a constraint that enforces domain integrity by limiting the possible values that can be
entered into a column or columns.
logical_expression
column
[ASC | DESC]
Specifies the order in which the column or columns participating in table constraints are
sorted. The default is ASC.
Is a placeholder indicating that the preceding item can be repeated n number of times.
Examples
A. Use PRIMARY KEY constraints
This example shows the column definition for a PRIMARY KEY constraint with a
clustered index on the job_id column of the jobs table (allowing the system to supply the
constraint name) in the pubs sample database.
job_id smallint
PRIMARY KEY CLUSTERED
This example shows how a name can be supplied for the PRIMARY KEY constraint.
This constraint is used on the emp_id column of the employee table. This column is
based on a user-defined data type.
emp_id empid
CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
A FOREIGN KEY constraint is used to reference another table. Foreign keys can be
single-column keys or multicolumn keys. This example shows a single-column
FOREIGN KEY constraint on the employee table that references the jobs table. Only the
REFERENCES clause is required for a single-column FOREIGN KEY constraint.
You can also explicitly use the FOREIGN KEY clause and restate the column attribute.
Note that the column name does not have to be the same in both tables.
Multicolumn key constraints are created as table constraints. In the pubs database, the
sales table includes a multicolumn PRIMARY KEY. This example shows how to
reference this key from another table; an explicit constraint name is optional.
This example shows a UNIQUE constraint created on the stor_name and city columns of
the stores table, where the stor_id is actually the PRIMARY KEY; no two stores in the
same city should be the same.
Defaults supply a value (with the INSERT and UPDATE statements) when no value is
supplied. In the pubs database, many DEFAULT definitions are used to ensure that valid
data or placeholders are entered.
On the jobs table, a character string default supplies a description (column job_desc)
when the actual description is not entered explicitly.
In the employee table, the employees can be employed by an imprint company or by the
parent company. When an explicit company is not supplied, the parent company is
entered (note that, as shown here, comments can be nested within the table definition).
DEFAULT ('9952')
/* By default the Parent Company Publisher is the company
to whom each employee reports. */
In addition to constants, DEFAULT definitions can include functions. Use this example to
get the current date for an entry:
DEFAULT (getdate())
Niladic-functions can also improve data integrity. To keep track of the user who inserted
a row, use the niladic-function for USER (do not surround the niladic-functions with
parentheses):
DEFAULT USER
and
This example shows a named constraint with a pattern restriction on the character data
entered into the emp_id column of the employee table.
This example specifies that the pub_id must be within a specific list or follow a given
pattern. This constraint is for the pub_id of the publishers table.
This example shows complete table definitions with all constraint definitions for three
tables (jobs, employee, and publishers) created in the pubs database.
This example creates a table with a uniqueidentifier column. It uses a PRIMARY KEY
constraint to protect the table against users inserting duplicated values, and it uses the
NEWID() function in the DEFAULT constraint to provide values for new rows.
This example illustrates the use of an expression ((low + high)/2) for calculating the
myavg computed column.
CREATE TABLE mytable
(
low int,
high int,
myavg AS (low + high)/2
)
Syntax
Arguments
ALTER COLUMN
Specifies that the given column is to be changed or altered. The altered column cannot be:
• Associated with a default, except that changing the length, precision, or scale of a
column is allowed if the data type is not changed.
new_data_type
Is the new data type for the altered column. Criteria for the new_data_type of an altered
column are:
• The previous data type must be implicitly convertible to the new data type.
• If the altered column is an identity column, new_data_type must be a data type
that supports the identity property.
precision
scale
Specifies whether the column can accept null values. Columns that do not allow null
values can be added with ALTER TABLE only if they have a default specified. A new
column added to a table must either allow null values, or the column must be specified
with a default value.
If the new column allows null values and no default is specified, the new column contains
a null value for each row in the table. If the new column allows null values and a default
definition is added with the new column, the WITH VALUES option can be used to store
the default value in the new column for each existing row in the table.
If the new column does not allow null values, a DEFAULT definition must be added with
the new column, and the new column automatically loads with the default value in the
new columns in each existing row.
NULL can be specified in ALTER COLUMN to make a NOT NULL column allow null
values, except for columns in PRIMARY KEY constraints. NOT NULL can be specified
in ALTER COLUMN only if the column contains no null values. The null values must be
updated to some value before the ALTER COLUMN NOT NULL is allowed, such as:
ADD
Specifies that one or more column definitions, computed column definitions, or table
constraints are added.
• Used in an index.
ALL
Specifies that all constraints are disabled with the NOCHECK option, or enabled
with the CHECK option.
ALL
Specifies that all triggers in the table are enabled or disabled.
trigger_name
Specifies the name of the trigger to disable or enable.
column_name data_type
Is the data type for the new column. data_type can be any Microsoft® SQL Server™ or
user-defined data type.
DEFAULT
Is a keyword that specifies the default value for the column. DEFAULT definitions can be
used to provide values for a new column in the existing rows of data. DEFAULT
definitions cannot be added to columns that have a timestamp data type, an IDENTITY
property, an existing DEFAULT definition, or a bound default. If the column has an
existing default, the default must be dropped before the new default can be added. To
maintain compatibility with earlier versions of SQL Server, it is possible to assign a
constraint name to a DEFAULT.
Permissions
ALTER TABLE permissions default to the table owner, members of the sysadmin fixed
server role, and the db_owner and db_ddladmin fixed database roles, and are not
transferable.
Examples
A. Alter a table to add a new column
This example adds a column that allows null values and has no values provided through a
DEFAULT definition. Each row will have a NULL in the new column.
This example adds several columns with constraints defined with the new column. The
first new column has an IDENTITY property; each row in the table has new incremental
values in the identity column.
This example adds a nullable column with a DEFAULT definition, and uses WITH
VALUES to provide values for each existing row in the table. If WITH VALUES is not
used, each row has the value NULL in the new column.
This example disables a constraint that limits the salaries accepted in the data. WITH
NOCHECK CONSTRAINT is used with ALTER TABLE to disable the constraint and
allow an insert that would normally violate the constraint. WITH CHECK
CONSTRAINT re-enables the constraint.
-- Valid inserts
INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)
INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)
This example uses the DISABLE TRIGGER option of ALTER TABLE to disable the
trigger and allow an insert that would normally violate the trigger. It then uses ENABLE
TRIGGER to re-enable the trigger.
آزمايش 2
SQL-SERVER توابع در
پيش آگاهي
مقدمه :مروري بر توابع ورويه ها
همععان گععونه کععه درزبععان هععاي برنععامه نويسععي ،امکععان تعريععف تععابع ورويععه وجععود دارد،درمحيععط Sql-
serverنيزاستفاده از آنها امکانپذيراست .توابع ورويه ها جز اشياء هر پايگاه داده هسععتند و در ديکشععنري داده
ها نگهداري مي شوند .درابتداي ايجاديک تابع ياروال ،ساختاردستورات آن هاکنترل شده ،خطايععابي انجععام مععي
شود ،سپس نام تابع يععارويه ايجادشععده درجععدول sysobjectsومتن آنهادرجدول syscommentsذخيره
شده ،دراولين اجراکامپايل مي شوند .بنابراين درفراخواني هاي بعععدي ،درصععورتي کععه نيععازبه کامپايععل دوبععاره
آنهاازسوي کاربردرخواست نشود،کامپايل نمي شوند .اين دوساختار کاربرد هاي ديگري نيز دارند از جمله:
کاهش بار شبکه :به جاي فرستادن متن کامل با يک دستور تقا ضاي اجرا ي يک تابع يا -1
روال را مي توان اعلن کرد.
جايگزين هاي مناسب ديدها :مي توان از روال ها و مخصوصا توابع به عنوان جايگزين -2
هاي مناسبي براي ديدها استفاده کرد .يکي از بهترين دليل استفاده از توابع به جاي ديدها اين است که
شرح تابع
دو يا چند رشته را به هم مي چسباند ‘’expression’ + ‘expression
(PATINDEX(‘%pattern%’, expressionمحل نخستين وقوع patternرا برمي گرداند.
.حروف blankسمت چپ رشته را حذف مي کند . (LTRIM(char_expr
توابع تاريخ
اين توابع براي پردازش برروي نوع داده اي datetimeبه کارمي رود :
)SELECT date_function (parameters
شرح تابع
مقدار عددي datepartر ا در تاريخ برمي گرداند (. ( DATEPART ( datepart , date
datepartمي تواند يکي از اجزاء ، dateيعني سال))yy
،ماه) (mmيا روز) (ddباشد).
تعداد dateparteهاي بين دو تاريخ را برمي گرداند. DATEDIFF(depart , date1 ,
(date2
تاريخ و ساعت جاري را برمي گرداند . ()GETDATE
مقدار عددي نشان دهنده روز را بر ميگرداند . (DAY(date
مقدار عددي نشان دهنده ماه بر ميگرداند . (MONTH(date
مقدار عددي نشان دهنده سال را بر ميگرداند . (YEAR(date
مثال : 3شماره دانشجويي وسن دانشجوياني که سال تولد آنها بزرگ تر از سال 1986است:
)SELECT s#,datediff (yy,getdate( ),birthdate
FROM STD WHERE
Datepart(yy,birthdate)>1986
تعريف متغيرها
مانند اکثر زبان ها ي برنامه نويسي در T-sqlنيز متغير ها بعد از تعريف و تعيين نوع قابل استفاده مي
باشند .
متغير ها در دو نوع قابل دسته بندي هستند :
متغيرهاي عمومي :اين متغير ها با @@شروع مي شوند .تمامي اين متغير ها توسط Sql-serverتعريف و
مقداردهي مي شوند .مثل @@VERSIONکه نسخه ونوع پردازنده مورد استفاده سرور رانمايش مي دهد.از
ديگر متغير هاي مهم اين گروه @@IDENTITYو@@ROWCOUNTهستند که به ترتيب آخرين مقدار
IDENTITYاختصاص داده شده توسط سروروتعداد سطرهايي که تحت تاثير آخرين دستور قرا ر گرفته اند را
نمايش مي دهند .
متغير هاي محلي:اين متغير ها با @ شروع مي شوند . -1
: نحوه تعريف
دستورات اجرايي
. استفاده کنيدgoto وif—else براي کنترل اجرا ي برنامه مي توانيد از ساختار هاي
.را در اختيار برنامه نويسان قرار داده استBEGIN---END ساختارT-sql براي بلوک بندي نيز
:7 مثال
IF exists(set @Name=select Name from STD
(Where s#=4585
Select 'The studentname is:',@Name
Else
'Print 'no students found
.استفاده کنيدBREAK وCONTINUE باWHILE براي حلقه سازي نيز مي توانيد از ساختار
:8 مثال
Declare @num1 smallint
Declare @num2 smallint
Set @num1=12
Set @num2=13
(While(@num2!=20
begin
Select name,family,'has got the max grade between',@num1,'and',@num2
from std
Where s# in(select max(s#) from reg where (grade between @num1 and
((@num2
set @num1=@num1+1
set @num2=@num2+1
end
.ازديگر ساختار هاي پر کاربرد در نوشتن توابع جداول موقتي هستند که در آزمايش اول بحث شدند
RETURNS scalar_return_data_type
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
تابعي مي نويسيم که شماره يک دانشجو راگرفته و نام ونام خانوادگي وي را به فرمت خاصي )نام: 9 مثال
نام ( نمايش مي دهد، خانوادگي.
RETURNS NVARCHAR(37)
AS
BEGIN
FROM STD
WHERE S# =@S#
RETURN (@ret_Value)
End
select dbo.fn_Nameret(8008093)
تابع اي مي نويسيم که يک شماره دانشجويي وشماره يکي از ترم هاي تحصيلي وي رادريافت نموده: 10 مثال
. دانشجو را برگرداندTrmGpa))و معدل آن ترم
returns dec(5,1)
begin
select @TrmRegUnit=sum(CRS.Unit),@TotGrade=sum(REG.Grade*CRS.Unit)
REG.c# = CRS.c#
and
REG.TrmNo = @TrmNo
and
REG.s#=@s#
return(@TotGrade/@TrmRegUnit)
end
SELECT dbo.fn_TrmGpa(8008093,'3802')
: ساختار تابع به صورت زير تعريف مي شود. خروجي اين توابع يک جدول است
RETURNS TABLE
[ AS ]
RETURN [ ( ] select-stmt [ ) ]
تابع زير با دريافت شماره درس و شماره ترم ليست نام و جنسيت دانشجويان آن درس را در ترم: 11 مثال
. مي گرداند مذکور بر
Returns table
As
And
CODEFILE.Type = STD.Sex
And
and STD.S#=REG.S#
and REG.Trmno=@Trmno)
)
مي بينيد که تفاوت اصلي اين تعريف با توابع اسکالر در اين است که نوع خروجي يک جدول تعريف شده
محدوديتي که روي اين نوع تعريف وجود دارد اين است که خروجي تابع بايد توسط يک دستور.است
.ايجادشودselect
. ساخته شود وجود نداردselect در اين نوع توابع اين محدوديت که خروجي بايد توسط يک دستور
[ AS ]
BEGIN
function_body
RETURN
END
با استفاده از اين روش تابعي مي نويسيم که شماره يک دانشجو و شماره يک ترم وي را در يافت و: 12 مثال
است شماره درس هايي را که دانشجو در آن ترم ثبت نام کرده12 در صورتي که معدل کل دانشجو بالتر از
.در غير اين صورت حدول تهي برگرداند.است را بر مي گرداند
As
Begin
If @mygpa>12
Begin
insert @crsnames
End
return
End
نکته :چون در اينجا به انواع توابع اشاره کرديم بهتر است همين جععا بععه تفععاوت نيازهععاي اجرايععي انععواع توابععع
تفاوت آن ها با ديدها اشاره کنيم.گفتيم که بععراي محععدود کععردن دسترسععي کععاربران و برنععامه هععاي کععاربردي بععه
ستون ها يا سطر هاي مشخصي از جداول علوه بر ديد توابع و روالها مي توانند گزينه هاي مناسبي باشععند.در
مورد ديد مي توانيد بعد از ساختن ديد با استفاده از selectمجوز استفاده از آن را به کاربرن اهدا کنيد.در
مورد توابع وضعيت اندکي متفاوت است .براي استفاده از توابع اسکالر به مجوز Executeنياز داريد .براي
استفاده از توابع جدولي که خروجي آن از نوع جدول است به مجوز selectهم نياز داريد .
دستور کار
-1وارد محيط Query Analyzerشويد هريک از پرسشهاي زير را با استفاده از دستورات T-SQLپاسخ
کنيد . داده و اجرا
)همه اسکريپت هاي نوشته شده را ذخيره نماييد(.
-دانشجوياني را که بدون رعايت پيش نيازي در دروسي ثبت نام نموده اند ،استخراج کرده ،شماره و نام
همراه با شماره و نام درس ثبت نام شده را نشان دهيد . هر دانشجو
-دانشجوياني را که بدون رعايت هم نيازي در دروسي ثبت نام نموده اند ،استخراج کرده ،شماره و نام هر
با شماره و نام درس ثبت نام شده را نشان دهيد . دانشجو همراه
-3با احضار تابع مرحله قبل TrmGpaرا براي ترم آخر دانشجو در فايل STDTRMاصلح کند .
-4يک تابع به نام fn1_StdGpaتعريف کنيد که شماره يک دانشجو را دريافت نموده و با احضار تابع
کل ) (Gpaدانشجو راودر صورتي که چنين دانشجويي وجود نداشت مقدار 1-را مرحله قبل ،معدل
برگرداند .
-5يک تابع به نام fn2_StdGpaتعريف کنيد که فقط با استفاده ازجداول CRSو REGشماره يک دانشجو
نموده و معععدل کععل ) (Gpaرا محاسبه کرده و ،در صورتي که چنين دانشجويي وجود را دريافت
نداشت مقدار 1-را برگرداند .
-6با دريافت شماره دانشجويي و احضار تابع مرحله Gpa 5را در فايل STDاصلح نمايد .
-7با استفاده از محيط Enterprise Managerيک تابع به نام fn_TotPasUnitايجاد کنيد که شماره
دريععافت نمععوده و مجمععوع واحععد هععاي پععاس شععده را برگردانععد ،در صععورتي کععه چنيععن دانشجويي را
برگرداند. دانشجويي وجود نداشت مقدار 1-را
- 8با استفاده ازتب Templateتابعي با نام fn_TotRegUnitايجاد کنيد که شماره دانشععجويي را دريععافت
مجمععوع واحععد هععاي ثبععت شععده ) (TotRegUnitرا برگرداند .در صورتي که چنين نمععوده و
برگرداند. دانشجويي وجود نداشت مقدار 1-را
-9با احضار توابع مراحل 7و 8فيلد هاي TotPasUnitو TotPasUnitرا در جععدول STDا اصلح
نماييد .
-10يك تابع به نام fn_RegCtrlبنويسيد که يعك شماره دانشجويي را دريافت نموده وصحت ثبت نام وي
نموده و به عنوان نتيعجه يعكي از مقاديعر 0تا 3را به شرح زير برگرداند . را بررسي
،0 -اشكال وجود ندارد .
، 1 -يععني مشکل پيش نياز وجود دارد .
، 2 -يععني مشکل هم نيازي وجود دارد .
، 3 -يعني مشکل پيعش نيععاز ي و هم نيازي وجود دارد .
-11ا استفاده رويه ذخيره شده sp_helptextتابع نوشته شده در مرحله قبل را مشاهده نماييد .
-12نام دروس سه واحدي گروه کامپيوتر که دانشکده برق و کامپيوتر ارائه مي کند را استخراج کنيد .
آزمايش 3
SQL-Serverرويه هادر
پيش آگاهي
مقدمه
رويه ها نيز مانندتوابع ابزارهاي مناسبي براي دسته بندي دستورات پرکاربرد هستند .رويه ها حتي مي توانند
مقادير خروجي داشته باشند ولي تفاوت عمده اين دوساختاردرنحوه احضارآن ها براي گرفتن مقداربازگشتي
است .احضار توابع صريح است بدين معني که در احضار توابع مي توان مقداري را مساوي با تابع قرار دادو
بعداز احضار متغير با مقدار بازگشتي تابع مقدار دهي مي شود .ولي براي گرفتن خروجي از رويه ها بايد يک
يا چندين پارامتر را به عنوان مقادير خروجي معرفي کنيم و رويه با مقدار گذاري و تغيير اين پارامتر ها مقدار
مي کند .تفاوت هاي اندک ديگري نيز بين اين دو ساختار وجود دارد که در حين بررسي SETخروجي را
.نحوه تعريف رويه ها به آن ها مي پردازيم
يک بار کامپايل شده SQL-Serverبعد از تعريف رويه ها ،آن ها معمول توسط بخش بهينه ساز
وبهترين مسير اجرايي براي آن ها ساخته مي شود .هنگامي که يک رويه احضار مي گرددتنها کاري که
انجام مي دهد جايگزيني پارامتر هاي فرستاده شده در رويه و استفاده از طرح اجرايي از پيش SQL-Server
.بدون کامپايل وبهينه سازي مجددآن (براي اجراي احضار رويه است()(cacheکامپايل شده رويه
ديده مي شودکه در تعريف رويه ها نيز مانند توابع بعد از نام رويه ليست پارامتر هاي آن •
رويه مي آيدکه اين پارامتر ها مي توانند ورودي ،خروجي و يا ورودي-خروجي باشند .
با استفاده ازکلمه کليدي Defaultمي توان مقداري را براي يک پارامتر تعيين کرد که در •
صورتي که در حين احضار رويه اين آرگومان احضار نگردد با مقدار پيش فرض جايگزين شود .
)توجه کنيد که در اين صورت لزم است تااحضار رويه با تکنيک Call by nameصورت
گيرد (.
کلمه کليدي Outputبدين معني است که پارامتر مورد نظر مي تواند به عنوان خروجي يا •
ورودي– خروجي مطرح با شد.
گفتيم که رويه هاي ذخيره شده فقط يکبار کامپايل مي شوند .اگر بخواهيم که رويه در هر بار •
اجرا کامپايل شود ودر نتيجه نسبت به تغييرات ايجاد شده در پايگاه داده حساس باشد )،مثل اضافه
شدن يک شاخص( مي توانيد از عبارت WITH RECOMPILEاستفاده کنيد.
مثال :1رويه اي بنويسيد که شماره يک دانشجو وشماره يک ترم وشماره يک درس را دريافت ودرس
مورد نظر را در ترم مذکوربراي آن دانشجو ثبت نام کند .اين رويه پارامتر چهارمي را هم دريافت مي
کندکه به عنوان خروجي مجموع واحد هاي ثبت نام شده وي در ترم مذکوررادرآن برمي گرداندو در
:صورت داشتن هر گونه مشکل براي ثبت نام اين درس پارامتر چهارم به شرح زير مقداردهي مي شود
.دانشجو در آن ترم ثبت نام ندارد )1-(-
.دانشجو مشکل پيش نيازي براي ثبت نام درس دارد )2-(-
.دانشجو مشکل هم نيازي براي ثبت نام درس دارد )3-(-
مثال : 6مي خواهيم رويه اي بنويسيم که دروس يک دانشجورا که بدون رعايت هم نيازي درترم جديدثبت نام
.کرده ،حذف نمايد
)create procedure pr_delete_coreq_reg (@st# int
as
begin
delete from reg where
reg.s# = @st#
and
reg.c# in (select coreq .c# from coreq
where
coreq.c# = reg.c#
and
reg.s# = @st#
and
coreq.cp# not in (select reg. c# from reg
where
reg.s# = @st# ))
end
دستورکار
يک رويه به نام _TrmGpa Prبنويسيد که شماره يک دانشجو و شماره ترم را دريافت -1
نموده و معدل ترم دانشجو را محاسبه و بر گرداند .
يک رويه به نام Pr_tot_stdtrmبنويسيد که شماره يک دانشجو را دريافت نموده ومعدل -2
کل،کل واحدهاي گذرانده وکل واحدهاي اخذشده دانشجورا محاسبه نموده وبرگرداند .
يک رويه به نام Pr_Delete_Prereq_regبنويسيد که شماره دانشجويي را گرفته -3
ودروسي راکه دانشجو بدون رعايت پيش نيازي ثبت نام نموده ،حذف نمايد .
رويه اي به نام Pr_Mydeleteبنويسيد که شماره درس و حداقل تعداد ثبت نام در يک -4
درس براي تشکيل شدن آن درس را دريافت و در صورتي که نعداد ثبت نام در درس به حد
نصاب نرسيد ه است کليه ثبت نام هاي فعلي درس را حذف کند .
آزمايش 4
SQL-Serverدر )(CURSORSکرسرها
پيش آگاهي
مقدمه
معموليک مجموعه )جدول( بوده ودرزبان هاي برنامه نويسي SELECT ،باتوجه به اينکه خروجي دستور
امکان کارکردن باجداول وجودندارد ،به کمک کرسرها امکان دسترسي به رکوردهاي يک جدول به شکل
.رکوردبه رکورد وجوددارد
قبل از معرفي نحوه تعريف يک کرسر و خصوصععيات آن بععا تععوجه بععه زيععاد بععودن دسععته بنععدي هععاي مختلععف
:کرسرها برحسب خصويات مختلف آن بهتر است ابتدا به معرفي بعضي ويژگي هايي کرسر ها بپردازيم
1- :طول عمر)حوزه(کرسر
کرسر هايي که ساخته مي شوند به صورت پيش فرض تا آخر پايدار بودن اتصال جاري به سرور باقي مي
که صراحتا از بين برده شونديا توسط عبارت .غيرفعال شوند DEALLOCATEمانند مگر اين
2- :قدرت تغيير و به روز آوري جداولي که کرسر روي آن ها حرکت مي کند
به اين معني که بعد از اين که کرسري ساخته شد آيا مي تواند تغييري در تاپلي که روي آن قرار دارد
فقط حق خواندن ازاين تاپل را دارد .ايجاد کنديا اين که
3- نحوه حرکت کرسر روي تاپل هاي جدول :
اين که آيا کرسر اين قدرت را دارد که مثل بتواند علوه بر جلو رفتن به سمت عقب هم حرکت کنديا اين
جدول پرش کند .که به ابتداي
4- :حساسيت به تغييرات ايجاد شده در جدول
به اين معني که آياپس ازبازکردن کرسر ،اگرتغييراتي درجداول منبع کرسربه
دارد ياندارد .وجودبيايد،درکرسرتاثير
:سرعت ايجاد و حرکت کرسر 5-
اين خصوصيت يک خصوصيت تر کيبي است و با توجه به اين که يک کرسر کدام يک از خصوصيات
موارد قبل را داشته باشد تعيين مي شود .مثل مسلما کرسري که هم رو به جلووهم روبه عقب حرکععت مععي کنععد
.از کرسري که تنها رو به جلو مي رود کند تر است
در صورتي که دو کرسر همنام هم زمان هم به صورت محلي و هم به صورت سراسري وجود داشته باشند
براي باز کردن کرسر سراسري بايدکلمه کليدي Globalاستفاده کرد .
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE n
| RELATIVE n
]
FROM
]
} } { { [ GLOBAL ] cursor_name
] ] [ INTO @variable_name [ ,...n
براي کنترل واکشي سطرها درهنگام استفاده از کرسرمتغيرسيستمي @@ FETCH_STATUSبه کاربرده مي
شود .مقدار خروجي اين تابع وضعيت آخرين دسععتور FETCHرا نمايش مي دهد،در صورتي که واکشي
موفقيت آميز باشداين تابع مقدار صفر را بر مي گرداند.
کلمه کليدي NEXTباعث مي شود تا سطربعداز سطر جاري واکشي شود.کلمات کليدي •
FIRSTو PRIORو LASTبه ترتيب معادل اولي ،قبلي و آخرين مي باشند.
ABSOLUTE nسبب مي شود تاپل nام از ابتداي کرسر واکشي شود . •
RELATIVE nسبب مي شود تاپل nام بعد از تاپل جاري کرسرواکشي شود. •
با استفاده از عبارت [ INTO @variable_name [ ,...nمتغير هاي ذکر شده بعد از •
INTOبانتايج حاصل از واکشي کرسر مقداردهي مي شوند.انواع داده اي اين متغير ها بايدبا انواع
داده اي ستون هاي ذکر شده در جلوي SELECTکرسر به ترتيب يکسان باشند .
:بستن کرسر 4-
قدم هاي 2تا 4مي تواند تکرار شود يعني يک کرسر را بعد از بستن دوباره باز کرد که در اين صورت
.کرسر مجددًا از جدول اصلي مقدار دهي مي شود
حذف دروس ثبت نام شده دانشجويان که بدون رعايت هم نيازي اخذ نموده اند با استفاده از يک کرسر: 1 مثال
) با فرض اين که هر درس فقط يک درس هم نياز دارد. 3 آزمايش6 و رويه نوشته شده در مثال.)
ابتدا کرسر مورد نظر را ايجاد مي نمائيم:
declare cr_delete_prereq_reg cursor
SCROLL_LOCKS
FOR select s# from std
open cr_delete_prereq_reg
declare @st# int
fetch next from delete_prereq_reg into @st#
while ( @@fetch_status = 0)
begin
execute pr14 @st#
fetch next from cr_delete_prereq_reg into @st#
end
close cr_delete_prereq_reg
deallocate cr_delete_prereq_reg
در واقع.يکي از روش هاي ارتباط با رويه ها اين است که يک کرسر به عنوان پارامتر خروجي معرفي شود
خروجي رويه يک کرسر است که مي توان با آن کار کرد.
مي خواهيم رويه اي بنويسيم که شماره دانشجو را به عنوان ورودي دريافت نموده و نام دروسي که: 2 مثال
دانشجو ثبت نام نموده در پارامتر خروجي که يک کرسر است قرار بدهيم.
CREATE PROCEDURE pr_stdcourses_cursor
@s# int,
@stdcourses_cursor CURSOR VARYING OUTPUT
AS
SET @stdcourses_cursor = CURSOR
OPTIMISTIC
DYNAMIC FOR
SELECT cname from
FROM reg inner join crs
On crs.c#=reg.c#
Where reg.s#=@s#
OPEN @titles_cursor
را در مواردي که يک کرسر به عنوان پارامتر خروجي تعريف مي شود به کار بردهVARYING کلمه کليدي
راکه پارامتر خروجي اين رويه اسععت راstdcourses_cursor@ در رويه بالابتداخواص کرسر. مي شود
. کرده ايمset
. در دستورات زير از اين رويه استفاده مي کنيم. سپس اين کرسر را باز و آماده واکشي کرده ايم
آزمايش 5
در SQL تراکنش هاوتريگرها
پيش آگاهي
مقدمه :
يکي ازاصول تامين جامعيت داده اي ،امکان اعمال به روز رساني منتشرشونده وتعريف واحدهاي منطقي
کاردرراستاي اجراي کامل ياعدم اجراي کليه مواردازيک مجموعه کارمي باشد .
براي پياده سازي اين اصل SQL-Serverتريگر)رهانا(وتراکنش رادراختياربرنامه نويس قرارداده است .
احضارتريگرالزاما به صورت ضمني بوده وازطريق اجراي يکي ازدستورات insert ،deleteيا update
انجام مي شود .برنامه نويس رهانارابراي اجراي دستوراتي که بايدبه صورت خودکاربراي حفظ جامعيت داده
ها انجام شود ،تعريف مي کند .بنابراين تريگررامي توان تراکنشي دانست که باتغييرات داده فعال مي شود
مي کند . وامکان اجراي يک واحد منطقي کاررا درجريان تغييرات داده اي فراهم
تراکنش )(Transaction
تراکنش مجموعه اي از دستورات SQLاست که معمول تغييري در پايگاه داده ايجاد مي کند به گونه اي که
جامعيت و يکپارچگي داده ها همچنان برقرار باشد.اين مجموعه دستورات يا به طورکامل اجراء مي گردنععد ويععا
درصورت وجود اشکال دربين دستورات اجراي تمامي آن ها لغومي گردد .
درواقع تراکنش ،يک واحد منطقي کار) (Logical unit workاست که با استفاده از آن مي توان از پايان
درست وکامل کار اطمينان پيدا کرد.
SQLبراي اجراي تراکنش ها از فايل ثبت تراکنش ها ) (Log fileاستفاده مي کند که کليه تغييرات درآن
ذخيره مي شود .براي افزايش سرعت وهمچنين براي اطمينان ازاجراي درست وکامل تراکنش ،معمول تغييرات
موردنظرعلوه برآن که درفايل هاي اصلي اعمععال مععي شععود ،درفايععل logنيزنوشته شده والبته رکوردهاي
تغييرداده شده درحالت lockقرارمي گيرند .درانتها درصورتي که قرارباشد تغييرات برگشت داده شود،
ازفايل logاستفاده شده وتغييرات برگشت داده شدهودرنهايت به هرحال رکوردهاي lockشده آزادخواهند
شد .
دستورات کنترل تراکنش
: Begin Transactionنقطه شروع يک تراکنش است که ساختارکلي آن به شکل زيراست :
دفترتراکنش
دردفترتراکنش( ، Log (Transactionتراکنش بانامي که بعداز begin tranآورده شده ،همچنين نام
پايگاه داده اي که تراکنش برروي آن تعريف شده ،نام کاربر ،تاريخ ،زمان ،شرح تراکنش وشماره ترتيب
(Log (LSNثبت مي شود .براي هرتراکنش که markمي شود يک رکورددرجدول logmarkhistory
در msdbدرنظرگرفته مي شود .اگريک تراکنش markشده ،تغييراتي درپايگاه داده ايجادکرد
وکاربربخواهدکه تغييرات انجام نشود ،براي بازسازي پايگاه به وضعيت آن در يک زمان وتاريخ مشخص
کافي است بادادن يکي ازمشخصات تراکنش ،آن داده هارادوباره restoreکرد .
:[ 'WITH MARK [ 'descriptionاگراين عبارت استفاده شود ،بايدبراي تراکنش نامي بيان شده باشد .
کاربرمي تواند بدين وسيله بادادن نام تراکنش ،آن رادردفترتراکنش( Log (Transactionثبت کند.
: descriptionدراين قسمت توضيحي درموردتراکنش مي تواندآورده شود .
: ROLLBACK TRANSACTIONاين دستور ،وضعيت داده هاي پايگاه رابه نقطه شروع تراکنش ويا به
نقطه اي که توسط ، savepointکه با SAVE TRANSACTIONمشخص شده ،به عقب برمي گرداند
يعني تغييرات ايجادشده ازابتداي تراکنش يااز savepointتااينجاراخنثي مي کند .اگراين دستوربدون نام
آورده شود ،تاشروع تراکنش تغييرات رابه عقب برمي گرداند واگردريک تراکنش تودرتوبه کاررود،تمام
تراکنش هاي داخلي راهم عقبگردمي کندتابه بيروني ترين BEGIN TRANبرسد .اگر دردرون تراکنش چند
savapointوجودداشت ROLLBACKتانزديک ترين نقطه savepointبه ، ROLLBACKعقبگرد
مي کند .
transaction_nameو@ : tran_name_variableدقيقا مانند begin tranتعريف مي شوند .
: savepoint_nameنامي است که در SAVE TRANSACTIONتعريف شده است وباعث مي شود که
ROLLBACK TRANتا اين نقطه به عقب برگردد .
@ : savepoint_variableنام متغيري است که در SAVE TRANSACTIONمشخص مي شود وقبل
بايدتعريف شده باشد .
@@ : Trancountمتغيري سراسري است که مقدار آن ازنوع integerاست ومعرف تعدادتراکنش هاي
فعال مي باشد .باهر BEGIN TRANSACTIONيک واحد به آن اضافه مي شود وباهر COMMIT
TRANيک واحدازآن کم مي شود ROLLBACK TRAN.مقدار آن راصفرمي کند به جز ROLLBACK
TRAN savepoint_nameکه تغييري درمقدار آن ايجاد نمي کند .
@@ :errorيک متغيرسراسري است ومقدارآن معرف اين است که آخرين دستوراجراشده باموفقيت انجام
شده يانه .اين متغير يک مقدار integerرابرمي گرداندکه کد خطايي که دراجراي آخرين دستور T_SQL
انجام شده ،رخ داده است را برمي گرداند .که در صورت عدم وجود خطا ،مقدار صفرمحتوي آن مي باشد .
متن خطا همراه باشماره اي که مشخص کننده نععوع خطاسععت درجععدول سيسععتمي sysmessagesآورده شده
است .
مثال : 1مي خواهيم يک مجموعه دستور بنويسيم که در ابتدا دانشععجويي را در تععرم خععاص ودردرس خععاص
ثبت نام نمايد ،در صورتي که مجموع واحد هاي ثبت نام شده براي دانشجوکمتر از 100واحد باشد ،ثبت
نام وي را در اين درس لغو و در صورتي که معدل کل وي کمتر از 10باشد ثبت نام وي را در اين ترم لغو
نمايد.
begin Transaction
)Insert into STDTRM values (8006530,'3811',null
Save Transaction beforeregiser
)insert into REG values(8006530,'1117340','3811',null
if (select
TotRegUnit from STD
)where STD.S# = 8006530)<100
begin
' print ' You can not Register in this course
Rollback Transaction beforeregiser
end
else if(select Gpa from STD WHERE STD.s#=8006530)<10
begin
' print ' You can not Register in this term
Rollback Transaction
end
'PRINT 'success
Commit Transaction
تريگر )(TRIGGER
تريگر)رهانا( نوع خاصي از رويه است که توسط کاربر درراسععتاي تععامين جععامعيت درپايگععاه داده هععاتهيه شععده
ودرزمان تغيير پايگاه ازطريق درج ،حذف واصلح يععک tableيععا viewفعال شده وعمليات موردنظررا
انجام مي دهد .بدين ترتيب مي توان باتعريف يک تريگراز اعمال تغييرات غيرمعتبرياناسععازگار در پايگععاه داده
ها جلوگيري کرده وازجامعيت ودرستي داده ها اطميينان حصععل نمععود .ايععن رويععه پععارامتر نععدارد و بععه طععور
ضمني فعال مي شود يعني همانند توابع و رويععه هععا بععه صععورت مسععتقيم احضععار نمععي شععوند بلکععه در ضععمن
اجراي يکي ازدستورات Update,Insertيا Deleteاجرا مي شوند ،بنابراين هيچ دستوري وجود ندارد
که بتوان با استفاده از نام تريگر آن تريگر را احضارنمود و تنها عامل فعال کردن آن تغييرات داده مي باشد.
برروي هر يک ازدستورات insert ،deleteو updateمي توان چند تريگر تعريف کرد .اگردراجراي
بخشي ازتريگراشکالي ايجادشود ،از کليه عمليات انجام شده صرفنظر مي شود ،به اين معنا کععه همععواره يععا کععل
عمليات انجام شده ويا هيچ عملي انجام نخواهدشد .
همچنين مي توان تريگرهاراباعبارات TRIGGER ENABLEو DISABLE TRIGGERکه در ALTER
TABLEبه کاربرده مي شوند ،به ترتيب فعال ياغيرفعال کرد .
{
} ] { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE
AS
) [ { IF UPDATE ( column
] ) [ { AND | OR } UPDATE ( column
] [ …n
]}
] sql_statement [ …n
}
}
توجه شود که جدول ياديدي که تريگربرروي آن تعريف مي شود ،بعدازکلمه ONبيان مي شود.
:AFTERيعني اين تريگر بعد از اعمال تغييرات دادهاي در جدول مورد نظر فعال گردد.
INSTEAD OF:يعني تغييرات داده اي در جدول يا ديد مورد نظر اعمال نشده و فقط تريگر فعععال گععردد.
البته ممکن است تغييرات بعدٌا از طريق دستورهاي تريگر در جدول يا ديد مورد نظر اعمال شود.
: FORمانند AFTERعمل مي کند بااين تفاوت که مي تواند روي ديد ها هم تعريف شود .
تذکر :تريگر درصورت مشخص نکردن هيچ کدام ازسه مورد بال AFTER ،راپيش فرض قرار مي دهد .
پس ازکلمه ASبدنه تريگر قرارمي گيرد که درآن عملي که تريگر قرار است انجام دهد ،نوشته مي شود .
: (update(columnمقدار اين عبارت trueيا falseبوده و نشان مي دهد که آيا روي column
مورد نظر عمل اصلح انجام شده است يا نه )در هنگام درج و اصلح فيلد مورد نظر نيز اين مقدار trueمي
باشد .به کمک اين عبارت و دستور ifمي توانيم در مقابل تغيير بعضي از فيلدهاي مورد نظر عکس العمل
مناسب پيش بيني نمود.
نکته :دربدنه تريگرنمي توان ازدستورات CREATE DATABASE ، ALTER DATABASEو DROP
DATABASEاستفاده کرد .
تغيير و حذف تريگر
براي تغييروياحذف يک تريگربه ترتيب ازدستورات ALTER TRIGGERو DROP TRIGGERاستفاده
مي شود .
ALTER TRIGGER trigger_name ...
DROP TRIGGER trigger_name
مثال : 2باتوجه به اين که به دليل قانون جامعيت ارجاعي نمي توان دانشجويي که ثبت نام دارد را از جدول
STDحذف نمود تريگري روي اين جدول مي نويسيم که به جاي دستور Deleteابتدا دروس ثبت نامي
وي در جدول REGوبعدا رکورد هاي مرتبط با دانشجو در جدول STDTRMرا حذف نموده ونهايتا دا
نشجو را از جدول STDحذف نمايد.
create trigger Tr_Delete_STD
ON STD
INSTEAD OF DELETE
AS
Begin
DECLARE @s# int
select @s# = s# from Deleted
delete from REG where REG.S# = @S#
delete from STDTRM where STDTRM.S# = @S#
delete from STD where STD.S# = @S#
' print ' Delete student from REG and STDTRM and STD
End
مثال : 3تريگري مي نويسيم که وقتي نمره دانشجو در جدول REGاصلح مي شود معدل ترم
دانشجو) (TrmGpaدر جدول STDTRMاصلح شود .
CREATE Trigger Tr_Update_TrmGpa
ON REG
after Update
AS
)if Update(Grade
BEGIN
)declare @SumGrade dec(4,1
)declare @SumUnit dec(4,1
DECLARE @S# INT
)DECLARE @TrmNo char(4
)DECLARE @c# char(7
SELECT @S# = S# , @TrmNo = TrmNo , @C# = C# FROM INSERTED
select @SumGrade = sum(CRS.Unit*REG.Grade),@SumUnit = sum (unit)
from REG,CRS
where REG.c# = CRS.c#
and
REG.C# = @C#
and
REG.TrmNO =@TrmNo
and
Reg.s# = @s#
update STDTRM SET TrmGpa=(@sumGrade/@SumUnit)
where stdtrm.s# =@S#
and
stdtrm.TrmNo=@TrmNo
print 'Grade and TrmGpa Updated'
END
در صورتي که درس، تريگر ي مي نويسيم که هر بار که يک دانشجو در درسي ثبت نام مي کند: 4 مثال
. از ثبت نام وي جلوگيري نمايد،اخذ شده جزء دروس گذرانده وقبول شده دانشجو باشد با دادن پيغام مناسب
create trigger Tr_RepeatedCourse
on reg
after insert
as
begin
if ((select count(*) from reg,inserted
where
REG.c# = inserted.c#
and
REG.s# = INSERTED.s#
and
REG.TrmNo <> Inserted.TrmNo
and
REG.grade> (select passgrade from CRS where CRS.c#
=Inserted.c#))>0)
begin
print 'You register this course in previous terms'
rollback transaction
return
end
print 'You register this course '
commit transaction
End
مي خواهيم تريگري بنويسيم که هر بار که يک دا نشجو در درسي ثبت نام مي کند تعععداد افععرادي: 5 مثال
نفر باشد با دادن60 در صورتي که تعداد آن ها بيش از، را که در آن درس ثبت نام کرده اند محاسبه نموده
. ازثبت نام وي جلوگيري نمايد، پيغام مناسب
create trigger Tr_CRS_Capacity
ON REG
After INSERT
AS
Begin
declare @C# char(7)
declare @cnt int
DECLARE @TrmNO char(4)
select @C#=C# , @TrmNO=TrmNO from INSERTED
select @cnt=count(*) from reg
where
REG.c# =@c#
and
REG.TrmNo = @TrmNO
دستور کار
-1با استفاده تابع TotRegUniFn_Updateتريگري به نام Tr_Update_TotRegUnitبنويسيد که
جدول REGرکوردي درج يا حذف مي شود مقدار جديذ TotRegUnitدر جدول هر بار که در
STDاصلح کند.
- 2تريگري به نام Tr_Update_Gpa_TotPassUnitبنويسيد که وقتي نمععره دانشععجو در جععدول REG
شود معدل کل دانشجو) (Gpaو مجموع واحد پاس شده دانشجو ) (TotPassUnitدر اصلح مي
جدول STDاصلح شود .
-3تريگر به نام Tr_Del_Prereqبنويسيد که هر بار که يک دا نشجو در درسي ثبت نام مي کند قبل از
بررسي کرده در صورتي که درس هاي پيش نياز آن را اخذ نکععرده باشععد بععا دادن پيغععام درج ثبت نام
مناسب ،از بت نام وي جلوگيري نمايد .
-4يک تريگر به نام Tr_Unit_Limitبنويسيد که هر بار که يک دا نشجو در درسي ثبت نام کند و يا ثبعععت
نظر درس اخععذ شععده اصععلح کنععد .مجمععوع وا حععد هععاي ثبععت نععامي اورا در تععرم جععاري نام خود را از
محاسبه نموده ،در صورتي که بيش از 20واحد ثبت نام نموده بعععد از دادن پيغععام مناسععب ،ازثبععت نععام وي
جلوگيري نمايد .
آزمايش 6
پيش آگاهي
در اين آزمايش مي خواهيم جدول جديدي تعريف کنيم وبااستفاده از آن به سؤالتي پاسخ دهيم که در آنها
ارجا ع جدول به خود جدول صورت مي گيرد که دراين صورت براي joinکردن جدولي باخودش
الزامابايدازنام مستعاراستفاده شود .
جدول زيررادرنظرمي گيريم :
)EMPLOYEE(E#,Ename,EMgr#
) nchar(5نعععام کارمنعععد بعععانوع داده اي درايعععن جعععدول #E ،شماره کارمنديبانوع داده اي ، Ename
داده اي (nchar(5مي باشد و کليد اصلي (nvarchar(50و #EMgrشماره کارمندي رئيس کارمندبانوع
فايل ،صفت خاصه #Eمي باشد و #EMgrراکليدخارجي که به #Eرجوع مي کند ،تعريف مي کنيم .
مثال :مي خواهيم تابعي به نام fn_FindReportsتعريف کنيم که مقدارپارامتر #INEرابه عنوان ورودي
دريافت کرده ويک جدول بانععام ، retFindReportsشامل شماره ونام کارمندان زيردست کارمند #INE
رادرکليه سطوح تاپايين ترين سطح رابرگرداند .توجه شودکه الگععوريتم مععذکوربه صععورت کلععي يععک الگععوريتم
بازگشتي مي باشد که به دليل عدم وجود امکانات بازگشتي در MS_SQLالگوريتم مذکورشبيه سازي شده است
.
Create function fn_FindReports (@INE# nchar(5))
RETURNS @retFindReports TABLE (E# nchar(5) primary key,
Ename nvarchar(50) NOT NULL,
EMgr# nchar(5) refrences EMPLOYEE(E#))
AS
BEGIN
تعريف مي کنيم، متغيري رابراي نگاه داشتن تعداد سطرهاي اضافه شده به جدول کمکي.
DECLARE @RowsAdded int
PROCESSED جدول يک فيلد به نام جدولي تعريف مي کنيم تا نتايج مياني تابع رادرآن نگاه داريم ودراين
. جداکنيم،تعريف مي کنيم تابدين وسيله بتوانيم سطرهاي پردازش شده راازسطرهاي جديدواردشده
DECLARE @reports TABLE (E# nchar(5) primary key,
Ename nvarchar(50) NOT NULL,
EMgr# nchar(5),
processed tinyint default 0)
، جدول ايجادشده رابادادن مشخصات مربوط به کارمندي که شماره مستخدمي آن به عنوان ورودي داده شده
توسط جدول مقداردهي اوليه مي کنيم. EMPLOYEE
INSERT @reports
SELECT E#, Ename, EMgr#,0
FROM employee
WHERE E# = @InE#
. مي شودset 1 درابتدابامقدارRowsAdded@
SET @RowsAdded = @@rowcount
کارهاي زيرراانجام بده، اضافه شده که زيردست هايش پيدانشده. @reports تاوقتي که کارمندجديدي در
جدول
WHILE @RowsAdded > 0
BEGIN
. کنset 1 هرکارمندي که قراراست زيردست هايش پيداشود رابامقدارprocessed فيلد
UPDATE @reports
SET processed = 1
WHERE processed = 0
. وارد کنreports دارد رادرجدول1 برابرprocessed زيردست هاي هرکارمندکه مشخصات
INSERT @reports
SELECT e.E#, e.Ename, e.EMgr#, 0
FROM employee e, @reports r
WHERE e.EMgr#=r.E# and e.EMgr# <> e.E# and r.processed = 1
بريز. @RowAdded @اضافه شده رادرمتغيرreports تعدادسطرهايي که جديدا به جدول
SET @RowsAdded = @@rowcount
کنset 2 کارمنداني که زيردستان آن ها پيداشده رابامقدارprocessed فيلد
UPDATE @reports
SET processed = 2
WHERE processed = 1
END
نتيجه نهايي رادرجدول خروجي تابع وارد کن
INSERT @retFindReports
SELECT E#, Ename, EMgr#
FROM @reports
RETURN
END
GO
دستورکار
جدول EMPLOYEEرابامشخصات گفته شده درقسمت پيش مطالعه ايجاد کرده وآن -1
راباداده مناسب پرنماييد .وسپس به سؤالت زيرپاسخ دهيد .
تابع مثال ارائه شده درقسمت پيش آگاهي را به کمک دستور selectوباشماره -2
کارمندي هاي مختلف ،احضار نموده ونتايج حاصله رابررسي نماييد .
يک تابع بنويسيد که شماره کارمندي يک کارمند راگرفته ونام رئيس ونام رئيس رئيس -3
کارمند رااستخراج نمايد .
تابعي بنويسيد که شماره کارمندي يک کارمند راگرفته ونام کارمنداني رااستخراج کند که -4
رئيس آن ها رئيس کارمندمذکورباشد ).يعني کارمنداني که رئيس مشترک دارند (.
يک تابع بنويسيد که شماره کارمندي کارمند را به عنوان ورودي گرفته ونام زيردستان -5
کارمندرادرسطح چهارم استخراج نمايد.
تابعي تعريف کنيد که شماره کارمندي يک کارمند راگرفته ونام رئيس کارمندرادرسطح -6
چهارم استخراج کند .
يک تابع بنويسيد که شماره کارمندي يک کارمند راگرفته ونام کليه رؤساي -7
کارمندمذکوررااستخراج نمايد .
آزمايش پنجم
معرفي ساختارهاي از زبان #Cکه در اين آزمايشگاه از آن ها استفاده شده است.
پيش مطالعه:
با توجه به آشنايي دانشجويان اين درس ،با زبان Cدر اين بحث تنها به معرفي مختصر ساختارهايي كه در
پياده سازي بخش " برنامه كاربردي " اين آزمايشگاه كاربرد دارند از زبان #Cمي پردازيم.
بخش 1
-1تعريف متغيرها :تعريف متغيرها در زبان #Cمانند زبان Cصورت مي گيرد مثال :
Float
m,n
-2تعريف ثابت هاي نمادين :ثوابت در زبان #Cنيز مانند زبان Cبا استفاده از define#تعريف مي
شوند .مثال:
define Myvalue#
100
double عبارتند از : پركاربرد در #C انواع داده اي برخي از انواع داده اي : -3
,bool,float,int,charمحدوده كاربرد اين انواع داده اي عينًا مانند زبان Cمي باشد .در #Cپيش وند
هاي Long , unsigned , Signedو Shortهمراه با بعضي از انواع داده اي بالقابل استفاده هستند
ل نوع داده اي charدر حالت عادي محدوده -127تا 127را شامل مي شود ولي unsigned .مث ً
ل متغير Long intمحدوده charمحدوده 0تا 256را در بر مي گيرد يا مث ً
– 21 47 48 36 47تا 21 47 48 36 47را مي پوشاند .از بررسي محدوده بقيه متغيرها به علت
نداشتن كاربرد در اين آزمايشگاه چشم مي پوشيم.
-4عملگر هاي زبان #Cمانند زبان Cعبارتند از:
محاسباتي- -,%,/,*,-,+,=:و++ •
رابطه اي=!,==,=<,=>,>,<: •
منطقي||,&&,!: •
در زبان #Cمي توان از عملگرهاي تركيبي = % =, / =,* =,− =,+مانند زبان Cاستفاده كرد.
براي مقدرا دهي اوليه به آرايه هاي چند بعدي مي توانيد از روش زير هم استفاده کنيد:
{Int [,] a=new int [2,3]{1,3,5,7,9,11
تعدادعناصرآرايه :تمامي آرايه از كلسي به نام Arrayارث مي برند .اين كلس خاصيتي به نام
Lengthدارد كه از آن مي توانيد براي تعيين تعدادعناصرآرايه استفاده كنيد.
مثال:
;Int l=a.Length
بعد از اين در lمقدار 6قرار مي گيرد.
در اين جا اين نكته را هم ذكر مي كنيم كه كلس Array 10متد مختلف را هم پياده كرده است .كه معمو ً
ل
با دستورات عادي قابل پياده سازي هستند يكي از پركاربردترين اين متدها ،متد Sortاست كه عناصر آرايه
را مرتب مي كند و نحوه كاربرد آن به شكل زير است.
:(Array . Sort (Array name
مثال:
:(Array.Sort (a1
اين نكته را نيز ياد آور مي شويم كه پارامتر اين تابع بايد يك آرايه تك بعدي باشد.
بخش چهارم:
كلس ها ،متدها و خصوصيات آنها در : #C
نوشتن متدهاي مربوط به كلس ها:
براي نوشتن متدها بايد نوع ،نام ،پارامترها و بدنه تابع مشخص شود.
(Private int getarg(int a,int b
}
;Int temp
;Temp (a+b)/2
;(Return (temp
{
-نوشتن متدهاي همنام ) : (overloadedتوابع يك كلس مي توانند همنام باشند ولي لزم است نوع
يا تعداد
پارامتر هاي آن ها جهت شناسايي در زمان احضار متفاوت باشععديعني ايععن توابععع پععارامتر هععاي متفععاوتي ) چععه
ازنظر نوع چه از نظر( تعداد دريافت كنند در اين صورت بععا تععوجه بععه پارامترهععاي هععايي كععه در زمععان اجععرا
استفاده مي شود به يكي از آن توابع ارجاع مي شود مثال :
(int findMax(int a,int b
}
(If(a>b
;(Return(a
else
;(Return(b
{
حال فرض كنيد درزمان اجرا find maxصدا زده شود در اين صورت در صورتي كه هر دو پارامتر آن از
نوع intبودند مقدار بازگشتي از نوع intو در صورتي كه هر دو پارامتر آن floatبودند مقدار بازگشتي
از نوع floatاست.
جنبه ديگري از نوشتن متدهاي همنام نوشتن متدهاي يكسان )با پارامترهاي يكسان ( در 2كلس است در
اين صورت اين توابع با توجه به نام كلسشان كه قبل از نام متد مي آيد مشخص مي شوند.اين جنبه از نوشععتن
توابع همنام را چند ريختي مي ناميم.
-نحوه ارسال آرگومان ها براي توابع :براي ارسال آرگومان ها به توابع عينًا مانند زبان Cعمل مي شود در
اين صورت ارسال پارامترها by valueخواهد بود يعني تغيير پارامتر ها در تابع هيچ تاثيري در آرگومان
هاي احضار نخواهد داشت .ولي اگر بخواهيم فراخواني by refernceباشد در اين صورت يكي از روش
هاي ممكن استفاده از كلمه كليدي Outاست :مثال :
(Private void Inc (out int x,out int y
}
;++X
;++Y
{
در صورتي كه ازكلمه كليدي outاستفاده شود حتي مي توان پارامتر هايي که از قبل مقدار دهي نشده اند را به
اين توابع فرستاد ومثل در ابتداي تابع آن ها را مقدار دهي كرديعني مي توان از آن ها به عنوان خروجي تابع
استفاده کرد.
مثال:
(Private void Initialize(out int x,out inty
}
; X=5
;Y=8
{
در هنگام ارسال پارامتر به متدهايي كه پارامترهايي با مشخصه outدارند بايد يك كلمه كليدي outرا نيز
ذكر كرد.
مث ً
ل
;Int x,y
(Initialize (out x,out y
نوشتن متدهايي با پارامترهاي از نوع آرايه :
نوشتن توابعي كه پارامترهاي از نوع آرايه دارند هيچ تفاوتي با نوشتن توابع معمولي ندارد .حتي اين
امكان وجود دارد كه قبل از نام تابع كلمه outرا ذكر مي كرد در اين صورت ارسال آرايه by reference
خواهد بود.
مثال فرض كنيد كه تابعي به شكل كلععي زيععر نوشععته ايععم كععه وظيفععه آن مرتععب کععردن آرايععه aدر محدوده بين
Fpoint,Spointو برگرداندن مقدار بزرگترين عنصر آرايه در اين محدوده است.
(Private int Myfunc (int[] a, int Spoint , int Fpoint
}
….
{
ل مي توان به شكل زير استفاده كرد. .اين تابع را مث ً
,Int Max
{int [ ] Array = new Array [8] :{8,4,4,14,13,2,1,0
(Max=My func(Array ,1,5
-نحوه ارث بري يك كلس از كلس ديگر :در زبان #Cنيز مانند زبان هاي ديگر شي گرا براي اين كه يك
كلس از كلس ديگر ارث ببرد .از عملگر :استفاده مي شود
فرض كنيد كلسي به نام Shapeتعريف كرده ايم در اين صورت كلس Triangleمي تواند از آن ارث
بععبرد و خصوصععيات ومتععدهاي مععورد نيععاز خععود را بععه آن اضععافه كنععد يععا حععتي خصوصععيات و متععدهاي كلس
Shapeرا باز نويسي كند.
در صورت ارث بردن يك كلس از كلس ديگر تمععامي متععدها وخصوصععيات Proteted , Publicكلس
پايه به كلس فرزند ارث مي رسد مثل اگععر كلس Shapeخصوصيتي به نام xleftouterpointداشته
باشد اين خصوصيت براي كلس Triangleهم قابل استفاده خواهد بود : .مث ً
ل
()Triangle MyTriangle= new Triangle
;MyTriangle .xleftouterpoint = 1
استفاده از كلمه كليدي newوبعدآوردن نام كلس موجب ايجاد يك شي جديد از يك كلس مي شود .و در
صورتي كه كلس سازنده اي داشته باشد آن سازنده هم صدا زده خواهد شد .در تعريف بال بعد از تعريف شععي
My MyTriangleازكلس Triangleمقدار خصوصيت xleftouterpointآن به Set، 1شده است.
-1شي فرم:
1-1خاصيت ها :
:Nameنام فرم است .دو فرم هم نام دريک پروژه :ontفونت پيش فرض به کار رفته در •
کنترل هايي که به فرم اضافه مي شوند را نشان مي دهد.
:AutoScrollMarginsبا اين خاصيت مي توان اندازه حاشيه هاي نوار جابجايي را •
تعيين کرد .اين خاصيت خود شامل دو خاصيت Widthو Heightاست.
:Autoscrollتعيين مي کند آيا اصل نوار جابجايي به فرم اضافه شود يا نه. •
:Locationمکان گوشه سمت چپ وبالي فرم در هر لحظه را تعيين مي کند .وخود شامل •
2خاصيت Xو Yاست.
:StartPositionمحل قرار گرفتن فرم را در هنگام لودشدن مشخص مي کند. •
:Enableتعيين مي کند که اطلعات فرستاده شده به فرم پردازش شود يا خير .اگر اين •
خاصيت Falseباشد فرم به هيچ رويدادي پاسخ نمي دهد.
:CancelButtonنمايانگرنام کليدي است که در صورتي که کاربر کليد Escرا روي فرم •
فشا ردهد معادل با فشار دادن آن کليد است و در نتيجه مجموعه دستورات معادل با رخ دادن رويداد
کليک روي آن کليد اجرا مي شود.
:Opacityميزان شفافيت فرم را تعيين مي کند. •
:RighttoLeftدر صورتي که اين خاصيت trueباشد اطلعات از راست به چپ نمايش •
داده مي شوند.
:Languageزبان مورد استفاده در فرم را تعيين مي کند. •
1-2رويدادهاي قابل رخ دادن درون يک فرم :
:Activatedاين رويداد با فعال شده فرم روي مي دهد. •
:Clickبا کليک کردن روي فرم رخ مي دهد. •
:DoubleClickبا کليک مضاعف روي فرم رخ مي دهد. •
:Closedبا بسته شدن فرم رخ مي دهد. •
:KeyPressبا فشردن هر کليد صفحه کليد اين رويداد رخ مي دهد.رويداد KeyPressبه •
صورت زير handleمي شود:
Privare voidنام کنترل_KeyPress(object
(sender,System,Windows.Forms.KeyPress EventArgs e
}
{
روشن است که پارامتر senderنمايانگرشي اطلع دهنده اين رويداد است.يکي از خواص
ساختار eنيز KeyCharاست که حاوي پرکاربرد
آن استفاده کرد. کاراکتر فشرده شده است .که مي توان در handleکردن رويداد از
Loadدر هنگام لود شدن فرم رخ مي دهد. •
1-3متدها
:Activateبراي فعال کردن فرم به کار مي رود.نحوه استفاده از آن در حالت برنا مه •
نويسي اين گونه است:
)(.Activate.ActiveFormنام فرم
ActiveFormفرم در حال اجراي برنامه جاري ر ا تعيين مي کند.
:Closeمنابع گرفته شده توسط فرم را آزاد مي کند و فرم را مي بندد .نحوه استفاده از آن •
در حالت برنا مه نويسي اين گونه است:
;)(.Close.ActiveFormنام فرم
:()Hideفرم را مخفي مي کند. •
:()Showکنترلي را که مخفي بوده است را نمايش مي دهد. •
:()Focusکنترل جاري را به فرم احضار کننده اين متد مي دهد. •
:()Refreshمحتويات فرم را Refreshمي کند. •
-2شي textbox
کاربرد اين شي معمول در گرفتن يک رشته از کاربر يا نمايش يک رشته به وي است.
2-1خاصيت ها :
:MaxLengthحداکثر طول متني که کابر مي تواند وار دکند را تعيين مي کند. •
:MultiLineقابليت اين که جعبه متن چندين سطر متن در يافت کند را تعيين مي کند. •
:ScrollBarsمي توان تعيين کر دکه آيا جعبه متن نوار جابجايي داشته با شد يا نه و نوع •
آن را تعيين کرد.
:ReadOnlyتعيين کننده اين خاصيت است که آيا ميتوان متن درون textBoxراتغيير داد •
يا نه.
:Anchorنشان دهنده مکان نمايش متن جعبه متن ،درون جعبه متن است وخواص خود را •
از AnchorStyalesمي گيرد.مثل اگر بخواهيم در حالت برنامه نويسي به ازاي حادث شدن رويداد
خاصي مکان نمايش را به بالي textBoxمنتقل کنيم کد زير را مي نويسيم :
;textBox1.Anchor=AnchorStyles.Top
2-2متدها:
:AppendTextاين متد رشته اي را به عنوان پارامتر در يا فت و آن را به انتهاي متن •
جعبه متن اضافه مي کند.
-3شي :Label
کليه خواص،متدهاورويدادهاي داراي کاربرد اين شي کنترلي در موارد قبلي توضيح داده شد .
-4شي :Button
کليه خواص،متدهاورويدادهاي داراي کاربرد اين شي کنترلي در موارد قبلي توضيح داده شد .
مثال:در اين جا به عنوان تمرين يکي از فرم هاي پروژه ثبت نام را توليد کنيم.
مثال:فرض کنيد مي خواهيم يکي از فرم هاي اين پروژه که براي درج نام يک دانشجوي جديد يا نمايش
اطلعات يک دانشجوي خاص به کار مي رود را توليد کنيم.شکل نهايي فرم شکل 3است.
براي ايجاد اين فرم قدم هاي زير را طي کنيد:
-1پروژه جديدي از نوع Windows Formباعنوان registrationايجاد کنيد.
-2خاصيت Textاشي Form1را به “فرم اطلعات دانشجو” تغييردهيد.
-3خاصيت RighttoLeftرا به yesتنظيم کنيد.
-4مي توانيد fontر انيز به مقدار دلخواه خود تغيير دهيد.
startPoition -5را با CenterScreenمقداردهي کنيد .
Language-6را با farsiمقدار دهي کنيد.
autoScroll -7ر ا trueکنيد تا در صورت نياز نوار جابجايي به فرمتان اضافه شود.
-8کنترل هاي label،textBoxو Buttonهاي نشان داده شده را به فرم اضافه کنيدو خواص font،Righ
ttoleftو textآن ها ر امقدار دهي کنيد.خاصيت متن جعبه متن) (textboxها رافعل با تهي مقدار
بدهيد.خاصيت ReadOnlyمربوط به Labelهاي معدل دانشجو ،مجموع واحد هاي پاس شده دانشجو،
مجموع واحد هاي ثبت نامي دانشجو را با trueمقدار دهي کنيد)چرا؟()راهنمايي :اين فيلد ها فيلد هايي هستند
که از فيلد هاي ديگر پايگاه داده محاسبه مي شوند(.
-9خاصيت Nameجعبه متن هاي موجود را بانام فيلد هاي متناظرشان در جدول STDمقدار دهي کنيد)به جاي
#sاز sNoاستفاده کنيد( مثلجعبه متني که در جلوي نا م دانشجو قرار دارد را Nameنام گذاري کنيد.اين
کار در کدنويسي ارتباط دادن فيلد هاي بانک اطلعاتي وجعبه متن ها را راحت تر مي کند.
-10چهار کليد موجود را به ترتيب btnAddو btnDeleteو btnUpdateو btnSearchنامگذاري
کنيد).اين روش يک روش استاندارد است(
حال به معرفي بقيه کنترل هاي مورد نياز مان مي پردازيم:
-5شي :checkBox
اين شي دو حالت فعال و غير فعال را به خود مي گيرد.
5-1خاصيت ها :
Checked:trueبودن اين خاصيت به معناي فعال بودن checkBoxاست. •
2-2رويدادها:
:Checkedchangedوقتي خاصيت checkedتغيير کند اين رويداد رخ مي دهد. •
-6شي :radioButton
اين کنترل نيز خواص checkBoxهارا دارد.مهم ترين کاربرد آن ها به وجود آوردن حالت هاي مختلفي از
تاييد شدن يا نشد ن گزينه هاست.
-7شي :groupBox
براي کنار هم گذاشتن چند کنترل)مثل چند (radioButtonبه کار مي رود.در اين صورت تنها اجازه انتخاب
يکي از اين کنترل ها به کاربر داده مي شود.
-8شي :listBox
اين کنترل براي نگهداري ليستي از اشياء مثل نام دانشجويان کاربرد دارد.
8-1خاصيت ها :
:Itemsبا استفاده از اين خاصيت مي توان ليست گزينه هايي که در listBoxبايد ظاهر •
شوند را تعيين کرد.
:MultiColumnتعيين مي کند که کنترل مي تواند چند ستون داشته باشد يا نه. •
:Datasourceدر صورت لزوم نام منبع داده اي که مي خواهيم گزينه هاي listBoxاز •
آن تعيين شود را تعيين مي کند.منابع داده اي را در آزمايش بعدي مفصل بحث خواهيم کرد.
:Sortedتعيين مي کند که گزينه هاي ListBoxمرتب شده باشد يا خير. •
:SelectedIndexانديس گزينه اي که بايد انتخاب شود را تعيين مي کند.اين انديس گذاري •
از صفر شروع مي شود.
:SelectedValueمقداري را تعيين مي کند که گزينه مربوط به آن بايد انتخاب شود. •
8-2رويدادها :
:DatasourceChangedاين رويداد در صورت تغيير Datasourceروي مي دهد. •
رويدادهاي SelectedIndexChangedو :SelectedValueChangedبه ترتيب •
هنگامي رخ مي دهند که خواص SelectedIndexو SelectedValueتغيير کند.
8-3متدها :
:Clearتمام گزينه هاي کنترل را حذف مي کند.به عنوان مثال دستور زير تمامي گزينه هاي •
myListBoxرا حذف مي کند.
;()myListBox.items.Clear
:Addبراي اضافه کردن يک گزينه به انتهاي ليست عناصر listBoxبه کار مي رود •
;)"بروجرد"(citiesListBox.items.Add
• :Insertمشابه Addعمل مي کند با اين تفاوت که دو پارامتر دريافت مي کند و پارامتر دوم را در
موقعيت تعيين شده بوسيله پارامتر اول درج مي کندوعناصر بعدي را به سمت پايين شيفت مي دهد.
;)" آبادان"citiesListBox.items.Insert(3,
:Countتعداد عناصر listBoxرا بر مي گرداند. •
;Int citiesCount
;()citiesCount= citiesListBox.items.Count
:Removeمفداري را دريافت و گزينه مر بوط به آن مقدار را از listBoxحذف مي کند. •
:RemoveAtعملکردي مشابه Removeدارد با اين تفاوت که به جاي مفدار شماره •
انديسي را در يافت و گزينه مر بوط به آن را حذف مي کند.به عنوا ن مثال 2دستور صفحه بعد
معادلند:
;)"آبادان"(citiesListbox.items.Remove
citiesListbox.items.Removeat ;)(3
يا
کند و انديس آن ر ادر listBoxبرمي گرداند. :IndexOfمقداري را در يافت مي •
;Int myIndex
;)""يزد"(myIndex=Cities.items.IndexOf
-9شي :dateTimePicker
اين شي بهترين کنترل جهت دريافت ونمايش فرمت هاي تاريخي است مهمترين خصوصيت اين شي خاصيت
valueاست که نمايانگر تاريخ اين کنترل است .
تا اين جا تمامي کنترل هايي که به آن ها نياز داريم)جز DataGridکه در آزمايش بعدي و بعد از معرفي
datasourceها بررسي مي شود(را بررسي کرديم .احتمال اگر تا به حال از اين کنترل ها استفاده
نکرده باشيداين سوال براي شما مطرح است که ارتباط بين متد ها ،رويدادها و صفات چگونه برقرار مي
شود.
مثال:مي خواهيم تغييرات کوچکي در فرم اطلعات دانشجو بدهيم.
Sex textBox .1را حذف کنيد و يک groupBoxبا نام Sexرا جايگزين آن کنيدوفيلد
textآن را با تهي مقدار دهي کنيد.
.2داخل اين groupBoxدو radioButtonبانام هاي maleو femaleقرار دهيد و
textآن ها را "مرد"",زن"مقدار دهي کنيد.
سوال :در حال حاضر خاصيت righttoleftاين groupBoxچه مقداري دارد؟چرا؟
)راهنمايي:دقت کنيد کنترل هاي داخل يک فرم خصوصيات مشترک خود را از کلس فرم به
ارث مي برند(.
birthday textBox .3را حذف کرده آن را با يک dateTimePickerجايگزين کنيد
ونام آن را birthDateاختيار کنيدdropDownAlign .اين کنترل را rightانتخاب کنيد.
در اين جا فرم را به شکل نهايي آن آماد ه کرده ايم حال براي اين که روي رويدادها هم کمي تمرين کرده
باشيم بهتر است برخي از رويداده اي اين فرم ر ا Handleکنيم.قبل از آن چون در قسمت بعدي براي اطمينععان
از حاصل کارمان از شي MessageBoxاستفاده مي کنيم ابتدا به معرفي اين شي مي پردازيم.
مهم ترين متد اين شي متد ()Showاست که يک جعبه پيا م را روي صفحه نمايش نشان مي دهد .يکي از
روش هاي صدا زدن اين متد به اين شکل است که آن را با چهار پارامتر احضار مي کنيم که پارامتر اول پيغام
مورد نظر را تعيين مي کند.پارامتر دوم متن عنوان جعبه پيام ر اتعيين مي کند .پارامتر سععوم نععوع کليععد هععايي
که مي خواهيم روس MessageBoxقرار گيرد را نمايش مي دهد .پععارامتر چهععارم نيععز Iconمشععخص شععده
روي جعبه پيام را معين مي کند.
اين تابع مقداري از نوع داده اي DialogResultبر مي گرداندکه مي توانيم با مقايسه مقدار خروجي
اين تابع با انواع داده اي DialogResultdاز عکس العمل کار بر در قبال MessageBoxآگاه شويم.
مثال:
ِDialogResult Key=MessageBox.Show(“The source Record have been
Modified Do You want to save?”,”Save
;(Alert”,MessageBoxButtons.YesNo,MessageBoxIcon.Question
(Bool e=(Key==DialogResult.Yes
بعد از اجراي کد بالجعبه پيامي به شکل زير نمايش داده ميشود بعد از انتخاب توسط کاربر ،برنامه نويس مي
تواند با استفاده از متغير بولين eتصميم گيري کند.
شکل 2
حال مي خواهيم رويداد لود شدن "فرم اطلعات دانشجو"را تعريف کنيم مثل بخواهيم بلفاصله بعد از لود شدن
اين فرم رنگ کليد هاي btnAddو btnDelateعوض شودو يک MessageBoxهم لود شدن اين فرم را
اعلم کند.بنابراين به سراغ بلوک کد Handleکننده اين فرم مي رويم و کدکد هاي زير را جايگزين مي
کنيم :
(Private void stdForm_load(Object Sender,System.EventArgs e
}
;btnAdd.BackColor=System.Drawing.Color.Yellow
;btnDelete.Backcolor= System.Drawing.Color.Tan
فرم اطلعات دانشجو لود شده“(MessageBox.Show
”,”Alert”,MessageBox.Buttons.Ok,است ;)MessageBoxIcon.Warning
} شکل 3
دستور کار:
پروژه جديدي از نوع Windows Applicationتعريف کنيد.اين فرم ،فرم اصلي پروژه .1
با نام mainخواهد بود.کليد هايي که در فرم نشان داده شده را به آن اضافه کنيدوخصوصيات آن را
مانند شکل زير تنظيم کنيد.
شکل 4
فرم زير را طراحي و به پروزتان اضافه کنيد.نام اين فرم Searchخواهد بود. .3
شکل 5
فرمي با نام Crsرا به شکل زير طراحي و به پروژتان اضافه کنيد . .4
:
شکل 6
در فرم Crsجعبه هايي که با نام listBoxنشان داده شده اند را از نوع listBoxبگيريد.براي
listBoxي که در جلوي ِ" Labelنوع درس"قرار دارد دو آيتِم " تئوري" و "عملي"را اضافه کنيد.
فرمي با نام coPrAddرا با طراحي زير ،به پروژتان اضافه کنيد: .5
شکل 7
شکل 8
فرم زير را به پروژه ثبت نام اضافه کنيد.نام اين فرم crsRegistrationخواهد بود. .7
شکل 9
دقت کنيد که در اين فرم جعبه جلوي ِ"labelشماره ترم" از نوع listBoxاست.
اولين فرم صفحه بعد را با نام courseMarkingبه پروژه اضافه کنيد. .8
شکل 10
کنترلي که در وسط فرم قرار دارد يک dataGridاست که در جلسه بعدآن را پر خواهيم کرد.
آخرين فرم پروژه را با نام trmCoursesبه فرم اضافه کنيد.اين فرم در شکل 11نشان .9
داده شده است.
11 شکل
DataAdapter
DataSet
Command
Connecti
on
استفاده
کننده ها
از
DataReader داده هاي
پايگاه داده
DataTable
DataRelatio
n
DataView
DataColum
Datarow n
معرفي شي :Connection
اين شي براي برقراري اتصال با پايگاه داده استفاده مي شود.اين شي از يک رشععته) (stringبراي اتصال با
پايگاه داده استفاده مي کند.دو متد پر کععاربرد آن نيععز ()openو ()closeهستند که براي باز و بسته کردن
اتصال به کار مي روند.
اوليعععن قعععدم در اسعععتفاده از يعععک پايگعععاه داده ايجعععاد ارتبعععاط بعععا آن پايگعععاه داده ودر حيعععن ايعععن عمعععل تعييعععن
DataProviderبراي اين ارتباط اسععتDataProvider.ي کععه بععراي ارتبععاط بععا پايگععاه داده هععاي از نععوع
SQL-Serverدرنظر گرفته شده اسععت در نامکععده System.Data.SqlClientقععرار دارد.پععس اوليععن قععدم
براي ايجاد Connectionاضافه کردن اين دو نامکده با استفاده از عبارات زيربه برنامه است.
;using System.Data
;using System.Data.Sqlclient
تعريف :Connection
فرم اطلعات دانشجو) (stdرا لود کنيد.در جعبه ToolBoxگزينه)تب( Dataراانتخاب کنيد.و از ايععن گزينععه
يک شي Connectionرابه فرم خود اضافه کنيد .براي تنظيم خصوصيات اين Connectionبه سراغ
پنجره Propertiesبرويدوخصوصيت ConnectionStringآن را به روش زير تنظيم کنيد.
Newconnectionرا انتخاب کنيد و فيلد هاي پنجره DataLinkPropertiesرا با تععوجه بععه اتصععالي کععه
مي خواهيد داشته باشععيد تنظيععم کنيععد.در ايععن جععا پايگععاه داده registrationراانتخععاب کردهبعععد از تسععت ايععن
، Connectionبه کمک گزينه Test Connection،DataLinkPropertiesرا تاييد کنيد .نام اين
اتصعععال بعععه صعععورت پيعععش فعععرض sqlConnection1بعععوده و قابعععل تغييعععر معععي باشعععد.خصوصعععيت
ConnectionStringآن با عبارتي مشابه عبارت زير مقدار دهي شده است:
workstation id=)DBLAB);packet size=4096;integrated security=SSPI;initial
catalog=registration;persist security info=False
با اين موضوع که اين مقدار چگونه بدست مي آيد کاري نداريم و هر بار براي اتصال حتي در مد کد نويسي از
هميععن روش ميتوانيععد اسععتفاده کنيععد و مثل بعععد از بدسععت آوردن ايععن مقععدار بااسععتفاده از کپععي کععردن هميععن
مقدارواسععععتفاده ازآن در برنععععامه يتععععان مععععي توانيععععد خصيصععععه ي ConnectionStringمربععععوط بععععه
Connectionرامقدار دهي کنيد.حال کافي اسععت ايععن Connectionرا بععاز کنيععم.بععراي ايععن کارکععافي اسععت
مثلدر هنگام لود شدن فرم)روي دادن رويداد (std_Loadمتد ()openاين Connectionرا با عبارت
زيرصدا بزنيم.
)private void std_Load(object sender, System.EventArgs e
{
;)(sqlConnection1.Open
{
مي توانستيد حتي تعريف اين Connectionرا در مد کد نويسي انجام دهيد.براي اين کار بعد از کپي کردن
مقدار ConnectionStringمععي توانيععدارتباط موجععوِد sqlConnection1را حذف کنيد و قطعه کدهاي
زيررا جايگزين کنيد:
)private void std_Load(object sender, System.EventArgs e
{
string mySqlConnectionStr="workstation id=(Local);packet
size=4096;integrated security=SSPI;initial
;"catalog=registration;persist security info=False
;)(SqlConnection mySqlConnection1 = new SqlConnection
;mySqlConnection1.ConnectionString=mySqlConnectionStr
;)(mySqlConnection1.Open
{
دريک ConnectionString،Workstataion idنام کامپيوتري است که سرويس دهنععده مععورد نظععر مععا
براي اتصال روي آن قرار دارد.
معرفي اشياء DataCommandو :DataReader
:DataCommand-1همان گونه که از نامش پيداست اين شي براي فرستادن تقاضاي اجراي دستورات Sql
يا رويه هاي ذخيره شده در پايگاه داده ها به کار مي رود.ايععن شععي بععراي اجععراي بعضععي از دسععتورات Sqlاز
قبيل Select، Insert، Deleteو Updateکردن اطلعات و احضار رويه ها استفاده مي شود.ايععن شععي
رادر صورت نياز تنها با کمک شي Connectionو بدون کمک گرفتن از هر شي ديگععري مععي تععوان بععراي
اجراي دشتوراتي که از آن ها انتظار خروجي نداريم يا خروجي فقط يک مقدار مشخص مي باشععد اسععتفاده کععرد
مانند دستورات بهنگام سازي داده ها،اجراي دسععتورات DDLيععا بععه صععورت کلععي اجععراي دسععتوراتي کععه نععتيجه
برگشتي با بيش از يک سطر يا ستون ندارند.
اما وقتي خروجي يک ، DataCommandبيش از يک سطر يا ستون مي باشد نياز به شي
DataReaderحععس مععي شععود.شععي DataReaderجريععاني فقععط خوانععدني وفقععط رو بععه جلععواز نععتيجه يععک
DataCommandرا فراهععم مععي کنععد.در واقععع بععا اسععتفاده از DataReaderمععي تععوان روي نتععايجي کععه
،DataCommandآن هععا را Fetchمععي کنععدحرکت کععرد.پععس DataReaderدر واقععع بععه کمععک شععي
DataCommandمعنععاي واقعععي خععود را پيععدا مععي کنععد)بايععد جععدولي از نتايععج وجععود داشععته باشععد تععا
DataReaderدر بين آن ها حرکت کند(
ايجاد DataCommandو :DataReader
DataCommandها را مي توان در زمان طراحي فرم ها يا در زمان اجرا بوسععيله کععدهايي کععه نوشععته مععي
شععععود ايجععععاد کععععرد ولععععي ايجاديععععک DataReaderهاتنهععععا در زمععععان اجععععرا و بععععا اسععععتفاده از متععععد
ExecuteReaderازکلس DataCommandصععععععورت مععععععي گيععععععرد.تععععععوجه شععععععود کععععععه شععععععي
DataReaderسازنده اي ندارد.معني اين بحث بععه صععورت خلصععه ايععن اسععت کععه DataReaderتنهععا در
زمان کدنويسي مقدار دهي اوليه مي شود.
براي اضافه کردن يک Commandاز طريق Net Enviroment.مي توانيد از گزينه)تععب( Dataيک
sqlCommandبععه فععرم اضععافه کنيععد.سععپس بايععد اگععر Connectionهععاي بععه ثبععت رسععيده اي داريععد
Connectionمععورد نظععر خععود را بععه عنععوان خصوصععيت Connectionاين SqlCommandتعريععف
کنيععععد .سععععپس خصوصععععيات CommandTextو CommandTypeايععععن sqlCommandراتنظيععععم
کنيععد.خصوصععيت CommandTypeاز يک sqlCommandنشععان دهنععده نععوع دسععتوري اسععت کععه در
CommandTextوجود دارد.دو مقدار مهمي که اين متغير مي گيرد عبارتند از:
:Text-1نمايانگر اين مطلب است که اين Commandحاوي يک دستور متني Sqlاست.
:StoredProcedure-2نمايانگر اين است اين Commandبراي احضار يععک StoredProcedureبععه
کار مي رود.
مقدار پيش فرض اين متغير Textاست.
ولععي مععااز کدنويسععي بععراي ايجاديععک DataCommandاسععتفاده مععي کنيععم.فععرض کنيععم مععي خععواهيم ايجععاد
DataCommandدر زمان بارشدن فرم صورت گيرد ،بنابراين کد هاي زير را جايگزين کنيد:
)private void std_Load(object sender, System.EventArgs e
{
string mySqlConnectionStr = "workstation id=(Local);packet
size=4096;integrated security=SSPI;initial catalog=registration;persist
;"security info=False
;"string mySqlQuery = "select * from reg where s#=8014681
;)(SqlConnection mySqlConnection = new SqlConnection
;mySqlConnection.ConnectionString=mySqlConnectionStr
;)(mySqlConnection.Open
;)(SqlCommand mySqlCommand = new SqlCommand
;mySqlCommand.Connection=mySqlConnection
;mySqlCommand.CommandText=mySqlQuery
;()SqlDataReader myDataReader1 = mySqlCommand.ExecuteReader
{
در خط آخععر ديععده مععي شععود کععه بععراي مقععدار دهععي يععک DataReaderاز متد ExecuteReaderdيععک
Commandاستفاده شده است واين شي هيچ سازنده اي ندارد.اما بايد بععراي اسععتفاده از اطلعععات موجععود در
DataReaderکد هايي نوشته شود .قبل از نوشتن کد ها لزم است DataCommandو
DataReaderرادر حد استفاده در آزمايشگاه بيشتر بررسي کنيم .
مهم ترين متد هاي شي Commandعبارتند از:
:()ExecuteNonQuery .1با احضار اين متداين شي ) ، (Commandدستور موجوددر
Textخودرا اجرا مي کند و تعدادسطر هايي که تحت تاثير قرارميگيرند را برمي گرداند.کععاربرد ايععن
متد وقتي است که از رويه ذخيره شده يا دستور Sqlاجرا شده انتظار خروجي نداشته باشيم .
:()ExecuteReader .2اين متد Commandtextرااجعععرا کعععرده ونعععتيجه ر ادر يعععک
Datareaderبرمي گرداند.کاربرد آن در دستورات Sqlياروي رويه هايي است که چندين سععطر را
بر مي گردانند.
ExecuteScalar():Query .3رااجرا کرده اولين ستون از اوليععن سععطر مجمععوعه نتايععج را
بر مي گرداند.کاربرد آن در اجراي رويه ها يا دستورات Sqlاي است که تنها يععک مقععدار را بععر مععي
گردانند.
متد هاي مهم يک DataReaderدر زير ليست شده اند:
Close():DataReaderرا مي بندد. .1
:()GetNameنام يک ستون را بر مي گرداند. .2
:()IsDbNull .3نمايانگر اين است که آيا اين ستون مقدار Nullدر خود دارد يا نععه.بععر حسععب
اين که مقدار فيلدي که به آن اشاره مي شود Nullياغير Nullباشععديکي از مقععادير Trueيععا Falseرا
برمي گرداند.
:()Gettype .4از اين متد مي توان براي بدست آوردن مقدار يک ستون بر حسب يک نوع
داده اي دلخععععواه اسععععتفاده کععععرد.چنععععد نمععععونه از سععععاختار هععععاي مهععععم ايععععن متععععد عبارتنععععد از:
GetString,GetInt32,GetFloat,GetDecimal
Read():DataReader .5را به سطر بعدي از مجموعه نتايج پيش مي برد .وقتي
DataReaderباز شد کرسر DataReaderقبل از اولين سطر است و بنابراين براي رسيدن به
سطر اول هم يک فراخواني متد ()Readلزم است.
NextResult():DataReader .6را به نتيجه بعدي از جواب ها پيش مععي بععرد.کععاربرد آن
وقعععتي اسعععت کعععه دسعععتور Sqlيعععا رويعععه ي اجعععرا شعععده چنعععدين مجمعععوعه جعععواب )مثلبعععا چنعععدين
(selectبرگرداند.
دقت کنيد که DataReaderدر هر لحظه تنها روي يک سطر داده ها ايستاده است.
مثال:فرض کنيدجعبه ليستي با نام myListBoxداريم که مي خواهيم آن را با مقادير نام و نام خانوادگي
دانشجويان پر کنيم .قطعه کد زير اين کار را انجام مي دهد).اين مثال از اشياء تعريف شده در مثععال هععاي قبلععي
بهره مي برد(
;)(SqlDataReader myDataReader= mySqlCommand.ExecuteReader
))(while( myDataReader.Read
listBox1.Items.Add(myDataReader.GetString(1)+' '+
;))myDataReader.GetString(2
دقت کنيدچون انديس ستون ها از صفر شروع مي شود (myDataReader.GetString(1براي اسععتخراج
سععتون نععام سععطر جععاري DataReaderبععه کععار مععي رود (myDataReader.GetInt32(0).به شماره
دانشجويي اشاره مي کند(
دراين جابه مطلب مهميتوجه مي کنيم .تا اين جا ما ميتوانيم هر نوع درخواستي را اجرا کنيم ،جز اين که
در خواست ما شامل يک يا چند پارامتر باشد)مثل درخواست مشخصات دانشععجويي کععه شععماره دانشععجويي وي
در يک textBoxتوسط کار بر داده مي شععود.حععال سععوال ايععن جاسععت کععه چگععونه بايععد مقععدار موجععود درايععن
textBoxرا به عنوان پارامتر در درخواستي که به سرور توسط دسععتورات T-Sqlمععي فرسععتيم جععاي داد؟(دو
روش براي پاسخ دادن به اين سوال وجود دارد.روش اول اين است که :ابتععدا در خواسععت مععورد نظرمععان رابععه
صورت پارامتري در خاصيت CommandTextيک DataCommandقععرار بععدهيم.يکععي از مهععم تريععن
خععواص يععک DataCommandکععه ذکععر آن را بععه ايععن جععا موکععول کرديععم خاصععيت مجمععو عععه اي
Parametersاست.اين مجمو عه مي تواند شامل مجمو عه اي از پارامتر ها باشععد کععه پععارامتر هععايي کععه در
در خواست ها پاس مي شوند درون آن قرار مي گيرند.
استفاده از پارامتر ها در درخواست هاخيلي ساده است کافي است ابتدااين پارامتر ها را در درخواستهايي
که مي فرستيد مشخص کنيد.حالبايد اين پارامتر ها در مجموعه پارامتر هاي Commandاضافه کنيععد.بعععد از
اين مرحله بايد پارامتر ها را مقدار دهي کنيد.
در اين جا به سراغ بررسي اولين عمل يعني نحوه مشخص کردن پارامتر ها در درخواست مي رويم
.دستوراتي که از پايگاه داده هاي از نوع )SQL-Serverو نه انواع ديگرپايگاه داده ( استفاده مي کنند براي
اين کار از پارامتر هاي نامدار که با @شروع مي شوند استفاده مي کنند.
مثال:
mySqlCommand1.CommandText=”select * from Reg where
;”Trmno=@myTrmno
مشخص کرديم که در اين دستور Trmnoيک پارامتر است که بعدا به وسيله پارامتر ها پاس خوب در اين جا
مي شود.
اما براي اضافه کردن پارامتر ها به مجموعه پارامتر هاي يک Commandمتد هاي زير در اختيار
برنامه نويس است .اين متد ها جزو مجموعه Parametersاز هر SqlCommandهستند.
:(Add(parameterName,parameterValueيک پارامتر را با مقدار .1
parameterValueبه انتهاي مجموعه پارامتر ها ي Commandاضافه مي کند.
َ :(Add(parameterName,parameterType,paremeterSizeپارامتري از .2
نوع paremeterTypeو اندازهparemeterSizeرا به انتهاي مجموعه پارامتر ها اضععافه مععي
کند.پارامتر سوم در نوع داده هاي مثل intکاربرد دارد که مثل در اين موارد پارامتر سوم چند رقمععي
بودن عدد را مشخص مي کند.
َ:(Add(parameterName,parameterTypeمشابه مورد قبل است و کاربرد آن .3
در مواردي است که نيازي بععه پععاس کععردن پععارامتر سععوم نيسععت ونععوع پععارامتر بععر حععس نععوع تبععديل
مشخص مي گردد.
:(Insert(parameter Index,parameterValueپارامتري جديد را که مقدار آن .4
برابر با parameterValueاست را در موقعيتي برابر با parameter Indexدرج مي کند.
انديس موجود در پارامتر :(RemoveAt(parameterIndex .5
parameterIndexازمجموعه پارامتر هاي Commandرا حذف مي کند.
مثال:
mySqlCommand.Parameters.Add(“@myTrmno”,System.Data.SqlDBType.cha
;(r,4
دردستورفوق@myTrmnoرابانوع داده اي تعريف شده به عنوان اوليععن پععارامتر mySqlCommandدرج
کرده ايم.
مجموعه System.Data.SqlDBTypeنيز حاوي انواع داده اي موجود در SQL-Serverاست.
براي مقدار دهي اين پارامتر هانيز کافي است از دستوراتي به شکل زير استفاده کنيد:
;’mySqlCommand.Parameters[“@myTrmno”].Value=’3831
مثال:1فرض کنيد مي خواهيم متدي بنويسيم که يک شماره دانشجويي ويک شماره ترم ر ابه عنوان پارامتر
بگيرد و تمام رکوردهاي موجود براي اين شمار ه دانشجويي در ترم مذکور را در فايل ثبت نام را حذف کند.
در اين مثال درخواستي که براي پايگاه داده فرسععتاده مععي شععود نععتيجه خروجععي نععدارد بنععابر ايععن مععي تععوانيم از
SqlCommandکمک بگيريم: DataReaderاستفاده نکنيم وتنها از
)private void reg_del(int snum,string termnum
{
string mySqlConnectionStr = "workstation id=[Local];packet
size=4096;integrated security=SSPI;initial
;"catalog=registration;persist security info=False
string mySqlQuery = "delete * from Reg where s#=@snum and
trmno=@termnum";
SqlConnection mySqlConnection = new SqlConnection();
mySqlConnection.ConnectionString=mySqlConnectionStr;
mySqlConnection.Open();
SqlCommand mySqlCommand = new SqlCommand();
mySqlCommand.Connection=mySqlConnection;
mySqlCommand.CommandText=mySqlQuery;
mySqlCommand.Parameters.Add("@snum",
System.Data.SqlDbType.Int,7);
my
SqlCommand.Parameters.Add(“@termnum”,System.Data.SqlDbType.char,4)
;
mySqlCommand1.Parameters["@snum"].Value=snum;
// or you can code mySqlCommand1.Parameters[0].value=snum
my Sql Command.Parameters.[“@termnum”].Value=termnum;
mySqlCommand1.ExecuteNonQuery();
mySqlConnection1.Close();
در اين مثال تابعي مي نويسم که تعداد دانشجوياني که معدل کلExecuteScalar براي آشنايي با متد:2مثال
آن ها دريک ترم مشخص که شماره آن ترم)يک مقدار رشته اي( به عنوان پارامتر براي اين تابع پاس مي
. مي باشدرا بر گرداند17 شود بالتر از
private void int reg_del(string termnum)
{
string mySqlConnectionStr = "workstation id=[Local];packet
size=4096;integrated
security=SSPI;initial catalog=registration;persist security
info=False";
int myResult;
string mySqlQuery = "select count(*) from (select distinct s# form
stdtrm”+
“where trmgpa>17 and trmno=@termnum”
SqlConnection mySqlConnection = new SqlConnection();
mySqlConnection.ConnectionString=mySqlConnectionStr;
mySqlConnection.Open();
SqlCommand mySqlCommand = new SqlCommand();
mySqlCommand.Connection=mySqlConnection;
mySqlCommand.CommandText=mySqlQuery;
my
SqlCommand.Parameters.Add(“@termnum”,System.Data.SqlDbType.char,4)
;
my Sql Command.Parameters.[“@termnum”].Value=termnum;
myResult = mySqlCommand1.ExecuteScalar();
mySqlConnection.Close();
return myResult;
{
براي بررسي تقاضاي اجراي دسععتوري کععه نععتيجه خروجععي آن بيععش از يععک رکععورد باشععد متععدي:3مثال
std براي کلس فرم
کععه شععيئي از کلس فععرمmyStdمي نويسيم که يک شماره دانشجويي را به عنوان پارامتر در يافت کند وشي
)البته پياده سازي اين تابع به روش ساده تري هم امکان پععذير.است را با اطلعات دانشجوي مذکور پر کندstd
(است که با توجه به هدف آموزشي اين مثال به روش زير آن را پياده سازي مي کنيم
private void int reg_del(int snum)
{
string mySqlConnectionStr =...
string mySqlQuery1 = "select * from std”;
/ S#, Name,Family,Field,Sex
,Totpassunit,Totregunit,Gpa,Address,Citycode, Telno,
Ssno,Birthdate
SqlConnection mySqlConnection1 = new SqlConnection();
mySqlConnection1.ConnectionString=mySqlConnectionStr;
mySqlConnection1.Open();
SqlCommand mySqlCommand1 = new SqlCommand();
mySqlCommand1.Connection=mySqlConnection1;
mySqlCommand1.CommandText=mySqlQuery1;
SqlDataReader mySqlDataReader1 =
mySqlCommand1.ExecuteReader();
while ( mySqlDataReader1.Read())
{
If (mySqlDataReader1.GetInt32(0)=snum)
{
myStd.Snum.text=mySqlDataReader1.GetString(0);
myStd.Name.text=mySqlDataReader1.GetString(1);
myStd.Family.text=mySqlDataReader1.GetString(2);
…...
}
}
mySqlDataReader1.Close();
mySqlConnection1.Close();
}
در اين مثال قطعه کدي نوشته مي شود که نحوه تقاضععاي اجععراي يععک رويععه ذخيععره شععده رانشععان مععي:4مثال
_که شماره يکTrmGpa PR اين رويه همان اولين رويه اي است که در آزمايش سوم نوشتيديعني رويه.دهد
اين رويععه را بععا پععارامتر.دانشجو و شماره ترم رادريافت نموده و معدل ترم دانشجو را محاسبه و برمي گرداند
مععر بععوط بععه شععيtext احضار مي کنيم وخاصيت3821 و ترم8017062 هععاي شععماره دانشععجويي
.ر ابا خروجي اين رويه مقدار دهي مي کنيمLabel1
string mySqlConnectionStr =...
SqlConnection mySqlConnection1 = new SqlConnection();
mySqlConnection1.ConnectionString=mySqlConnectionStr;
mySqlConnection1.Open();
SqlCommand mySqlCommand1 = new SqlCommand();
mySqlCommand1.Connection=mySqlConnection1;
mySqlCommand1.CommandType=System.Data.CommandType.Stor
edProcedure;
mySqlCommand1.CommandText=”CR_TrmGpa”;
mySqlCommand1.Parameters.Add("@snum",
System.Data.SqlDbType.Int,7);
my
SqlCommand.Parameters.Add(“@termnum”,System.Data.SqlDbType.char,4)
;
mySqlCommand1.Parameters["@snum"].Value=8017062;
mySql Command.Parameters.[“@termnum”].Value=”3821”;
SqlDataReader mySqlDataReader1= cmd.ExecuteReader()
If (mySqlDataReader1.Read())
label1.text=mySqlDataReader.Getstring(0);
else
Label1.Text=("No Record found")
;)(mySqlDataReader.Close
;)(mySqlConnection1.Close
تعريف DataAdapterها:
براي تعريف DataAdapterها مي توا ن از روش هاي متفاوتي در مد کدنويسي استفاده کرد .
مثال: .1
String strConn = "Server=(Local);Database=registration;integrated
";security=true
;)(SqlConnection cn = new SqlConnection
;Cn.ConnectionString = strConn
;SqlDataAdapter myStdDA,myRegDA
)myStdDA = New SqlDataAdapter("SELECT * FROM Std", cn
)myRegDA = New SqlDataAdapter("SELECT * FROM Reg", cn
مي بينيد که در يکي از شکل هاي استفاده از سازنده يک SqlDataAdapterمي توان دستور
DataAdapterرا بععععععه عنععععععوان پععععععارامتر اول وConnectionاي کععععععه آن selectآن
DataAdapterاز آن استفاده مي کند ر ابه عنوا ن پارامتر دوم به سازنده پاس کرد .
دقت کنيد که اين دستور Selectنماينده مجموعه نتايجي است که يک DataAdapterبر مي گرداند)به شکل
يک جدول(که مي توان آن را در يک DataSetذخيره کرد.
مي توان ازيک DataComandهم کمک گرفت : .2
مثال:
String strConn = "Server=(Local);Database=registration;integrated
";security=true
;)(SqlConnection cn = new SqlConnection
;Cn.ConnectionString = strConn
;"String strSQL = "SELECT Name,Family FROM Std
;)SqlCommand cmd = new SqlCommand(strSQL, cn
SqlDataAdapter myStdDA=new
;(SqlDataAdapter(cmd
در اين حالت DataAdapterحاوي مقادير حاصل از اجراي دستورات موجود در CommandTextاست.
پر کردن يک DataSetبوسيله :DataAdapter
مثال:قطعه کد قبلي را در نظر بگيريدحال يک DataSetتعريف مي کنيم و آن را پر مي کنيم:
;)(DataSet() ds = new DataSet
;)myStdDA.Fill(ds
سپس مثل براي استفاده از اين DataSetبه نحو زير عمل ميکنيم .فرض کنيد يک DataGridبا نام
DataGrid1در سطح فرم داريم:
;DataGrid1.DataSource = ds
;"DataGrid1.DataMember = "Table
DataGridبايد بععا نععام جععدولي از DataSetکععه مععي خععواهيم
گفتيم که خصوصيت DataMemberاز يک
توسط DataSetنمايش داده شود Setشود.
نکته مهمي که براي مشخص کردن جداول موجود دريک DataSetبه عنوان منابع داده اي وجود دارد اين
است که اگر براي جداولي که در نتيجه اجراي دستورات DataAdapterوارد يک DataSetمي شوند )با
اجراي متد Fillاز (DataAdapterنامي مشخص نکنيم اولين جدول به نام TableدوميTable1والععي آخععر
نام گذاري مي شوند.براي تغيير نام نتايج حاصل از اجراي DataAdapterبه نام دلخواه از يکي ازمجموعه
هاي هر DataSetبه نام TableMappingاستفاده مي شود.وظيفه اين مجموعه تغييرنام جداول موجود در
DataSetبه نام هاي دلخواه کاربر جهت سهولت کار کردن با آن ها است.مثل براي تغيير نام جدول موجود
در DataSetبا نام Tableاز دستور زير استفاده مي کنيم:
("da.TableMappings.Add("Table", "Std
در اينجا خواص DataGrid1نيز به شکل زير مقداردهي ميشد:
;DataGrid1.DataSource = ds
;"DataGrid1.DataMember = "Std
روش بهتري براي تعيين نام جدول مجموعه نتايج در يک DataSetدر هنگا م پر کردن DataSetبه
شکل زيراست:
(”myStdDA.Fill(ds, “Std
در اين صورت مجموعه نتايج حاصل از اجراي دستورات DataAdapterدر جدولي با نععامي کععه درپععارامتر
دوم متد FillيکDataAdapterمشخص شده است قرار مي گيرد.
نکته :
DataSetاگر چه در هر DataSetنام جدول منبع بانام جدول دروني به طور پيش •
فعععرض يکعععي نيسعععت ولعععي نعععام سعععتون هعععاي در خواسعععت شعععده در queryوجعععدول موجعععود در
DataSetيکسان است.مثل جععدول Stdموجععود درdsازدو سععتون بععه نععام هععاي Nameو Family
تشکيل شده است.
چون در اين جععا در مععورد خععواص DatasourceوDatamemberصععحبت کرديععم ايععن •
نکته را هم را ذکر
مي کنيم که در مورد کنترل هايي که حالت ليستي به خود مي گيرند)مثل ListBoxيععا
وDataMembrر اSetکنيععم DataSource ComboBoxنيز اين امکان که يک
وجود دارد .مثل اين که عناصر يک listBoxشامل بر نام درس هاي يک دانشکده خاص باشد.براي اين
کار بايد نام دروس آن دانشکده را در جدولي درون DataSetريخته و اين جدول رل به عنوان منبع داده
اي آن ،listBoxتنظيم کنيم.
بررسي دقيق تر :DataSetهرDataSetداراي دوCollectionبه نام هاي DataRowوDataColumn
اسعععت.بععععد از اجعععراي درخواسعععت هعععر ،DataAdapterبعععراي هعععر سعععتون مجمعععوعه نتايعععج يعععک شعععي
DataColumnساخته مي شود.دو خاصيت مهم هر DataColumn،NameوDataTypeاست کععه بععراي
هر شي Datacolumnتوسط DataAdapterمقدار دهي مي شود.
مثال :در مثال زير با نام و نوع هر ستون از اولين جدول dsکار مي کنيم:
;)DataTable tbl = ds.Tables(0
;Label1.text=tbl.tableName
;DataColumn col
;textBox1.text=tbl.Columns(0).ColumnName
;textBox2.text=tbl.Columns(0).DataType.Tostring
;textBox3.text=tbl.Columns(1).ColumnName
;textBox4.text=tbl.Columns(1).DataType.Tostring
DataTableيک نوع داده اي) (DataTypeاست که به متغير هاي از نوع جدول اشاره مي کند.
بعد از اجراي کد بال متغير ها ي استفاد شده مقادير زير را خواهند داشت:
;Label1.text=Std
;textBox1.text=Name
;)textBox2.text=varchar(16
;textBox3.text=Family
;)textBox4.text=varchar(30
اما مهم ترين مجمو عه موجود در ،DataTableمجموعهDataRowاست که با استفاده از آن مععي تععوان بععه
هعععر سعععطر از جعععدول دسترسعععي داشعععت.بعععراي اسعععتفاده از ايعععن مجمعععوعه بايعععد از خصوصعععيت Rowsاز
DataTableکمک گرفت.
مثال:مجموعه دستورات زير textBox1.textر ابا نا م و textBox2.textرا با نام خععانوادگي دانشععجوي
پانزدهم از جدول Stdمقدار دهي مي کند:
;(DataTable myTable = ds.Tables(0
(DataRow myDataRow=myTable.Rows(14
;(”textBox1.text =myDataRow(“Name
;(textBox2.text = myDataRow(“Family
دقت کنيد انديس Rowsاز 0شروع مي شود.
;DataRow[] mySelectedRows
;(”mySelectedRows=myDataSet . Codefile .select(“field= cityCode
(foreach(DataRow myDataRow in mySelectedRows
}
[”[myListBox.Items.Add(myDataRow[“[Desc
{
;()myListBox.Refresh
دستورforeachبراي دسترسي به عناصر يک مجموعه به کار مي رود.
تا اين جا جدول Stdرا( براي bindشدن با فرم Stdدر DataSet،Loadکرده ايم:
حال بايدکنترل هاي مربوطه را با ستون هاي جدول Std،Bindکنيم .بنابر اين قطعه کدهاي زير را بععه انتهععاي
Form1_Loadاضافه مي کنيم:
;)"snum.DataBindings.Add("Text",myDataSet,"std.s#
;)"name.DataBindings.Add("Text",myDataSet,"std.name
;)"family.DataBindings.Add("Text",myDataSet,"std.family
;)"ssno.DataBindings.Add("Text",myDataSet,"std.ssno
;)"address.DataBindings.Add("Text",myDataSet,"std.address
;)"city.DataBindings.Add("Text",myDataSet,"std.citycode
telno.DataBindings.Add("Text",myDataSet,"std.telno");
bdate.DataBindings.Add("Text",myDataSet,"std.birthdate");
gpa.DataBindings.Add("Text",myDataSet,"std.gpa");
totpassunit.DataBindings.Add("Text",myDataSet,"std.totpassunit");
totregunit.DataBindings.Add("Text",myDataSet,"std.totregunit");
مي کند ولي ضعععفbind اين خطوط کد کليه فيلد هايي را که عيناو بدون هيچ تغييري بايد نمايش داده شوندرا
اين است که فيلد هايي که بايد با تغييراتععي روي فععر م بععه نمععايش در آينععد را نمععيDatabinding عمده روش
روش بهععتر ايععن اسععت کععه مثل در ايععن فععرم چععون.براي حل اين مشکل دو راه حل وجععود دارد.کندbind تواند
لزم اسععتStd اسععتخراج کععرد واسععتفاده از جععدولي غيععر ازStd نميتوان مستقيما نام شهر دانشجو را از جدول
جدوليDataAdapter راه حل اين است که به کمععک يععک.استخراج شودcodeFile واين فيلد بايد ازفايل
بيععن ايععنRelation ايجادکنيم که حاوي کد شهر ها و شهر هاي مربوطه بوده و سپس يععکmyDataSet در
روي ايععنDataBinding وجدول حاوي کععدونام شععهرها( تعريععف کنيععم وبوسععيله تعريععف يععکSTD) جدول2
در اين روش بعد از گرفتن داده ها از کاربرونيز قبل از.داده ها رابه فرمت دلخواه کاربر در آوريمRelation
ولععي چععون از معرفععي شععي.داده هععا بععه فرمععت مععورد قبععول پايگععاه داده در مععي آينععد،وارد شدن در پايگععاه داده
در اين روش با استفاده از. چشم پوشيديم از روش دومي استفاده مي کنيمDataRelation
به فيلد موردنظر با فرمت دلخواه دسترسععي پيععدا کععرده وآن راDataCommand واستفاده از يکPosition
قطعه اي از کد زير اين موضععوع را روشععن مععي کنععداين کععد را بععه انتهععاي. روي فرم به نمايش در مي آوريم
است که در هر لحظه شماره تاپلي کععه روي آن قععرار داريععمTextBox يکindex):.اضافه کنيدStd_Load
(.راروي فرم به نمايش در مي آوردStd از جدول
1. myIndex=this.BindingContext[myDataSet,"Std"].Position;
2. index.Text=Convert.ToString(myIndex);
3. if
(System.Convert.ToChar(this.myDataSet.Tables["Std"].Rows[myIndex
]["Sex"])=='M')
4. radioButton1.Checked=true;
5. else
6. radioButton2.Checked=true;
System.Convert.ToString(this.myDataSet.Tables["Std"].Rows[myInde
x]
13. ["Citycode"])+“ ‘ “;
14.SqlDataReader myDataReader1= mySqlCommand1.ExecuteReader();
15.myDataReader1.Read();
16.city.Text=System.Convert.ToString(myDataReader1["desc"]);
17.myDataReader1.Close();
18. mySqlCommand1.CommandText="select codefile.[desc] from
std,codefile where "+"codefile.field = 'field' "+ "and Std.S#= " +
System.Convert.ToString(this.myDataSet.Tables["Std"].Rows
[myIndex]["S#"])+" and codefile.Type='"+
System.Convert.ToString(this.myDataSet.Tables["Std"].Rows
SqlDataReader myDataReader1= mySqlCommand1.ExecuteReader();
;)(19.myDataReader1.Read
;)]"20.field.Text=System.Convert.ToString(myDataReader1["desc
;)(21.myDataReader1.Close
;)(22.myCon.Close
)update،del -1يک روش براي پياده سازي تغييرات نوشتن يک Commandمناسب )بسته به نوع عمععل
eteيا((insert
است.در اين جا مي توانيم مقادير موجود در روي کنععترل هععا را بخععوانيم ودر منبععع داده اي سععطري کععه متغيععر
positionبه آن اشاره مي کند را به مقادير جديد کنترل ها Setکنيم.در ايععن روش چععون ،DataSetبععه روز
رساني نمي شود کافي است با استفاده از متععد ()clearيک DateSetآن را خععالي کنيععم و دوبععاره آن را پععر
کنيم.پيشنهاد مي کنيم متد هايي براي پر کردن هر DataSetبا توجه به جدول هايي که دارد بنويسيد.
-2قبل از توضيح روش دوم اين نکته را ذکر مي کنيم که هرشي DataTableمتدي بععه نععام )(acceptchanges
دارد .تغييراتي که روي يک جدول داده مي شوند در چيزي مانند تاريخچه نگه داشته مي شود .تنها هنگامي کععه
متد ()acceptchangesصدا زده مي شود تغييرات داده شده به صورت واقعي بر روي جدول اعمال مي شود
والبته ديگر اين تغييععرات قابععل برگشععت نيسععت.هععر گععاه متععد ()updateاز يک DataAdapterرابراي به روز
رساني منبع داده اي يک جدول در DataSetاحضار شود اين متد ،متد ()acceptchangesجدول مربوط به خود
را نيزاحضار مي کند.
زماني که از DataBindingبراي اتصال فرم به يک DataSetاستفاده مي کنيععم .بعععد از تغييععرروي فععرم کععه بععه
DataSetهععم اعمععال مععي شععودکافي اسععت متععد UpdateازdataAdpaterمربععوطه را صععدا بزنيععد.در ايععن حععالت
کاربرمي تواند از اعمععال ايععن تغييععرات روي منبععع داده قبععل ازاحضععار متععد ()Updateمنصرف شود.در اين
صورت تغييرات در حد همين sessionاتصال به DataSetباقي خواهد ماند.
اما يک نکته ديگر نيز در اين حالت مطرح است وآن اين است که فيلد هايي را که bindنيسععتند)مثععل فيلععد کععد
شهر در فرم(Stdرا در صورت تغيير ،چگونه به روز رساني کنيم .براي اين کار نيز دو راه حل قابل طرح
است.
-1استفاده از .DataCommand
-2اعمال تغييرات هم زمان با تغيير به روي :DataSetدر اين حالت در صورتي که کاربر تغييري روي فرم
بدهد،مي توان با استفاده از متغير positionآن سععطر داده را در DataSetبععه روز رسععاني کععرد.مثل اگععر کععاربر
جنسيت دانشجويي که متغير Positionبه او اشاره مي کند را تغيير داد !مي توان با استفاده از دستور زير اين
تغيير را در DataSetاعمال کرد:
;myIndex = this.BindingContext[myDataSet,"Std"].Position
;’myDataSet.Tables[“Std”].Rows[myIndex][Sex]=’M
يا به صورت کامل تر مي توان نوشت:
(()If(readiButton1.checked
;’myDataSet.Tables[“Std”].Rows[myIndex][Sex]=’M
else
;’myDataSet.Tables[“Std”].Rows[myIndex][Sex]=’F
تغييراتي ر ااعمال کرده است يا نه DataSetر ابه روز رساني ميبينيد که مي توان بدون بررسي اين که کاربر
کرد.
مي توانستيد اين کار رابه چند صورت ساده تر انجام دهيد .مثل تنها در رويداد
ي DataSetرا انجام دهيد. radioButton1_CheckedChangedاين به روز رسان ِ
بيععن دوروش اخيععر مسععلما روش اعمععال تغييععرات هععم زمععان بععا تغييععر بععه روي DataSetاز روش استفاده از
DataCommandبهتر است زيرا در روش استفاده از DataCommandفيلععد هععايي کععه bindنيستند مستقيما در
منبع داده اي به روز رساني مي شوند و امکان انصراف براي کاربر روي اين تغييرات وجود نععدارد.حععتي اگععر
کاربر تغييرات فيلد هاي bindشده را اعمال نکند ناسازگاري پيش مي آيد.
در پايان اين مطلب را يادآور مي شويم که ما از معرفي شي DataViewکه ازديگر اشيائ مهم ADO.Netاست
چشم پوشي کرديم.در کاربرد عملي از اين شي براي فيلععتر کععردن داده هععا ومرتععب سععازي و جسععتجو در ميععان
داده هااستفاده مي شود..جستجو و فيلتر کردن را مي توانيد با استفاده از اشيايي که تا اين جا با آن ها آشنا شديد
انجام دهيد.مرتب سازي را نيز مي توانيد از متد هاي معمول براي Sortو با کمک شي DataRowانجام دهيد.
در دستور کار جلسات 8و9و10تنها يک راه حل براي اعمال خواسته پيشنهاد مي شود در صععورت نيععاز مععي
توانيد با مشورت مربي آزمايشگاه از روش هاي دلخواه خود براي پياده سازي اين عمليات ها استفاده کنيد.
-1فرم Mainراکدنويسي کنيد.پروژه نيز تنها با بسته شدن اين فرم بسته مي شود.
-2کد نويسي هاي انجام شده پيش مطالعه را بر روي فرم Stdاعمال کرده و سپس ايععن فععرم را بععه شععکل زيععر
کامل کنيد:
بعد از اين که کاربر بر روي کليد"اضافه کردن دانشجوي جديد"کليک کرد تمامي کنترل هاي متن هاي
روي فرم خالي شده حال کاربر اطلعات دانشجوي مورد نظر خود را وارد مي کند.با کليک مجدد کاربر روي
کليد"اضافه کردن دانشجوي جديد"اطلعات اين دانشجو مستقيما به منبع داده اي منتقل مي شود.سپس
DataSetرا دوباره پر کرده و فرم ر انيز Refreshکنيد positionني بايد مقدار 0را به خود
بگيرد.کاري مشابه را با کليک بر روي گزينه "حذف رکورد دانشجوي فعلي انجام دهيد" با اين تفاوت که اين
بار يک رکورد حذف مي شود.مي خواهيم در هنگام مرور کاربر بر روي اطلعات دانشجويان هر تغيير داده
شده بلفاصله بر روي DataSetاعمال شود.اين کار را کد نويسي کنيد سپس در صورت کليک کاربر بر
روي گزينه "اعمال تغييرات"اين تغييرات بلفاصله به منبع داده اي منتقل مي شود.با کليک کاربر بر گزينه
"جستجوي دانشجوفرم" جستجوي دانشجو"لود شده و با توجه به ورودي هاي کاربر رکورد مناسب پيدا شده و
اطلعات وي روي فرم "اطلعات دانشجو "لود مي شود.درسراسر اين پروژه فرض کنيد کاربر الزامي
ندارد که همه فيلد هاي فرم هاي جستجو را پر کند و جستجو هميشه روي همان فيلد هاي مقدار دهي شده
صورت مي گيرد.علوه بر اين فرض کنيد که در صورتي چندين رکورد مناسب با فيلد هاي مورد جستجو پيدا
شد،هميشه رکورد اول به نمايش در مي آيد .در صورتي که رکوردي پيدا نشد اين موضوع را به کاربر توسط
يک MessageBoxاعلم نماييد.
-3فرم هاي crsو coPrAddرا به شکل زير کد نماييد:
در ابتدا و هنگام لود شدن فرم crsآيتم هاي listBox3رابانام دانشکده ها مقدار دهي کنيد.با انتخاب يک
دانشکده خاص توسط کاربر آيتم هاي listBox2با نام گروه هاي آموزشي آن دانشکده پر مي شود.به همين
نحو بعد از انتخاب گزينه مناسب از ،listBox2آيتم هاي listBox4مقدار دهي ميشوند.اين کار را مي توانيد
به هر روش دلخواه انجام دهيد.با انتخاب گزينه مناسب از listBox 4توسط کاربر بقيه کنترل ها مقدار دهي
مي شوند.تکميل لين فرم ها ر ادر جلسه بعد انجام خواهيد داد.