<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Iran Developers Network &#187; اس کیو ال سرور میکروسافت</title>
	<atom:link href="http://www.irandevelopers.com/category/programming/database/mssql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.irandevelopers.com</link>
	<description>IDN بزرگترین مرجع توسعه دهندگان ایران - آموزش زبانهای برنامه نويسی</description>
	<lastBuildDate>Mon, 23 Aug 2010 08:51:43 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>عبارت NOT NULL در SQL</title>
		<link>http://www.irandevelopers.com/programming/database/mssql/notnull-sql-2123/</link>
		<comments>http://www.irandevelopers.com/programming/database/mssql/notnull-sql-2123/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 19:43:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/uncategorized/-2123/</guid>
		<description><![CDATA[عبارت not null  موجب میشود تا ستون مورد نظر نتواند مقدار null  را بپذیرد not null  باعث میشود تا فیلد مورد نظر همیشه دارای مقدار بوده به این معنا که شما نمیتوانید یک record جدید بدون value یا یک record موجود را بدون مقدار(value) ,  به روز کنید(update). عبارت SQL زیر موجب میشود تا ستون [...]]]></description>
			<content:encoded><![CDATA[<p dir="rtl">عبارت not null  موجب میشود تا  ستون مورد نظر نتواند مقدار null  را بپذیرد</p>
<p dir="rtl">not null  باعث میشود تا فیلد  مورد نظر همیشه دارای مقدار بوده به این معنا که شما نمیتوانید یک record  جدید بدون value یا یک record موجود را بدون مقدار(value) ,  به روز  کنید(update).</p>
<p dir="rtl">عبارت SQL زیر موجب میشود تا ستون  های &#8220;P_Id&#8221; و &#8220;LastName&#8221; مقدار null را نپذیرند(یعنی نمیتوان این دو فیلد  را خالی بگذاریم).</p>
<pre dir="ltr">CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
</pre>
<p dir="rtl">مترجم: علیرضا مسگری</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/database/mssql/notnull-sql-2123/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UNIQUE در SQL</title>
		<link>http://www.irandevelopers.com/programming/database/mssql/unique-sql-2121/</link>
		<comments>http://www.irandevelopers.com/programming/database/mssql/unique-sql-2121/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 19:33:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/uncategorized/-2121/</guid>
		<description><![CDATA[unique در دستورات SQL باعث میشود که فیلد مورد نظر در database یکتا شناخته شود. primery key  و unique در واقع تضمین یکتا بودن فیلد مورد نظر در جدول ما میشود. در یک primery key  به طور خودکار دستور  unique  وجود دارد. نکته: در یک جدول پایگاه داده ای شما میتوانید چندین unique  را داشته [...]]]></description>
			<content:encoded><![CDATA[<p dir="rtl">unique  در دستورات SQL باعث میشود که فیلد مورد نظر در database یکتا شناخته شود.</p>
<p dir="rtl">primery key  و unique در واقع  تضمین یکتا بودن فیلد مورد نظر در جدول ما میشود.</p>
<p dir="rtl">در یک primery key  به طور خودکار  دستور  unique  وجود دارد.</p>
<h3 dir="rtl">نکته:</h3>
<p dir="rtl">در یک جدول پایگاه داده ای شما  میتوانید چندین unique  را داشته باشید اما فقط یک  primery key  میتوانید  داشته باشید.</p>
<p dir="rtl">دستور unique  در جدول زیر باعث  یکتا شدن مقدار &#8220;P_Id&#8221; میشود.</p>
<p dir="rtl"><strong>MySQL:</strong></p>
<pre dir="ltr">CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
</pre>
<p dir="rtl"><strong>SQL Server / Oracle / MS  Access:</strong></p>
<pre dir="ltr">CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
</pre>
<p dir="rtl">برای نام گذاری یک مجدودیت UNIQUE  و یا برای معین کردن UNIQUE های موجود در یک جودل می توان از دستور زیر  استفاده نمود.</p>
<p dir="rtl"><strong>MySQL / SQL Server /  Oracle / MS Access:</strong></p>
<pre dir="ltr">CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
</pre>
<p dir="rtl">
<p dir="rtl">ترکیب دستور های ALTER TABLE و  UNIQUE یعنی UNIQE کردن یک مقدار برای جدول ساخته شده.</p>
<p dir="rtl"><strong>MySQL / SQL Server /  Oracle / MS Access:</strong></p>
<pre dir="ltr">ALTER TABLE Persons
ADD UNIQUE (P_Id)</pre>
<h3>DROP  کردن فیلد UNIQE :</h3>
<p><strong>MySQL:</strong></p>
<pre dir="ltr">ALTER TABLE Persons
DROP INDEX uc_PersonID
</pre>
<p><strong>SQL Server / Oracle / MS Access:</strong></p>
<pre>ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
</pre>
<p>مترجم: علیرضا  مسگری</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/database/mssql/unique-sql-2121/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>نحوه اتصال به پایگاه داده و اجرای فرامین sql در برنامه نویسی دات نت (قسمت اول)</title>
		<link>http://www.irandevelopers.com/programming/etesalpayegahdadehsql880527-1882/</link>
		<comments>http://www.irandevelopers.com/programming/etesalpayegahdadehsql880527-1882/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 14:17:38 +0000</pubDate>
		<dc:creator>biranvand2009</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1882</guid>
		<description><![CDATA[نحوه اتصال به پایگاه داده و اجرای فرامین sql در دات نت (قسمت اول) (asp.net(c#), sql server) بسمه تعالی در این مقاله می خواهم نحوه اتصال به پایگاه داده SQL SERVER و اجرای دستورات sql را شرح بدهم. برای این کار یک مثال عملی را دنبال می کنیم. کلاس های زیر برای کار با پایگاه [...]]]></description>
			<content:encoded><![CDATA[<p>نحوه اتصال به پایگاه داده و اجرای فرامین sql در دات نت (قسمت اول)<br />
(asp.net(c#), sql server)</p>
<p>بسمه تعالی</p>
<p>در این مقاله می خواهم نحوه اتصال به پایگاه داده SQL SERVER و اجرای دستورات sql را شرح بدهم. برای این کار یک مثال عملی را دنبال می کنیم.</p>
<p>کلاس های زیر برای کار با پایگاه داده مورد نیاز است :<br />
SqlConnection : از این کلاس برای اتصال به پایگاه داده استفاده می شود.<br />
SqlCommand : از این کلاس برای اجرای دستورات sql مانند select, insert, update, delete و اجرای stored procedure ها استفاده می شود.<br />
DataTable : با اجرای دستور select توسط SqlCommand، یک آرایه ای از سطر و ستون ها تولید می شود که برای ذخیره کردن آن، از این کلاس استفاده می شود.<br />
SqlDataAdapter : برای خواندن اطلاعات از پایگاه داده و ذخیره آن در DataTable از این کلاس استفاده می شود. این کلاس کاربردهای دیگری نیز دارد.<br />
ابتدا یک صفحه aspx مانند زیر بسازید</p>
<p>&lt;body&gt;</p>
<p>&lt;form id=&#8221;form1&#8243; runat=&#8221;server&#8221;&gt;</p>
<p>&lt;div style=&#8221;direction: rtl;&#8221;&gt;</p>
<p>&lt;div&gt;</p>
<p>&lt;asp:Label runat=&#8221;server&#8221; ID=&#8221;lblMessage&#8221; /&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div&gt;</p>
<p>&lt;asp:GridView runat=&#8221;server&#8221; ID=&#8221;gvNames&#8221;&gt;</p>
<p>&lt;/asp:GridView&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;div&gt;</p>
<p>&lt;asp:TextBox runat=&#8221;server&#8221; ID=&#8221;txtName&#8221; Text=&#8221;" /&gt;</p>
<p>&amp;nbsp;&amp;nbsp;&amp;nbsp;</p>
<p>&lt;asp:Button runat=&#8221;server&#8221; ID=&#8221;btnAdd&#8221; Text=&#8221;افزودن&#8221; OnClick=&#8221;btnAdd_Click&#8221; /&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;/form&gt;</p>
<p>&lt;/body&gt;</p>
<p>سپس یک database به نام SampleDb بسازید و در آن جدول Names را ایجاد کنید. این جدول دارای یک فیلد id از نوع int و Identity و یک فیلد به نام name و از نوع nvarchar(50) می باشد. برای ایجاد این جدول، کد زیر را در Management Studio یا Query Analyzer اجرا کنید.<br />
SET ANSI_NULLS ON</p>
<p>GO</p>
<p>SET QUOTED_IDENTIFIER ON</p>
<p>GO</p>
<p>CREATE TABLE [dbo].[Names](</p>
<p>[id] [int] IDENTITY(1,1) NOT NULL,</p>
<p>[name] [nvarchar](50) NOT NULL,</p>
<p>CONSTRAINT [PK_Names] PRIMARY KEY CLUSTERED</p>
<p>(</p>
<p>[id] ASC</p>
<p>)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]</p>
<p>) ON [PRIMARY]</p>
<p>اتصال به پایگاه داده :<br />
برای اتصال به پایگاه داده از کلاس SqlConnection استفاده می کنیم. این کلاس یک ویژگی مهم به نام ConnectionString دارد که مشخصات سرور، نام پایگاه داده، نام کاربری، کلمه عبور و خلاصه همه اطلاعات مورد نیاز برای وصل شدن به پایگاه داده باید در آن تعریف شود. برای کسب اطلاعات بیشتر در مورد این ویژگی به msdn و همچنین سایت www.connectionstrings.com مراجعه نمایید.<br />
private readonly string cs = &#8220;server=.;Initial Catalog=SampleDb;Integrated Security=SSPI;Persist Security Info=False;&#8221;;<br />
خواندن اطلاعات از پایگاه داده :<br />
تابع RebindNames با استفاده از پروسیجر Names_GetAll همه رکورد های جدول Names  را می خواند و نمایش می دهد :</p>
<p>SET ANSI_NULLS ON</p>
<p>GO</p>
<p>SET QUOTED_IDENTIFIER ON</p>
<p>GO</p>
<p>CREATE PROCEDURE [dbo].[Names_GetAll]</p>
<p>AS</p>
<p>BEGIN</p>
<p>SELECT * FROM [Names] ORDER BY id;</p>
<p>END</p>
<p>private readonly string cs = &#8220;server=.;Initial Catalog=SampleDb;Integrated Security=SSPI;Persist Security Info=False;&#8221;;</p>
<p>private void RebindNames()</p>
<p>{</p>
<p>using (SqlConnection cnx = new SqlConnection(cs))</p>
<p>{</p>
<p>using (SqlDataAdapter adapter = new SqlDataAdapter(&#8220;Names_GetAll&#8221;, cnx))</p>
<p>{</p>
<p>using (DataTable dt = new DataTable())</p>
<p>{</p>
<p>adapter.Fill(dt);</p>
<p>gvNames.DataSource = dt;</p>
<p>gvNames.DataBind();</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>protected void Page_Load(object sender, EventArgs e)</p>
<p>{</p>
<p>if (!IsPostBack)</p>
<p>{</p>
<p>RebindNames();</p>
<p>}</p>
<p>}</p>
<p>افزودن رکورد به جدول<br />
برای افزودن یک نام به جدول از پروسیجر Names_Add استفاده می کنیم.</p>
<p>SET ANSI_NULLS ON</p>
<p>GO</p>
<p>SET QUOTED_IDENTIFIER ON</p>
<p>GO</p>
<p>CREATE PROCEDURE [dbo].[Names_Add]</p>
<p>@Name nvarchar(50), @Id int OUTPUT</p>
<p>AS</p>
<p>BEGIN</p>
<p>INSERT INTO [Names] ([name]) VALUES (@Name);</p>
<p>SELECT @Id = SCOPE_IDENTITY();</p>
<p>END</p>
<p>protected void btnAdd_Click(object sender, EventArgs e)</p>
<p>{</p>
<p>using (SqlConnection cnx = new SqlConnection(cs))</p>
<p>{</p>
<p>using (SqlCommand cmd = new SqlCommand(&#8220;Names_Add&#8221;, cnx))</p>
<p>{</p>
<p>cmd.CommandType = CommandType.StoredProcedure;</p>
<p>cmd.Parameters.Add(&#8220;@Name&#8221;, SqlDbType.NVarChar, 50).Value = txtName.Text;</p>
<p>cmd.Parameters.Add(&#8220;@Id&#8221;, SqlDbType.Int).Direction = ParameterDirection.Output;</p>
<p>cnx.Open();</p>
<p>cmd.ExecuteNonQuery();</p>
<p>lblMessage.Text = string.Format(&#8220;نام &lt;b&gt;{0}&lt;/b&gt; افزوده شد، کد : {۱}&#8221;, txtName.Text, cmd.Parameters["@Id"].Value);</p>
<p>}</p>
<p>}</p>
<p>RebindNames();<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/etesalpayegahdadehsql880527-1882/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000</title>
		<link>http://www.irandevelopers.com/networks/createbackupsqlserver20008712110937-1535/</link>
		<comments>http://www.irandevelopers.com/networks/createbackupsqlserver20008712110937-1535/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 06:12:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[شبکه]]></category>
		<category><![CDATA[عمومی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1535</guid>
		<description><![CDATA[در SQL Server فایلهای Backup علاوه بر ساختار Database، داده ها و Object ها (Table, View, Stored Procedure, Foreign Key, Primary Key, Relation, UDF, DDF, …) را نیز شامل میشود. به عبارت دیگر با Backup گرفتن، داده های شما به صورت فیزیکی (و نه به صورت دستورات Insert) ذخیره میشود. قبل از شروع کار توجه [...]]]></description>
			<content:encoded><![CDATA[<p>در SQL Server فایلهای Backup علاوه بر ساختار Database، داده ها و Object ها  (Table, View, Stored Procedure, Foreign Key, Primary Key, Relation, UDF, DDF, …)  را نیز شامل میشود. به عبارت دیگر با Backup گرفتن، داده های شما به صورت فیزیکی (و  نه به صورت دستورات Insert) ذخیره میشود.</p>
<p>قبل از شروع کار توجه داشته باشید  که سرویسSQL Server Agent ، Start شده باشد.</p>
<p><strong>۱٫ استفاده از  Script</strong><br />
در این Script متغیر path حاوی مسیر، نام فایل و همچنین تاریخ، ساعت  و دقیقه اجرا میباشد.</p>
<pre class="Code">Declare @path varchar(200)

Set @path='C:\Backup\BK_' + Replace(Cast(GetDate() As char), ':', '-') + '.BAK'

BACKUP DATABASE [MyDatabaseName] TO DISK = @path WITH NOINIT,
NOUNLOAD, NAME = N'My Backup', NOSKIP, STATS = 10, NOFORMAT</pre>
<p>سپس یک Daily, Weekly, Monthly) Job) تعریف کرده و Script فوق را در آن  Job قرار میدهیم که باعث میشودScript ما به صورت متناوب اجرا شود.</p>
<p><strong>۲٫ استفاده از Wizard Backup</strong><br />
بر رویDatabase مورد نظر  Right-Click کنید و گزینه Backup Database را انتخاب کنید تا پنجره SQL Server  Backup ظاهر شود.<br />
<img class="alignnone size-full wp-image-1536" title="1111" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/1111.jpg" alt="1111 نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000" width="465" height="331" /><br />
<img class="alignnone size-full wp-image-1537" title="2222" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/2222.jpg" alt="2222 نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000" width="404" height="468" /></p>
<p>بر روی Add… کلیک کنید تا  مسیر و نام فایل Backup را تعیین کنید.<br />
<img class="alignnone size-full wp-image-1538" title="3333" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/3333.jpg" alt="3333 نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000" width="404" height="468" /></p>
<p>پس ازتعیین مسیر و نام فایل  Backup، بر روی OK کلیک کنید. با OK کردن نام و مسیر فایل، به پنجره قبلی بر  میگردیم. در این حالت به دو صورت میتوان عمل کرد: یکی Backup گرفتن که با کلیک کردن  برروی کلید OK در همان لحظه این عمل انجام میشود و دیگری تعریف Schedule یا برنامه  زمانبندی جهت تکرار Backup گیری به صورت اتوماتیک.</p>
<p>برای تعریف Schedule بر  روی Check Box کنار Schedule کلیک کنید. به محض کلیک، در Box مقابل، برنامه  زمانبندی Default ظاهر میشود. حال برای تغییر برنامه زمانبندی پیش فرض بر روی کلید  <strong>&#8230;</strong> کلیک کنید تا پنجره Edit Schedule باز شود.<br />
<img class="alignnone size-full wp-image-1539" title="4444" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/4444.jpg" alt="4444 نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000" width="486" height="469" /></p>
<p>در این مرحله ابتدا نام  برنامه زمانبندی و سپس نوع برنامه را مشخص کنید. در صورتی که تمایل دارید Back گیری  به صورت منظم و در زمانهای مشخص انجام شود گزینه Recurring را انتخاب کنید. برای  تغییر برنامه پیش فرض بر روی کلید Change کلیک کنید تا پنجره Edit Recurring Job  Schedule ظاهر شود.<br />
<img class="alignnone size-full wp-image-1540" title="5555" src="http://www.irandevelopers.com/wp-content/uploads/2009/03/5555.jpg" alt="5555 نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000" width="487" height="469" /></p>
<p>در این قسمت میتوانید دوره  (ماهیانه، هفتگی و روزانه)، ساعت و بازه زمانی اجرای این برنامه زمانبندی را مشخص  کنید. پس از تایید نهایی از Database شما طبق برنامه زمانبندی Backup گرفته میشود و  در مسیر مشخص شده ذخیره میگردد. توجه داشته باشید که تاریخ و ساعت Backup گیری به  انتهای نام فایل Backup اضافه میشود.</p>
<p>روش سوم تعریف Backup به صورت منظم با  استفاده از تعریف یک Database Maintenance Plan میباشد که به این مبحث در مقاله بعد  به طور مفصل میپردازیم.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/networks/createbackupsqlserver20008712110937-1535/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>جلوگیری از حملات SQL Injection در ASP.NET</title>
		<link>http://www.irandevelopers.com/programming/sqlinjectionaspnet8712071306-1527/</link>
		<comments>http://www.irandevelopers.com/programming/sqlinjectionaspnet8712071306-1527/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 09:36:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[اکسس میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1527</guid>
		<description><![CDATA[در این مقاله فرض شده است که خواننده با اصول اولیه زبان پرس و جوی ساخت یافته (Structured Query Language) یا همان SQL آشنا است. در ضمن کدهای موجود در این مقاله تماما به زبان VB.NET می باشند یک حمله SQL Injection چیست؟ حتما در فیلمهای سینمایی دیده اید که بسیاری از تبهکاران قربانیان خود [...]]]></description>
			<content:encoded><![CDATA[<p>در این مقاله فرض شده است که خواننده با اصول اولیه زبان پرس و جوی ساخت یافته  (Structured Query Language) یا همان SQL آشنا است. در ضمن کدهای موجود در این  مقاله تماما به زبان VB.NET می باشند</p>
<p><strong>یک حمله SQL Injection  چیست؟</strong><br />
حتما در فیلمهای سینمایی دیده اید که بسیاری از تبهکاران قربانیان خود  را با تزریق مواد سمی به جای دارو از میان بر می دارند. آیا در دنیای سایبر نیز  چنین ایده هایی وجود دارد؟ در کمال تعجب باید بگویم که بله!! هکرها هم به نوعی از  این شگرد استفاده می کنند. می گویید چگونه؟ با تزریق کردن دستورات SQL مورد علاقه  خود به Application شما! اجازه دهید تا با یک مثال مطلب را روشن تر کنم:</p>
<p><strong>سیستم Login:</strong><br />
صفحات Login معمولا دارای فیلدهایی هستند که دو  مقدار ID و Password را از کاربر گرفته و سپس با استفاده از یک دستور SQL آن را  پردازش می کنند. نمونه ساده ای از این دستور به صورت زیر است:</p>
<div class="Code">SELECT COUNT(UserID) FROM tblUsers WHERE UserID=&#8217;&#8221; &amp;  UserID.Text &amp; &#8220;&#8216; AND Pass=&#8217;&#8221; &amp; Password.Text &amp; &#8220;&#8216;&#8221;</div>
<p>در این  مثال UserID و Password دو کنترل TextBox هستند که مقادیر آنها بایستی مورد پردازش  قرار گیرد. حال فرض می کنیم کاربر مقادیر را به صورت mahdi و ۱۲۳ وارد نماید، در  این صورت جمله SQL به صورت زیر تولید می شود:</p>
<div class="Code">SELECT COUNT(UserID) FROM tblUsers WHERE UserID=&#8217;mahdi&#8217; AND  Pass=&#8217;123&#8242;</div>
<p>خوب تا اینحا مشکلی وجود ندارد. حال فرض کنید که هکر ما به  جای کلمه کاربری خود عبارت زیر را وارد نماید:</p>
<div class="Code">&#8216; OR 1=1 –</div>
<p>در این صورت عبارت SQL زیر تولید خواهد شد:</p>
<div class="Code">SELECT COUNT(UserID) FROM tblUsers WHERE UserID=&#8221; OR 1=1 – AND  PASS=&#8221;</div>
<p>احتمالا می دانید که کاراکتر &#8211; در SQL علامت توضیحات است و عبارت  پس از آن دیگر پردازش نمی شود لذا هنگام پردازش دستور چون همواره ۱=۱ است و با توجه  به OR به کار رفته، بدون توجه به خالی بودن مقدار مقابل UserID 1=1 کافی تلقی شده و  کلیه رکوردهای بانک اطلاعاتی برگردانده می شود و Attacker اصطلاحا Authenticate می  شود.</p>
<p>پیش از آنکه به ارائه راه حل این حفره امنیتی خودساخته بپردازیم این  نکه شایان ذکر است که این حملات در پایگاه اطلاعاتی SQL Server بسیار پیچیده تر است  که در قسمت دوم مقاله مورد بررسی قرار خواهد گرفت.</p>
<p><strong>چاره  کار!</strong><br />
ساختار شی گرای ASP.NET و امکانات این ساختار به برنامه نویسان امکان  مانور بیشتری را داده است. حال ما کد کامل اصلاح شده را در زیر آورده و سپس توضیحات  آن را ذکر می کنیم:</p>
<pre class="Code">Dim strSQL As String = "SELECT COUNT(UserID) FROM tblUsers WHERE
UserID=@UserID AND Password=@Password"
Dim cmndCheck As OleDbCommand = New OleDbCommand(strSQL, _Connection)

cmndCheck.Parameters.Add("@UserID", UserID.Text);
cmndCheck.Parameters.Add("@Password", Password.Text);
cmndCheck.Connection.Open()
Dim IsValid As Integer = cmndCheck.ExecuteScalar()

If IsValid &gt; 0
    '... Some Code here... User is authenticated
Else
    '... Some Code here... User is not aututorized to view the page
End If</pre>
<p>تغییر در همان خط اول یعنی دستور SQL مشخص است این بار به جای اینکه  مقادیر دریافتی از فیلدها با Single Quote به خورد پردازشگر دستور داده شود مقادیر  با پارامترهای تولید شده توسط آبجکت OleDbCommand جایگزین می شود و در آخر  cmndCheck پردازش شده چنانچه مقدار تولید شده توسط ExecuteScalar بزرگتر از صفر  باشد بدین معنی است که حداقل یک رکورد با شرایط مورد نظر ما پیدا شده است. (متغیر  Connection_ که باید برابر ConnectionString شما قرار گیرد دانسته فرض شده است)</p>
<p>تقاوت اصلی این روش نسبت به روش ناامن قبلی این است که در اینجا مقادیر به  صورت کاملا&#8221; پارامتری شده پردازش می شوند نه به صورت قطعاتی از یک رشته حرفی که در  واقع دام اصلی SQL Injection به شمار می آید. در واقع ما در اینجا از تکنیکهای رشته  سازی با استفاده از &amp; یا + اجتناب کرده ایم.</p>
<p>نکته مهم دیگری که باید  حتما مورد توجه قرار دهید این است که یکی از راههایی که هکرها برای حمله به سایت  شما استفاده می کنند خطاسازی صوری در زمان اجرای Application و مطالعه اطلاعات خطای  دریافت شده است. برای جلوگیری از این اتفاق که می تواند ساختار بعضی از قسمتهای کد  شما را برای حمله کنندگان آشکار کند حتما در Application خود از روال خطایابی  Customize شده استفاده کنید. علاوه بر این می توانید در بسیاری از قسمتها به صورت  موردی از Try&#8230;End Try استفاده کنید و برای اطلاع خودتان از خطای رخ داده e As  OleDbException را به آدرس Email خود ارسال کنید که در این مورد در فرصتی دیگر صحبت  خواهم کرد.</p>
<p>این مثال و راه حل یکی از ساده ترین انواع حملات Injection روی  Web Applicationهاست و شما می توانید نمونه ها و مثالهای متعددی در این خصوص را در  سایتهای <a href="../../www.sqlsecurity.com/default.htm" target="_blank">www.sqlsecurity.com</a> و <a href="../../www.nextgenss.com/research.html#papers" target="_blank">www.nextgenss.com</a> پیدا کنید که چنانچه گفته شد (و در قسمت دوم  این مقاله بدان پرداخته خواهد شد) بیشتر مربوط به SQL Server است. روش کلی کار در  SQL Server نیز کمابیش مشابه همین روش است با این تفاوت که در آنجا از Stored  Procedure استفاده می شود. پس منتظر قسمت دوم این مقاله و تکنیکهای پیشرفته تر  Hackerها در نفوذ به بانک اطلاعاتی SQL Server یک برنامه نویس ناشی و روش اجتناب از  آن باشید <img src='http://www.irandevelopers.com/wp-includes/images/smilies/icon_wink.gif' alt="icon wink جلوگیری از حملات SQL Injection در ASP.NET" class='wp-smiley' title="جلوگیری از حملات SQL Injection در ASP.NET" /> </p>
<p>توضیح: برخی قسمتهای این مقاله از مقاله &#8220;از بانک اطلاعاتی  خود دفاع کنید&#8221; نوشته Beth Breidenbach چاپ شده در شماره ۹ (نوامبر/دسامبر ۲۰۰۲)  مجله asp.netPRO اقتباس شده است.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/sqlinjectionaspnet8712071306-1527/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>اضافه کردن تصویر به پایگاه داده</title>
		<link>http://www.irandevelopers.com/programming/addpicturetosqlserver8712071257-1517/</link>
		<comments>http://www.irandevelopers.com/programming/addpicturetosqlserver8712071257-1517/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 09:29:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1517</guid>
		<description><![CDATA[در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی مواقع نمی‌توانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به همین جهت بهتر آن است که در قالب نوع داده image در [...]]]></description>
			<content:encoded><![CDATA[<div class="articleBody">در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که  دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی  مواقع نمی‌توانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به  همین جهت بهتر آن است که در قالب نوع داده image در بانک اطلاعاتی ذخیره شود.</p>
<p>در این قسمت موارد زیر بررسی می شوند:</p>
<ul style="list-style-type: square;">
<li>بررسی پیش نیازهای اضافه نمودن فایل تصویری</li>
<li>کار با شیء Stream</li>
<li>پیدا کردن اندازه و نوع تصویری که آپلود می شود</li>
<li>چگونگی استفاده از متد InputStream</li>
</ul>
<p><strong>بررسی پیش نیازهای اضافه  نمودن فایل تصویری</strong><br />
دو مورد اصلی که قبل از شروع آپلود نیاز داریم عبارتند  از:</p>
<ul type="1">
<li>- تنظیم خاصیت enctype فرم مربوطه (در برچسبForm) به <span dir="ltr">enctype=&#8221;multipart/form-data&#8221;</span><br />
- داشتن &lt;input type=file&gt;  که به کاربر اجازه انتخاب فایل مورد نظرش را می دهد. (فایلی که در پایگاه داده باید  ذخیره شود) و یک Submit button جهت اجرای عملیات مربوط به آپلود کردن فای<br />
-  استفاده از فضانام System.IO جهت سروکار داشتن با شیء Stream</li>
<li>سه پارامتر بالا در یک صفحه aspx بکار می روند.ما همچنین به پیش نیازهای زیر در  SQL Server نیازمندیم:<br />
- داشتن حداقل یک جدول با فیلدی از نوع image<br />
- بهتر  است که فیلد دیگری از نوع varchar جهت ذخیره تایپ تصویر داشته  باشیم</li>
</ul>
<p>روند کار بدین صورت است که در ابتدا محتویات فایل تصویر  خوانده می‌شود و سپس تصویر به جدول افزوده می‌شود. در زیر کد مربوط به رویداد  OnClick مربوط به Submit button که تصویر را خوانده و به جدول SQL اضافه می‌کند،  می‌پردازیم:</p>
<pre class="Code">Public Sub AddPerson(sender As Object, e As EventArgs)
   Dim intImageSize As Int64
   Dim strImageType As String
   Dim ImageStream As Stream

   ' Gets the Size of the Image
   intImageSize = PersonImage.PostedFile.ContentLength

   ' Gets the Image Type
   strImageType = PersonImage.PostedFile.ContentType

   ' Reads the Image
   ImageStream = PersonImage.PostedFile.InputStream

   Dim ImageContent(intImageSize) As Byte
   Dim intStatus As Integer
   intStatus = ImageStream.Read(ImageContent, 0, intImageSize)

   ' Create Instance of Connection and Command Object
   Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings("ConnectionString"))
   Dim myCommand As New SqlCommand("sp_person_isp", myConnection)

   ' Mark the Command as a SPROC
   myCommand.CommandType = CommandType.StoredProcedure

   ' Add Parameters to SPROC
   Dim prmPersonImage As New SqlParameter("@PersonImage", SqlDbType.Image)
   prmPersonImage.Value = ImageContent
   myCommand.Parameters.Add(prmPersonImage)

   Dim prmPersonImageType As New SqlParameter("@PersonImageType",
SqlDbType.VarChar, 255)
   prmPersonImageType.Value = strImageType
   myCommand.Parameters.Add(prmPersonImageType)

   Try
      myConnection.Open()
      myCommand.ExecuteNonQuery()
      myConnection.Close()
      Response.Write("New person successfully added!")
   Catch SQLexc As SqlException
      Response.Write("Insert Failed. Error Details are: " &amp; SQLexc.ToString())
   End Try
End Sub</pre>
<p>شیء PersonImage نام کنترل HTMLInputFile است. در ابتدا ما نیاز داریم که  اندازه تصویری که جهت اضافه کردن انتخاب شده را بدانیم که توسط کد زیر قابل اندازه  گیری است:</p>
<div class="Code">intImageSize = PersonImage.PostedFile.ContentLength</div>
<p>سپس نوع تصویر را با استفاده از خاصیت ContentType دریافت می کنیم. حال  باید یک استریم از تصویر مربوطه دریافت شود:</p>
<div class="Code">ImageStream = PersonImage.PostedFile.InputStream</div>
<p>در  اینجا ما یک آرایه از بایتها بنام ImageContent که آماده نگهداری محتویات تصویر  است، داریم. تصویر ورودی توسط متد Read از شیء Stream خوانده می شود. متد Read سه  آرگومان می گیرد:<br />
۱٫ موقعیت مکانی که محتویات تصویر در آن باید کپی شود<br />
۲٫  مکان شروع جهت خواندن<br />
۳٫ تعداد بایتهایی که باید خوانده شود</p>
<p>و دستور  مربوط به خواندن هم به شکل زیر است:</p>
<div class="Code">intStatus = ImageStream.Read(ImageContent, 0, intImageSize)</div>
<p>حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL  اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک  جدول اضافه می کند، بهره می بریم. حالا ما می خواهیم محتویات تصویر ورودی را که  خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که  تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم.</p>
<p>فایل aspx  مربوطه:</p>
<pre class="Code">&lt;%@ Page Language="vb" %&gt;
&lt;%@ Import Namespace="System.Data" %&gt;
&lt;%@ Import Namespace="System.Data.SqlClient" %&gt;
&lt;%@ Import Namespace="System.IO" %&gt;
&lt;html&gt;
   &lt;head&gt;
      &lt;title&gt;Inserting Image to a SqlServer&lt;/title&gt;
      &lt;script runat=server&gt;
         Public Sub AddPerson(sender As Object, e As EventArgs)
            ' above code
         End Sub
      &lt;/script&gt;
   &lt;/head&gt;

   &lt;body&gt;

      &lt;form enctype="multipart/form-data" runat="server"&gt;
         &lt;input type="file" id="PersonImage" runat=server /&gt;
         &lt;asp:Button Text="Add Person" OnClick="AddPerson" Runat=server /&gt;
    &lt;/form&gt;

  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>جدول و زیرروال استفاده شده:</p>
<pre class="Code">Drop Table Person
Go

Create Table Person
(
PersonID Int Identity,
PersonEmail Varchar(255),
PersonName Varchar(255),
PersonSex Char(1),
PersonDOB DateTime,
PersonImage Image,
PersonImageType Varchar(255)
)

Drop Proc sp_person_isp
Go

Create Proc sp_person_isp
@PersonEmail Varchar(255),
@PersonName Varchar(255),
@PersonSex Char(1),
@PersonDOB DateTime,
@PersonImage Image,
@PersonImageType Varchar(255)
As
Begin
   Insert into Person
      (PersonEmail, PersonName, PersonSex,
       PersonDOB, PersonImage, PersonImageType)
   Values
      (@PersonEmail, @PersonName, @PersonSex,
       @PersonDOB, @PersonImage, @PersonImageType)
End

Go</pre>
<p><strong>بازیابی تصاویر از SQL Server در ASP.NET:</strong><br />
در مقایسه با  اضافه کردن تصویر، بازیابی آن بسیار ساده است. تنها چیز جدید برای این قسمت استفاده  از متد BinaryWrite موجود در شیء Response است.</p>
<p>کدهای مورد استفاده جهت  بازیابی تصاویر از SQL Server:</p>
<pre class="Code">Public Sub Page_Load(sender As Object, e As EventArgs)

   Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings("ConnectionString"))
   Dim myCommand As New SqlCommand("Select * from Person", myConnection)

   Try
      myConnection.Open()
      Dim myDataReader as SqlDataReader
      myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)

      Do While (myDataReader.Read())
         Response.ContentType = myDataReader.Item("PersonImageType")
         Response.BinaryWrite(myDataReader.Item("PersonImage"))
      Loop

      myConnection.Close()
      Response.Write("Person info successfully retrieved!")
   Catch SQLexc As SqlException
      Response.Write("Read Failed : " &amp; SQLexc.ToString())
   End Try
End Sub</pre>
<p>تمام کار این مرحله اجرای یک دستور SQL و تکرار آن برای همه ردیفهاست.  قبل از نمایش تصویر، نوع آن هم مشخص می شود.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/addpicturetosqlserver8712071257-1517/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ایجاد یک ارتباط ایمن با SQL Server در ASP.NET</title>
		<link>http://www.irandevelopers.com/programming/aspnetsqlserver8711231430-1442/</link>
		<comments>http://www.irandevelopers.com/programming/aspnetsqlserver8711231430-1442/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 11:01:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET - دات نت]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1442</guid>
		<description><![CDATA[ایجاد یک ارتباط امن با SQL Server در ASP.NET نگهداری صریح رمزعبور و Hard Code نمودن آن در برنامه های کاربردی و وب سایتها قابل قبول نمی باشد. SQL Server داری امکانی با عنوان Trusted Connection می باشد که از طریق آن اعتبار سنجی لازم برای دسترسی به منابع SQL Server از روی نام Login انجام [...]]]></description>
			<content:encoded><![CDATA[<p dir="rtl" align="justify"><span dir="rtl"></p>
<p align="justify"><strong>ایجاد یک ارتباط امن با SQL Server در  ASP.NET<br />
</strong><br />
نگهداری صریح رمزعبور و Hard Code نمودن آن در برنامه های  کاربردی و وب سایتها قابل قبول نمی باشد. SQL Server داری امکانی با عنوان Trusted  Connection می باشد که از طریق آن اعتبار سنجی لازم برای دسترسی به منابع SQL  Server از روی نام Login انجام می شود. در این حالت هیچ رمز عبوری به SQL Server  فرستاده نمی شود و تنها نام Login و یک Authentication Token به آن ارسال می  گردد. در صورتیکه شما خواسته باشید از این امکان در ASP.NET استفاده نمایید در پاره  ای از موارد تا حدودی با مشکل مواجه خواهید شد. زیرا کاربری که ASP.NET تحت حقوق  دسترسی آن اجرا می شود نقش تعیین کننده ای را ایفا می کند. در حالت پیش فرض ASP.NET  با استفاده از کاربر ASPNET در ماشین محلی اجرا می گردد. در صورتیکه ASP.NET و SQL  Server هر دو برروی یک ماشین اجرا شوند کار بسیار ساده می باشد. در این حالت باید  به کاربر ASPNET در SQL Server حقوق دسترسی و مجوزهای لازمه اعطا گردیده و در نهایت  در رشته Connection لازم است عبارت Integrated Security=SSPI  یا Trusted_Connection=true بر حسب سبک رشته Connection در نظر گرفته شود.<br />
مشکل  زمانی رخ می دهد که ASP.NET و SQL Server برروی ماشینهای جداگانه ای اجرا گردند که  در واقع در اکثر موارد نیز چنین می باشد. زیرا کاربر ASPNET در SQL Server قابل  دسترسی نمی باشد.<br />
پنج راه اصلی برای غلبه بر این مشکل موجود می باشد.</p>
<ul>
<li>
<p align="justify">استفاده از IIS 6 در حالت Native Application</p>
</li>
<li>
<p align="justify">انطباق کاربر ASP.NET برروی IIS و SQL Server و مشخص کردن رمز  عبور.</p>
</li>
<li>
<p align="justify">استفاده از جعل هویت (Impersonation) بمنظور تغییر کاربر ASP.NET.</p>
</li>
<li>
<p align="justify">کد کردن (Encrypt) رشته Connection و قرار دادن آن در رجیستری و  فراموش کردن ارتباط امن!</p>
</li>
<li>
<p align="justify">تغییر کاربر ASP.NET به یک Domain User.</p>
</li>
</ul>
<p align="justify">اجرای هر نوع سرویس وب به عنوان Domain User بسیار خطرناک می  باشد. زیرا در این صورت هکرها با استفاده از حقوق دسترسی کاربر دامنه قابلیت دسترسی  به تمامی منابع داخل و خارج سرویس دهنده وب را دارا می باشند.<br />
کد کردن داده ها و  دسترسی به آنها بطور کامل در مقاله شماره <a href="../../support.microsoft.com/default.aspx@scid=kb;en-us;329290">Microsoft  Knowledge Base 329290</a> و مقاله <a href="../../msdn.microsoft.com/library/default.asp@url=_2flibrary_2fen-us_2fdnnetsec_2fhtml_2fsecnetht11.asp">Building Secure ASP.NET  Applicartion</a> در MSDN بررسی شده است.<br />
هر دو حالت انطباق کاربر و جعل هویت  نیازمند این می باشد که شما داری حسابهای Mirror در IIS و SQL Server باشید. ( در  صورتیکه شما در یک محیط Active Directory و Domain قرار نداشته  باشید)</p>
<p><strong>جعل هویت<br />
</strong><br />
جعل هویت به شما این امکان را می  دهد که به ASP.NET بگویید تحت عنوان یک کاربر بخصوص اجرا شود. برروی هر دو ماشین  مورد نظر کاربری همنام و با رمز عبور مطمئن ایجاد نمایید. برروی سرویس دهنده IIS  کاربر ایجاد شده باید دارای توانایی اجرا به عنوان کاربر ASP.NET را دارا باشد  (برای اطلاعات بیشتر می توانید به <a href="../../www.microsoft.com/resources/documentation/windowsserv/2003/enterprise/proddocs/en-us/aaconaspnetrequiredaccesscontrollistsacls.asp@frame=true">MSDN</a> مراجعه نمایید). برروی سرویس دهنده SQL Server نیز کاربر مورد نظر باید قابلیت  دسترسی به منابع مورد نظر از جمله بانک اطلاعاتی، جداول، دیدگاهها، روالهای ذخیره  شده و &#8230; را داشته باشد.<br />
اکنون شما می بایست ASP.NET را بمنظور اجرا تحت عنوان  این کاربر پیکره بندی نمایید. دو راه حل بمنظور انجام این عمل در پیش روی شما می  باشد. راه اول قرار دادن رمز عبور در فایل Web.Config (که راه نامطلوبی است) و  دومین راه استفاده از ابزار IIS Administration همراه تنظیماتی در فایل  Web.Config.<br />
برای Hard Code کردن رمز عبور و نام کاربر فایل Web.Config را  ویرایش کرده و حالت عنصر identity را بصورت زیر به آن اضافه نمایید.</p>
<div style="padding: 5px; font-size: 10pt; width: 100%; font-family: 'Courier New'; background-color: whitesmoke;" dir="ltr">
<p align="justify"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">system</span><span style="color: #ff0000;">.web</span><span style="color: #0000ff;">&gt;<br />
</span><span style="color: #000000;">&#8230;<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">identity </span><span style="color: #ff0000;">impersonate</span><span style="color: #0000ff;">=&#8221;true&#8221;</span><span style="color: #ff0000;"><br />
userName</span><span style="color: #0000ff;">=&#8221;yourNewUsername&#8221;</span><span style="color: #ff0000;"><br />
password</span><span style="color: #0000ff;">=&#8221;yourStrongPassword&#8221;</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&#8230;<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">system.web</span><span style="color: #0000ff;">&gt;</span></p>
</div>
<p align="justify">
این حالت در واقع تمامی تلاش شما برای قرار ندادن رمز عبور در  کد را بی نتیجه خواهد کرد.<br />
در صورتیکه شما نیاز داشته باشید که رمز عبور را در  کد قرار ندهد (که باید همین طور باشد) می توانید از قرار دادن نام کاربر و رمز عبور  در فایل Web.Config صرفه نظر کرده و تنظیمات مربوطه را در IIS انجام دهید. اما نیاز  است شما عنصر idenity را بصورت زیر در فایل Web.Config قرار دهید.</p>
<div style="padding: 5px; font-size: 10pt; width: 100%; font-family: 'Courier New'; background-color: whitesmoke;" dir="ltr">
<p align="justify"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">system</span><span style="color: #ff0000;">.web</span><span style="color: #0000ff;">&gt;<br />
</span><span style="color: #000000;">&#8230;<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">identity </span><span style="color: #ff0000;">impersonate</span><span style="color: #0000ff;">=&#8221;true&#8221;  /&gt;</span><span style="color: #ff0000;"><br />
</span><span style="color: #000000;"> &#8230;<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">system.web</span><span style="color: #0000ff;">&gt;</span></p>
</div>
<p align="justify">
اکنون ابزار IIS Administration را باز کرده و روی شاخه ای که  برنامه شما در آن قرار دارد کلیک راست نمایید. پنجره خصوصیات را باز کرده و در برگه  Directory Security دکمه Edit قسمت Autentication and access control را کلیک  نمایید. قسمت Enable anonymous access را تیک زده و  نام کاربر و رمز عبور آنرا  مشخص نمایید.</p>
<p><strong>ویرایش محتوی پیش فرض</p>
<p></strong>در صورتیکه شما  با IIS 5 کار می کنید و انجام این عمل ممکن است اثرات جانبی داشته باشد و یا شما  داری چندین برنامه می باشید که تعیین کاربر برای تک تک آنها وقت گیر می باشد، در  این حالت می توانید مستقیما محتوی کاربر ASP.NET را تغییر دهید. همانطور که قبلا  ذکر شد ASP.NET تحت کاربر ASPNET اجرا می گردد و این کاربر مجوزهای لازم را برای  اجرای صفحات ASP.NET را دارا می باشد. این کاربر در زمان نصب Framework بطور خودکار  ایجاد می گردد و رمز عبور آن برای ما شناخته شده نیست. تنها عمل ممکن برای ما Rest  کردن رمز عبور آن (فراموش نشود کاربر ASPNET را در SQL Server با همان رمز عبور ثبت  نمایید) و  سپس ویرایش فایل machine.config و اطلاع به Framework بمنظور استفاده از  این رمز عبور جدید. متاسفانه شما نیاز است که رمز عبور را بصورت صریح در این فایل  ذکر نمایید. این فایل در مسیر زیر قرار دارد.</p>
<div style="padding: 5px; font-size: 10pt; width: 100%; font-family: 'Courier New'; background-color: whitesmoke;" dir="ltr">
<p align="justify">c:\windows\microsoft.net\framework\versionNumber\config</p>
</div>
<p align="justify">
بمنظور پیکره بندی مجدد و تعیین رمز عبور جدید عنصر  processModel را در فایل فوق پیدا کرده و آنرا بصورت زیر با جایگزینی های لازم  تغییر دهید.</p>
<div style="padding: 5px; font-size: 10pt; width: 100%; font-family: 'Courier New'; background-color: whitesmoke;" dir="ltr">
<p align="justify"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">processmodel<br />
</span><span style="color: #ff0000;">&#8230;<br />
userName</span><span style="color: #0000ff;">=&#8221;ASPNET&#8221;</span><span style="color: #ff0000;"> password</span><span style="color: #0000ff;">=&#8221;ASPNETpassword&#8221;</span><span style="color: #ff0000;"><br />
&#8230;<br />
</span><span style="color: #0000ff;">/&gt;</span></p>
</div>
<p align="justify">
پس از انجام این عمل IIS را راه اندازی مجدد  نمایید.</p>
<p><strong>IIS 6 در حالت محلی</p>
<p></strong>آخرین راه و در واقع  بهینه ترین راه استفاده از IIS 6 و اجرای برنامه های ASP.NET در حالت محلی می باشد.  IIS 6 به شما امکان ایجاد <a href="../../www.microsoft.com/windowsserver2003/techinfo/training/iis.mspx">Application  Pool</a> را می دهید. یک Pool، کنترل کارایی، چرخه پروسه ها و مهمتر از همه امنیت  لازم برای ایجاد ارتباط امن را فراهم می کند. در این حالت شما همانند حالت قبل  نیازمند ایجاد یک کاربر برروی IIS و SQL Server می باشید. برای ایجاد یک Pool ابزار  IIS Administration را فعال کرده برروی Application Pool کلیک راست کرده و گزینه  New Application Pool را انتخاب نمایید. نامی برای Pool خود انتخاب کرده و دکمه OK  را کلیک نمایید. سپس برروی نام Pool ایجاد شده راست کلیک کرده و گزینه Properties  را انتخاب نمایید. با انتخاب برگه Identity نام کاربر و رمز عبور آنرا مشخص نمایید.  در ادامه شما نیازمند تغییر تنظیمات برنامه خود برای استفاده از Pool ایجاد شده می  باشد. بدین منظور برروی نام برنامه خود در IIS راست کلیک کرده و گزینه Properties  را انتخاب نمایید. در پنجره Properties برگه Home Directory را انتخاب کرده وسپس  Application Pool آنرا مطابق Pool ایجاد شده تغییر دهید.</p>
<p><strong>تاثیرات  جانبی<br />
</strong><br />
در استفاده از ارتباط امن با اثراتی جانبی مواجه می باشیم.  اگر هر ارتباط تحت کاربرانی مجزا باز شده باشند در این حالت ارتباطات ایجاد شده بین  کاربران به اشتراک گذاشته نخواهند شد. این عمل سرباری برروی IIS و SQL Server ایجاد  خواهد کرد. ارتباط امن در مقایسه با حالت دیگر قدرت پردازشی بیشتری را طلب می کند  زیرا درخواست ها خارج از SQL Server و تحت نظارت NT انجام می پذیرد. در صورتیکه شما  از داخل یک دامنه این اعمال را انجام دهید سربار بیشتری برروی کنترل کننده های  دامنه و SQL Server اعمال خواهد شد.</p>
<p><strong>خلاصه<br />
</strong><br />
در واقع  یک راه واحد برای ایجاد ارتباط امن با SQL Server در ASP.NET وجود ندارد. Microsoft  راههای مختلفی برای رسیدن به این منظور فراهم آورده است و انتخاب بهترین راه برای  برنامه شما بر عهده خود شما می باشد.</p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/aspnetsqlserver8711231430-1442/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>فرستادن یک آرایه یا DataTable به یک Stored Procedure</title>
		<link>http://www.irandevelopers.com/programming/datatablestoreproceduresqlserver8711201038-1400/</link>
		<comments>http://www.irandevelopers.com/programming/datatablestoreproceduresqlserver8711201038-1400/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 07:08:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1400</guid>
		<description><![CDATA[آیا تا بحال خواسته اید که یک DataTable یا یک آرایه که شامل ده ها، ده ها هزار ( و یا حتی میلیون ها ) رکورد می باشد را در فقط یک فراخوانی پایگاه داده به یکStored Procedure در SQL Server 2000 بفرستید ؟ و یا تا بحال خواسته اید که لیست شناسه های رکوردها [...]]]></description>
			<content:encoded><![CDATA[<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">آیا  تا بحال خواسته اید که یک DataTable یا یک آرایه که شامل ده ها، ده ها هزار ( و یا  حتی میلیون ها ) رکورد می باشد را در فقط یک فراخوانی پایگاه داده به یکStored  Procedure در SQL Server 2000 بفرستید ؟ و یا تا بحال خواسته اید که لیست شناسه های  رکوردها را برای انتخاب یا حذف به یک<span lang="fa"> </span>Stored Procedure<span lang="fa"> </span> بفرستید ؟ اگر این کارها را انجام نداده اید و یا نتوانستید که  برای انجام آن راه حلی پیدا کنید پس راه حل این کار را می توانید در اینجا ببینید  .</p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">حقه  انجام این کار تبدیل لیست های داده به آرایه ای از بایت می باشد ، که این آرایه ها  را سپس به عنوان پارامتر از نوع image به Stored Procedure می فرستیم . سپس در  Stored Procedure این تصویر به یک جدول متغیر که شامل داده های اصلی می باشد تبدیل  می شود . تابع SQL Server زیر یکی از توابع تبدیل پارامتر از نوع image به یک جدول  متغیر می باشد . این تابع یک جدول از نوع متغیر varchar ایجاد می کند .</p>
<p><span dir="ltr"></p>
<table id="table1" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">CREATE FUNCTION dbo.GetTableVarchar(@Data image)<br />
RETURNS @DataTable<br />
TABLE (RowID int primary key IDENTITY , Value Varchar(8000))<br />
AS<br />
BEGIN<br />
&#8211;First Test the data is of type Varchar.<br />
IF(dbo.ValidateExpectedType(103, @Data)&lt;&gt;1) RETURN</p>
<p>&#8211;Loop thru  the list inserting each<br />
&#8211; item into the variable table.<br />
DECLARE  @Ptr int, @Length int,<br />
@VarcharLength smallint, @Value  Varchar(8000)<br />
SELECT @Length = DataLength(@Data), @Ptr = 2<br />
WHILE(@Ptr&lt;@Length)<br />
BEGIN<br />
&#8211;The first 2 bytes of each item  is the length of the<br />
&#8211;varchar, a negative number designates a null  value.<br />
SET @VarcharLength = SUBSTRING(@Data, @ptr, 2)<br />
SET  @Ptr = @Ptr + 2<br />
IF(@VarcharLength&lt;0)<br />
SET @Value =  NULL<br />
ELSE<br />
BEGIN<br />
SET @Value =  SUBSTRING(@Data, @ptr, @VarcharLength)<br />
SET @Ptr = @Ptr +  @VarcharLength<br />
END<br />
INSERT INTO @DataTable (Value)  VALUES(@Value)<br />
END<br />
RETURN<br />
END</span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl">من  همچنین تعدادی کلاس <span dir="ltr">C#</span> برای ایجاد آرایه هایی از نوع بایت از  نوع داده های مختلف ایجاد کرده ام .</p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl">توجه  : کد هایی که در ادامه می آید بخشی از یک برنامه برای مزرعه پرورش صدف می باشد .</p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">در  این مثال برای فراخوانی پایگاه داده از کلاس SQLHelper که یکی از بلاک های برنامه  مایکروسافت می باشد استفاده کرده ام . شما می توانید این بلاک برنامه را در MSDN  مشاهده کنید. فرستادن یک لیست از شناسه های integer برای انتخاب رکوردهای مربوطه در  متد زیر اقلام چک شده ی یک لیست باکس را گرفته و شناسه های آنها را به یک Stored  Procedure می فرستیم . Stored Procedure سپس یک مجموعه از نتایج را که شامل جزییات  هر شناسه انتخاب شده می باشد را بر می گرداند .</p>
<p><span dir="ltr"></p>
<table id="table2" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">private</span> DataSet  GetSelectedSnailDetails()<br />
{<br />
SQLIntListCreator snailIDs = <span style="color: #0000ff;">new</span> SQLIntListCreator();<br />
foreach(Snail aSnail <span style="color: #0000ff;">in</span> mySelectionCheckedListBox.CheckedItems)<br />
snailIDs.AddValue(aSnail.SnailID);</p>
<p><span style="color: #0000ff;">return</span> SQLHelper.ExecuteDataset(CONN_STRING,<br />
&#8220;GetSnailDetails&#8221;,  snailIDs.GetList());<br />
}</span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">از  Stored Procedure زیر برای گرفتن لیستی از نوع داده int که به فرم image ( آرایه ای  از بایت) می باشد ؛ استفاده می شود . این روال لیست را به جدول متغیری از نوع int  تبدیل می کند سپس این جدول را به ستون SnailID از جدول Snails متصل می نماید ، تا  بتواند جزییات را برای هر صدف انتخاب شده برگرداند .</p>
<p><span dir="ltr"></p>
<table id="table3" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">CREATE PROCEDURE GetSnailDetails<br />
@SnailIDs image<br />
AS<br />
SELECT Snail.*<br />
FROM dbo.GetTableInt(@SnailIDs) SIDs<br />
INNER JOIN  Snails ON SIDs.Value = Snails.SnailID<br />
GO </span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p class="MsoNormal" style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: right;" dir="rtl"><span style="font-size: 10pt; line-height: 150%; font-family: Tahoma;" lang="FA">روال  ذخیره شده برای حذف همه صدف ها در لیست </span><span style="font-size: 10pt; line-height: 150%; font-family: Tahoma;" dir="ltr">@Snails</span><span style="font-size: 10pt; line-height: 150%; font-family: Tahoma;" lang="FA"> از نوع </span><span style="font-size: 10pt; line-height: 150%; font-family: Tahoma;" dir="ltr">image</span><span style="font-size: 10pt; line-height: 150%; font-family: Tahoma;" lang="FA"> به فرم  زیر می باشد .</span></p>
<p><span dir="ltr"></p>
<table id="table4" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">CREATE PROCEDURE DeleteSnails<br />
@SnailIDs image<br />
AS<br />
DELETE  Snail<br />
FROM dbo.GetTableInt(@SnailIDs) SIDs<br />
INNER JOIN Snails ON  SIDs.Value = Snails.SnailID<br />
GO</span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">متد  فرستادن مجموعه ای از حالات صدف به Stored Procedure برای بهنگام سازی به فرم زیر  می باشد .</p>
<p><span dir="ltr"></p>
<table id="table5" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">private void</span> UpdateSnailStatuses(Snail[]  snails)<br />
{<br />
SQLIntListCreator snailIDs = <span style="color: #0000ff;">new</span> SQLIntListCreator();<br />
SQLVarcharListCreator statuses =<br />
<span style="color: #0000ff;">new</span> SQLVarcharListCreator();<br />
SQLRowversionListCreator rowVersions =<br />
<span style="color: #0000ff;">new</span> SQLRowversionListCreator();</p>
<p><span style="color: #0000ff;">foreach </span>(Snail  aSnail <span style="color: #0000ff;">in</span> snails)<br />
{<br />
snailIDs.AddValue(aSnail.SnailID);<br />
statuses.AddValue(aSnail.Status);<br />
rowVersions.AddValue(aSnail.RowVersion);<br />
}</p>
<p>SQLHelper.ExecuteNonquery(CONN_STRING,<br />
&#8220;UpdateSnailStatuses&#8221;,  snailIDs.GetList(),<br />
statuses.GetList(),  rowVersions.GetList());<br />
}</span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">از  روال زیر نیز برای بهنگام سازی حالات صدف ها استفاده می شود .</p>
<p><span dir="ltr"></p>
<table id="table6" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">CREATE PROCEDURE dbo.UpdateSnailStatuses<br />
@SnailIDs image,<br />
@Statuses image,<br />
@RowVersions image<br />
AS<br />
UPDATE Snail<br />
SET  Snail.Status = Statuses.Value<br />
FROM Snail<br />
INNER JOIN  GetTableInt(@SnailIDs) SnailIDs<br />
ON Snail.SnailID =  SnailIDs.Value<br />
INNER JOIN GetTableVarchar(@Statuses) Statuses<br />
ON SnailIDs.RowID = Statuses.RowID<br />
INNER JOIN  GetTableRowversion(@RowVersions) RowVersions<br />
ON Statuses.RowID =  RowVersions.RowID<br />
WHERE TSEQUAL(Snail.RowVersion, RowVersions.Value) </span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">RETURN @@ERROR</span></p>
</td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl"><strong>فرستادن  یک DataTable به یک Stored Procedure برای درج در یک جدول</strong></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">از  کد زیر برای تبدیل داده های یک DataTable به پنج آرایه از نوع بایت استفاده می شود  . این آرایه ها سپس به Stored Procedure ی AddSnails برای درج در جدول Snail  فرستاده می شوند .</p>
<p><span dir="ltr"></p>
<table id="table7" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;"><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> AddSnails(DataTable snails)<br />
{<br />
SQLVarcharListCreator species = <span style="color: #0000ff;">new</span> SQLVarcharListCreator();<br />
SQLDatetimeListCreator  dOB = <span style="color: #0000ff;">new</span> SQLDatetimeListCreator();<br />
SQLNvarcharListCreator location = <span style="color: #0000ff;">new</span> SQLNvarcharListCreator();<br />
SQLBitListCreator isMale = <span style="color: #0000ff;">new</span> SQLBitListCreator();<br />
SQLMoneyListCreator value =  <span style="color: #0000ff;">new</span> SQLMoneyListCreator();</p>
<p><span style="color: #0000ff;">foreach</span>(DataRow row <span style="color: #0000ff;">in</span> snails.Rows)<br />
{<br />
species.AddValue(row["Species"]);<br />
dOB.AddValue(row["DOB"]);<br />
location.AddValue(row["Location"]);<br />
isMale.AddValue(row["IsMale"]);<br />
value.AddValue(row["Value"]);<br />
}</p>
<p><span style="color: #008000;"> // A command is explicitly created here<br />
// instead of using SQLHelper as we need to be<br />
// able to set the  CommandTimeout property<br />
// big enough to insert 1 000 000  records.<br />
</span> <span style="color: #0000ff;">using</span> (SqlConnection cnn =  <span style="color: #0000ff;">new</span> SqlConnection(CONN_STRING))<br />
{<br />
cnn.Open();<br />
SqlCommand comInst = <span style="color: #0000ff;">new</span> SqlCommand(&#8220;AddSnails&#8221;, cnn);<br />
comInst.CommandType =  CommandType.StoredProcedure;<br />
comInst.CommandTimeout =  10000;</p>
<p>comInst.Parameters.Add(&#8220;@Species&#8221;,  species.GetListAndReset());<br />
comInst.Parameters.Add(&#8220;@DOB&#8221;,  dOB.GetListAndReset());<br />
comInst.Parameters.Add(&#8220;@Location&#8221;,  location.GetListAndReset());<br />
comInst.Parameters.Add(&#8220;@IsMale&#8221;,  isMale.GetListAndReset());<br />
comInst.Parameters.Add(&#8220;@Value&#8221;,  value.GetListAndReset());<br />
comInst.ExecuteNonQuery();<br />
}<br />
}</span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">و  از Stored Procedure زیر برای تبدیل تصویر به جدول متغیرها و اتصال آنها به هم و  درج داده های حاصله در جدول Snail استفاده می شود .</p>
<p><span dir="ltr"></p>
<table id="table8" border="0" cellspacing="0" cellpadding="10" width="100%" bgcolor="#ffffdd">
<tbody>
<tr>
<td>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: Courier New; font-size: x-small;">ALTER PROCEDURE dbo.AddSnails<br />
(<br />
@Species image,<br />
@DOB  image,<br />
@Location image,<br />
@IsMale image,<br />
@Value  image<br />
)<br />
AS<br />
INSERT INTO Snail (Species, DOB, Location, IsMale,  Value)<br />
SELECT Species.Value, DOB.Value,<br />
Location.Value,  IsMale.Value, Value.Value<br />
FROM GetTableMoney(@value) Value<br />
INNER  JOIN GetTableBit(@isMale) IsMale ON Value.RowID = IsMale.RowID<br />
INNER  JOIN GetTableVarchar(@species) Species<br />
ON IsMale.RowID =  Species.RowID<br />
INNER JOIN GetTableDateTime(@dOB) DOB ON Species.RowID =  DOB.RowID<br />
INNER JOIN GetTableNvarchar(@location) Location<br />
ON  DOB.RowID = Location.RowID</p>
<p>RETURN  @@ERROR</span></td>
</tr>
</tbody>
</table>
<p></span></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">تصویر  زیر اتصال همه جداول متغیر ها را نشان می دهد .</p>
<p><strong>کارایی استفاده از  این روش</strong></p>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">برای  مقایسه سرعت درج با استفاده از روش گفته شده در بالا (و بیان کارایی آن) با روش  استاندارد وارد کردن یکی یکی رکورد ها به پایگاه داده ها مقایسه زیر با استفاده از  یک کامپیوتر پنتیوم ۴ همراه با ۵۱۲ مگا بایت حافظه رم انجام شده است .در این مقایسه  بخش کلاینت و سرور هر دو بر روی یک ماشین قرار داشته است . و در صورتیکه بخواهیم  این آزمایش را بر روی یک شبکه سریع انجام دهیم زمان به مراتب کمتری خواهد داشت  .</p>
<table id="table9" class="ms-prof-main" style="height: 248px;" border="0" cellspacing="0" cellpadding="5"><!-- fpstyle: 36,011111100 --></p>
<tbody>
<tr>
<td class="ms-prof-tl" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: Tahoma; font-size: x-small;"><strong>Records Inserted</strong></span></p>
</td>
<td class="ms-prof-top" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: Tahoma; font-size: x-small;"><strong>Standard one stored procedure call per record  (msec)</strong></span></p>
</td>
<td class="ms-prof-top" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: Tahoma; font-size: x-small;"><strong>One stored procedure call for all records  (msec)</strong></span></p>
</td>
</tr>
<tr>
<td class="ms-prof-left" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">1</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">2</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">10</span></span></p>
</td>
</tr>
<tr>
<td class="ms-prof-left" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">10</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">22</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">14</span></span></p>
</td>
</tr>
<tr>
<td class="ms-prof-left" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">100</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">219</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">60</span></span></p>
</td>
</tr>
<tr>
<td class="ms-prof-left" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">1000</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">2  259</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">505</span></span></p>
</td>
</tr>
<tr>
<td class="ms-prof-left" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">10  000</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">22  593</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">4  083</span></span></p>
</td>
</tr>
<tr>
<td class="ms-prof-left" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">100  000</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">301  368</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">44  645</span></span></p>
</td>
</tr>
<tr>
<td class="ms-prof-left" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">1 000  000</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">3 094  385</span></span></p>
</td>
<td class="ms-prof-even" style="padding: 0.75pt;" align="middle">
<p class="MsoNormal"><span style="font-family: Tahoma; font-size: x-small;"><span style="color: black;">571  020</span></span></p>
</td>
</tr>
</tbody>
</table>
<p style="direction: rtl; line-height: 150%; unicode-bidi: embed; text-align: justify;" dir="rtl">
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/datatablestoreproceduresqlserver8711201038-1400/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>خلاصه سازی داده ها</title>
		<link>http://www.irandevelopers.com/programming/reviewsql8711021629-1304/</link>
		<comments>http://www.irandevelopers.com/programming/reviewsql8711021629-1304/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 12:59:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1304</guid>
		<description><![CDATA[هنگامی که دو جدول در یک پیوند یک به چند سهیم هستند. وسیله محرک Query مقادیری از سطر را از یک طرف برای ارتباط دادن سطرها در طرفهای دیگری تکرار می کند. بعضی مواقع آن دقیقاً چیزی است که شما می خواهید، اما اغلب شما می خواهید تکرار کردن سطرها را از چندین طریق دسته [...]]]></description>
			<content:encoded><![CDATA[<div class="txt"><span style="font-size: x-small;">هنگامی که دو جدول در یک پیوند یک به چند سهیم هستند.  وسیله محرک Query مقادیری از سطر را از یک طرف برای ارتباط دادن سطرها در طرفهای  دیگری تکرار می کند. بعضی مواقع آن دقیقاً چیزی است که شما می خواهید، اما اغلب شما  می خواهید تکرار کردن سطرها را از چندین طریق دسته بندی یا خلاصه سازید. در این  درس، ما به دو روش برای انجام آن که عبارتند از کلید واژه DISTINCT و شرط GROUP BY  نگاه خواهیم کرد.</p>
<p><strong>شناختن SELECT DISTINCT</strong><br />
یکی از اهداف  طرح پایگاه داده ارتباطی برداشتن وابستگی داده ها می باشد. اما بیشتر پایگاه داده  به طور ضروری مقادیر واقعی در چندین سطر را شامل خواهد شد. یک جدولی که شامل  اطلاعات آدرس مشتری می باشد برای مثال احتمالاً کد ایالتی و کشوری برای چندین سطر  خواهد داشت که نه اشتباه و نه تکراری می باشد. نظر به اینکه هر کد ایالتی نسبتی از  یک مشتری می باشد. به همین نحو یک جدول از چندین جهت از یک ارتباط یک به چند ممکن  است هر مقدار کلید خارجی معلوم که چندین بار تکرار شده را داشته باشد. آن برای یک  ارتباط یکپارچه از پایگاه داده لازم می باشد. اگر چه این تکرار می تواند بعضی مواقع  نتایج Query را نامطلوب سازد. یک جدول مشتری با ۱۰۰۰ سطر با ۹۰ درصد مشتری از  کالیفرنیا، Query زیر کد CA را ۹۰۰۰ بار خواهد باز گرداند که اصلاً یک نتیجه مفیدی  نمی باشد.<br />
SELECT State From Customer<br />
کلید واژه Distinct در این موقعیت شما  را کمک می کند. Distinct که درست بعد از SELECT قرار می گیرد به SQL Server دستور  داده که سطرهایی چندگانه در قرارگیری نتایج را حذف نماید. بنابراین Query زیر هر کد  ایالتی را فقط یک بار باز می گرداند به طور وضوح لیستی که شما جستجو می  کنید.<br />
SELECT DISTINCT State From Customer<br />
راهنمایی: همتای کلید واژه  Distinct ، All می باشد که SQL Server را برای بازگرداندن همه سطرها آگاه می سازد  خواه آن واحد باشد یا خیر. از موقعی که این یک عملکرد پیش فرض از یک عبارت SELECT  می باشد All به طور معمول استفاده نمی گردد. اما شما ممکن تصمیم بگیرید به در  برداشتن آن اگر ساختار دستور Query را بیشتر قابل فهم  سازید.</p>
<p><strong>استفاده کردن از SELECT DISTINCT</strong><br />
کلید واژه  Distinct می تواند در عبارت SQL از Query Distinct یا به وسیله تنظیمات Properties  از Query مشخص گردد.</p>
<p><strong>ایجاد کردن Distinct Query با استفاده از قاب  دیاگرام</strong><br />
۱- Query Designer را برای جدول Oils به وسیله کلیک راست کردن  نام جدول در قاب Details باز کرده روی جدول Open رفته و همه سطرهای بازگشتی را  انتخاب می کنیم.<br />
۲- قاب دیاگرام را به وسیله کلیک کردن روی دکمه قاب دیاگرام در  نوار ابزار Query Designer نشان می دهیم.<br />
۳- دکمه Add Table را کلیک می کنیم.  Query Designer کادر محاوره ای Add Table را نشان می دهد.<br />
۴- Plantparts را در  لیست جدول انتخاب می کنیم و سپس Add را کلیک می کنیم. Query Designer جدول را به  Query اضافه می کند.<br />
۵- Close را برای بستن کادر محاوره ای کلیک می کنیم.<br />
۶-  دکمه قاب SQL را در نوار ابزار Query Designer کلیک می کنیم. قاب SQL ، Query  Designer را نشان می دهد.<br />
۷- علامت * بعد از کلید واژه SELECT را حذف می  کنیم.</p>
<p>۸- دکمه قاب SQL را در نوار ابزار Query Designer کلیک می کنیم (OK را  اگر Query Designer یک متن خطا درباره ساختار دستور عبارت SELECT نشان می دهد کلیک  می کنیم). Query Designer قاب SQL را پنهان می سازد.<br />
مهم: زمانی که شما Query  Designer را باز می کنید حالت SQL پیش فرض معمولاً SELECT* می باشد. ستون ویژه در  قاب دیاگرام به سبب اینکه آنها به لیست ستون اضافه می شوند انتخاب می گردند.  مایکروسافت این را یک ویژگی در نظر می گیرد.<br />
۹- در قاب دیاگرام فقط ستون  Plantpart را از جدول Plantparts برای نشان دادن انتخاب می کنیم.</p>
<p>۱۰- دکمه  Run را برای اجرای مجدد Query کلیک می کنیم. Query Designer هر مقدار Plantpart را  چندین بار لیست می کند.</p>
<p>۱۱- در یک ناحیه خالی از قاب دیاگرام کلیک راست کرده  و Properties را انتخاب می کنیم. Query Designer کادر محاوره ای Properties را نشان  می دهد.</p>
<p>۱۲- گزینه مقادیر Distinct را انتخاب می کنیم.</p>
<p>۱۳- Close را  برای بستن کادر محاوره ای کلیک می کنیم.<br />
۱۴- دکمه Run را برای اجرای مجدد Query  کلیک می کنیم. Query Designer هر مقدار را فقط یک بار نشان می  دهد.</p>
<p><strong><span style="color: fuchsia;">ایجاد کردن یک SELECT DISTINCT با استفاده  از قاب SQL<br />
</span></strong>1- قاب دیاگرام را پنهان ساخته و قاب SQL را نشان می  دهیم.<br />
۲- عبارت SELECT موجود را با متن زیر جایگزین می کنیم.<br />
SELECT DISTINCT  Plant Types Plant Type<br />
FROM Oils INNER Join<br />
Plant Types ON Oils Plant Type  ID=Plant Types Plant Type ID</p>
<p>3- دکمه Run را برای اجرا مجدد Query کلیک می  کنیم. Query Designer مقدار PlantType متمایز که به وسیله جدول Oils بازگشت شده را  نشان می دهد.</p>
<p><strong>شناختن GROUP BY</strong><br />
کلید واژه Distinct  امر می کند. SQL Server را به بازگرداندن سطرهای واحد نظر به اینکه شرط GROUP BY ،  SQL Server را به ترکیب سطرها با مقادیر یکسان در ستون یا ستونهای مشخص شده در شرط  در داخل سطر تکی امر می کند.<br />
مهم: هر ستونی که در شرط GROUP BY شامل می باشد  باید در خروجی Query شامل گردد.<br />
شرط GROUP BY اغلب با یک aggregate Function  استفاده می گردد. یک aggregate Function محاسبات در مجموعه از مقادیر را به انجام  می رساند و یک نتیجه تک مقداری را باز می گرداند. رایج ترین گزینه های به هم پیوسته  استفاده شده در پرس و جوهایGROUP BY ، MIN می باشد که کوچکترین مقادیر را در مجموعه  باز می گرداند. MAX که بزرگترین مقادیر در مجموعه را باز می گرداند و COUNT که  تعدادی از مقادیر را در یک مجموعه باز می گرداند.</p>
<p><strong>استفاده کردن از  GROUP BY</strong><br />
شرط GROUP BY می تواند مشخص شود با استفاده کردن از هر یک از  قابها در Query Designer ، اما قابهای SQL و Grid بیشترین کنترل را فراهم می  سازد.</p>
<p><strong>ایجاد کردن یک GROUP BY Query با استفاده از قاب  Grid<br />
</strong>1- قاب SQL را پنهان ساخته و قاب Grid را نشان می دهیم.</p>
<p>۲-  ستون OilName را برای Query اضافه می کنیم.</p>
<p>۳- دکمه Group By را در نوار  ابزار Query Designer کلیک می کنیم. Query Designer یک ستون Group By برای شبکه  اضافه می کند و هر دوی مقادیر را برای Group By قرار می دهد.</p>
<p>۴- سل Group By  را برای تغییر دادن سطر OilName به Count تغییر می دهیم.</p>
<p>۵- دکمه Run را  برای اجرا مجدد Query کلیک می کنیم. Query Designer تعدادی از Oils را برای هر  PlantType نشان می دهد.</p>
<p><strong>ایجاد کردن یک Group By Query با  استفاده از قاب SQL</strong><br />
1- قاب شبکه را پنهان ساخته و قاب SQL را نشان می  دهیم.</p>
<p>۲- عبارت SELECT موجود را با متن زیر جایگزین می کنیم.<br />
SELECT  Plant parts Plant part Count (Oils Oil Name) As Number Of Oils<br />
FROM Oils  INNER Join<br />
Plant parts ON Oils Plant part ID=Plant parts Plant part  ID<br />
GROUP BY Plant parts Plant part</p>
<p>3- دکمه Run را برای اجرای مجدد  Query کلیک می کنیم. Query Designer مقدار oils برای هر Plantpart نشان می  دهد.</p>
<p><strong>استفاده کردن از شرط HAVING</strong><br />
شرط Having سطرهای  بازگردانده شده به وسیله شرط GROUP BY را از همان راهی که یک شرط Where سطرهای  بازگردانده شده را به وسیله شرط SELECT محدود می سازد. هر دو شرط Where و Having می  تواند در یک عبارت SELECT شامل شود که شرط Where قبل از گروه بندی علمیات و شرط  Having بعد از آن به کار برده می شود. ساختار دستور شرط Having همانند شرط Where می  باشد به استثنای اینکه شرط Having می تواند شامل یکی از توابعهای به هم پیوسته باشد  که در لیست ستونها از شرط SELECT قرار می گیرد. اگر چه شما باید توابع به هم پیوسته  را تکرار کنید. برای مثال شرط Having که در حالت زیر استفاده شده صحیح می  باشد.<br />
SELECT Plant parts Plant part Count (Oils Oil Name) As Number Of  Oils<br />
FROM Oils INNER Join<br />
Plant parts ON Oils Plant part ID=Plant Parts  Plant part ID<br />
GROUP BY Plant parts Plant part<br />
HAVING Count (Oils Oil  Name)&gt;3<br />
اگر چه شما نمی توانید از اسم مستعار برای تابع Count در شرط Having  استفاده کنید. بنابراین شرط Having زیر درست نخواهد بود.<br />
HAVING Number Of  Oils&gt;3</p>
<p><strong>ایجاد کردن یک Query با استفاده از HAVING در قاب  Grid</strong><br />
1- قاب SQL را پنهان ساخته و قاب Grid را نمایش می  دهیم.</p>
<p>۲- ۵Add&gt; را برای سل مورد نظر از ستون oil Name قرار می دهیم.</p>
<p>۳- دکمه Run در نوار ابزار Query Designer را برای اجرای مجدد Query کلیک  می کنیم.</p>
<p><strong>ایجاد کردن یک Query با استفاده از HAVING در قاب SQL<br />
</strong>1- قاب Grid را پنهان ساخته و قاب SQL را نشان می  دهیم.</p>
<p>۲- شرط Having را برای HAVING (Count (Oils Oil  Name)&lt;5) تغییر می دهیم.</p>
<p>۳- دکمه Run در نوار ابزار Query Designer را  برای اجرای مجدد Query کلیک می کنیم. Query Designer فقط آن Plantparts که Oils  اشتراکی کمتر از ۵ دارد را نشان می دهد.</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/reviewsql8711021629-1304/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ارتباط دادن جداول</title>
		<link>http://www.irandevelopers.com/programming/relationmanagementsql8711021627-1302/</link>
		<comments>http://www.irandevelopers.com/programming/relationmanagementsql8711021627-1302/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 12:58:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[اس کیو ال سرور میکروسافت]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پایگاه های داده و بانکهای اطلاعاتی]]></category>

		<guid isPermaLink="false">http://www.irandevelopers.com/?p=1302</guid>
		<description><![CDATA[ارتباط دادن جداول Query هایی که در فصل ۳ بررسی گردید سطرهایش از یک جدول تکی ترسیم گردیده است اما Query ها به ویژه می توانند مفید باشند برای ترکیب ستونهایی از چندین جدول یا نما که Joining Tables نامیده می شود و آن در شرطهای FROM یا WHERE از حالت SELECT انجام می گیرد. [...]]]></description>
			<content:encoded><![CDATA[<div class="txt"><span style="font-family: Tahoma;"></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; direction: rtl; unicode-bidi: embed; text-align: right;" dir="rtl"><strong><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA">ارتباط دادن  جداول</span></strong><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"></p>
<p></span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> هایی که در فصل ۳ بررسی گردید سطرهایش از یک جدول تکی ترسیم گردیده  است اما </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> ها به ویژه می توانند مفید باشند برای ترکیب ستونهایی از چندین  جدول یا نما که </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Joining Tables</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نامیده می شود و آن در شرطهای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> یا </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">WHERE</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> از حالت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> انجام می گیرد. در این فصل ما بر روی ایجاد ارتباطها با استفاده از  شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> که روشی توصیه شده است متمرکز خواهیم شد.</p>
<p><strong>شناختن شرط </strong></span><strong><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span></strong><strong><span style="font-size: 9pt; font-family: Tahoma;"> </span></strong><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
همان طوری که ما دیده ایم، ساختار  پایه ای از شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> به آسانی نام از یک جدول یا نما ساده را فراهم می سازد. اما برای  دسترسی پیدا کردن به توانایی از مدل ارتباطی، ما باید به بازیابی ستونها از جداول  چندگانه و نماها در یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> خاص قادر باشیم. شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> یک مکانیزمی برای انجام آن با استفاده از ساختار دستور  زیر:</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROMON</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
اپراتور پیوند انواع پیوند برای  به انجام رسیدن را تشریح می کند. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Server SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> پیوندهای داخلی و خارجی همه نوسانات را پشتیبانی می کند، همان طوری  که در بخش بعدی خواهیم دید. شرایط پیوند یک تعبیری می باشد شبیه به ملاک که در شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">WHERE</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> استفاده شده است. آن مشخص می کند که چگونه سطرها در دو جدول ارتباط  خواهند یافت. بیشتر پردازشگرهای ربطی روی پایه ای از عبارتهای برابری مانند </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">B</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> ستون = </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">A</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> ستون به انجام می رسند. اما </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Server</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> هر اپراتور منطقی را پشتیبانی کرده و شرایط پیوند می تواند به طور  دلخواه پیچیده باشد، با عبارات چندگانه پیوند یافته که از حرف ربط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">AND</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> یا </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OR</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> از همان راهی که یک شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">WHERE</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> می تواند ملاک انتخابی چندگانه را شامل باشد استفاده کند. عبارت  پیوند می تواند برای اضافه کردن جداول و نماهای اضافی برای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> تکرار شود. ساختار دستور برای پیوند جداول چندگانه عبارت است از: </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">ON</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
یک حدود فرضی ۲۵۶ جدولی برای هر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> وجود دارد، اما آن به حد زیاد غیر محتمل است که شما اصلاً نیاز به  ۵ یا ۶ نیاز ندارید و ۲ یا ۳ بیشتر معمول می باشد. در حقیقت اگر شما نیاز به اتصال  بیش از ۱۰ جدول در یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> باشید، شما باید به دقت طرح پایگاه داده آن را نگاه کرده برای  اینکه مطمئن شوید که آن به طور صحیح به حالت عادی در آمده است.</p>
<p><strong>ایجاد  کردن پیوندها</strong><br />
پیوندها می توانند در </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> با استفاده هر کدام از قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Grid</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> یا قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> ایجاد گردند. قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Grid</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> اغلب آسانتر می باشد اگر شما جداولی که رسماً در طرح پایگاه داده  مربوط شده اند پیوند دهید، از موقعی که </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> پیوندی بین آنها به طور خودکار ایجاد خواهد کرد. اما به طور معمول  قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> با انعطاف پذیری بیشتر برای شما فراهم می گردد.</p>
<p><strong>نامگذاری  شئی ها</strong><br />
زمانی که شما با یک جدول یا نمای تکی کار می کنید آنجا می تواند هیچ  ابهامی در حدود منابع از یک ستون نداشته باشد از موقعی که همه نام ستونها در یک  جدول باید منحصر به فرد باشند. هنگامی که شما برای بار اول کار کردن با چندین جدول  در یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را شروع می کنید یا شما باید برای مشخص کردن نام ستونها صریحاً  مواظب باشید. مشخصات کامل برای هر شئی پایگاه داده چهار معرفه را در بردارد. نام  سرور، نام پایگاه داده، نام صاحب، نام شئی. معرفه ها به وسیله پریودها جداسازی می  گردند. بنابراین نام واجد شرایط از جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> در سیستم من </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Bunny.Aromatherary.dbo.Oil</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> می باشد. مقداری از شئی ها مانند نماها و جداول شامل شئی های دیگر  می باشد. برای رجوع به یکی از این شئی های گنجانده شده (در این حالت، ستونها). شما  به آسانی نام آن را به نام شئی ضمیمه می کنید. نام واجد شرایط کامل از ستون </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OilID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> از جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils  (Bunny.Aromatherapy.dbo.Oils.Oil ID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA">) می باشد. خوشبختانه شما فقط نیاز به مشخص کردن کافی از درجه بندی  ابهام اجتناب پذیر دارید.<br />
در یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> مبنی بر یک جدول تکی، برای مثال نام ستون به وسیله خودش دارای  مشخصات کافی می باشد. اگر یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> به بیش از یک جدول مربوط گردد، اگر چه جداول دارای ستونهایی با یک  نام باشد. شما باید نام جدول را در نام شئی (</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Object) Oils.OilID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> , </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OilPropertise.OilID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> که تمایز را به طور کامل روشن می سازد لحاظ  کنید.</p>
<p><strong>پیوندهای داخلی</strong><br />
بیشترین فرمهای رایج پیوند یک پیوند داخلی  می باشد. یک پیوند داخلی فقط آن سطرهایی که شرایط پیوند </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">TRUE</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را باز می گرداند باز خواهد گرداند.</p>
<p>پیوند دو جدول با  استفاده از قاب دیاگرام<br />
۱- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را به وسیله کلیک راست کردن نام آن در قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Details</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> باز کرده روی جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Open</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> رفته و همه سطرهای بازگشتی را انتخاب می کنیم.</p>
<p>۲- قاب  دیاگرام را به وسیله کلیک کردن دکمه قاب دیاگرام روی نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نشان می دهیم.</p>
<p>۳- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را روی نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کادر محاوره ای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد.</p>
<p>۴- جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantTypes</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در لیست جدول انتخاب کرده و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL Server</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> جدول را به </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> اضافه می کند.<br />
۵- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Close</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای بستن کادر محاوره ای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم.</p>
<p>۶- دکمه قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد.</p>
<p>۷- علامت * را بعد از کلید واژه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> حذف می کنیم.</p>
<p>۸- دکمه قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. (</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OK</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را کلیک کرده اگر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> یک متن خطا درباره ساختار دستور </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نشان دهد). </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را پنهان می سازد.<br />
مهم: زمانی که شما </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را باز می کنید، حالت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> معمولاً * را انتخاب می کند. انتخاب کردن ستونهای مشخص در قاب  دیاگرام سبب می شود که آنها به لیست ستون اضافه شوند. مایکروسافت آن را به صورت یک  خصیصه در نظر می گیرد.</p>
<p>۹- در قاب دیاگرام ستونهای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OilID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OilName</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و ستون </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantType</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantType</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> انتخاب می کنیم.</p>
<p>۱۰- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> روی نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> مقادیر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Planttype</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای هر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oil</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نشان می دهد.</p>
<p><span style="color: #6600ff;">ارتباط دو  جدول به وسیله قاب </span></span><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA">1- قاب دیاگرام را پنهان  کرده و قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را به وسیله کلیک کردن دکمه ها روی نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نشان می دهیم.</p>
<p>۲- حالت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> موجود را با عبارت زیر جایگزین می کنیم.<br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT Oils.OilID,Oils.Oil  Name,PlantParts.PlantPart</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM OilsINNER</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Join</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantParts ON  Oils.PlantPartID=PlantParts.PlantPart ID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"></p>
<p>3- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> مقادیرها برای هر سطر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils Plant Part</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد.</p>
<p><span style="color: #6600ff;">ارتباط  جداول چندگانه با استفاده از قاب دیاگرام<br />
</span>۱- قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را پنهان کرده و قاب دیاگرام را نمایش می دهیم.</p>
<p>۲- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add  Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را روی نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کادر محاوره ای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد.</p>
<p>۳- جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Planttypes</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در لیست جداول انتخاب می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را کلیک کرده </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL Server</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> جدول را به </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> اضافه می کند.<br />
۴- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Close</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای بستن کادر محاوره ای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم.</p>
<p>۵- در قاب دیاگرام ستون </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Planttype</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Planttypes</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اضافه کردن ستون به </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم.</p>
<p>۶- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> هر دوی ستونهای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantPart</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Planttype</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای هر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oil</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نشان می دهد.</p>
<p><span style="color: #6600ff;">ارتباط  جداول چندگانه با استفاده از قاب </span></span><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA">1- قاب دیاگرام را پنهان  کرده و قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهیم.<br />
۲- عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> موجود را با عبارت زیر جایگزین می کنیم.<br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT Oils.Oil ID.Oils.Oil  Name.odors.odor</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">INNER Join Oilodors on  Oils.OilID=Oil odors.OilID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">INNER Join odors on</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oilodors.odor  ID=odors.odorID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"></p>
<p>3- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم.</p>
<p>۴- پنجره </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را می بندیم.</p>
<p><span style="color: #6600ff;">ارتباطات خارجی </span><br />
بعضی مواقع شما می خواهید که یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> همه سطرها یک یا چندین جدول را باز گرداند، خواه آنها سطرهای  ارتباطی در جداول دیگر داشته باشند و یا خیر. که با استفاده از یک ارتباط خارجی به  انجام رسیده که می تواند سه گونه باشد: چپ، راست و کامل. یک ارتباط خارجی همه  سطرهایی از جدول چپ در شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">JOIN</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و فقط آن سطرهایی از جدول راست برای اینکه شرایط ارتباط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">TRUE</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> می باشد را باز خواهد گرداند.<br />
دستور ساختار برای یک ارتباط  خارجی عبارت است از:<br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM Left Table</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Left Outer Join Right able  on</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
برای مثال عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> زیر، همه سطرها در جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را باز می گرداند و مقادیر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantPart</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> از جدول آنجایی که </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantPart</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> مشخص شده جفت می شود. آنجا سطرهای ارتباطی در جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Plant Parts</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> وجود ندارد و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query </span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA">، </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Null</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را به عنوان مقدار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">PlantPart</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای آن سطر باز می گرداند.<br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT Oils.Oil Name.Plant  Parts.Plant Part</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM Oils Left Outer</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Join</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Plant Parts on Oils.Plant Part  ID=Plant Parts.Plant Part ID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
یک ارتباط خارجی سمت راست مقابل  یک ارتباط خارجی سمت چپ می باشد. آن همه سطرها از جدول راست در شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">JOIN</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را باز می گرداند و مقادیر ارتباطی را از جدول چپ ارتباط می دهد.  نظر به اینکه یک ارتباط کاملاً خارجی همه سطرها از دو جدول را با هم هماهنگ می سازد  آنجایی که امکان پذیر باشد.</p>
<p><span style="color: #6600ff;">ایجاد کردن یک  ارتباط خارجی چپ با استفاده از قاب دیاگرام</span><br />
۱- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> به وسیله کلیک راست کردن نام جدول در قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Details</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> باز کرده، روی جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Open</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> رفته و همه سطرهای بازگشتی را انتخاب می کنیم.<br />
۲- قاب دیاگرام  را نشان می دهیم.</p>
<p>۳- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کادر محاوره ای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add Table</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد.</p>
<p>۴- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oil Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> در لیست جدول را انتخاب و سپس </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Add</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> جدولی برای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> اضافه می کند.<br />
راهنمایی: شما می توانید یک ارتباط خارجی چپ با  دو جدول ایجاد کنید. ما حالت سوم را در ایجاد استفاده می کنیم با جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OilCautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> که به عنوان یک جدول الحاقی عمل می کند که ارتباط چندگانه بین </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را حل می کند.<br />
۵- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Close</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای بستن کادر محاوره ای کلیک می کنیم.</p>
<p>راهنمایی: شما  می توانید جداول را در قاب دیاگرام برای پاک کردن نمایشگر درج کنید.</p>
<p>۶- دکمه  قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد.</p>
<p>۷- علامت * را در کلید واژه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> حذف می کنیم.</p>
<p>۸- دکمه قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. (</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OK</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را کلیک کرده اگر </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> یک متن خطا درباره ساختار از عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نشان دهد) </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را پنهان می سازد.<br />
مهم: زمانی که شما </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را باز می کنید عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> پیش فرض معمولاً * را انتخاب می کند. ستون ویژه که در قاب دیاگرام  انتخاب شده سبب می شود که آنها برای لیست ستون اضافه شوند. مایکروسافت این را به  عنوان یک ویژگی در نظر می گیرد.</p>
<p>۹- در قاب دیاگرام، ستونها از </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OilName</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">OilID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را از جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و ستون </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Caution</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را از جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای خروجی انتخاب می کنیم.</p>
<p>۱۰- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> فقط آن </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> که </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> دارد را نشان می دهد.</p>
<p>۱۱- خط ارتباطی بین جداول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oil  Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> و </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را به وسیله کلیک کردن آن انتخاب می کنیم و سپس دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Properties</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کادر محاوره ای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Join Properties</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد.</p>
<p>۱۲- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">All Rows From Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را انتخاب می کنیم.</p>
<p>راهنمایی: همه سطرها از </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oil Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> یک ارتباطی خارجی سمت راست ایجاد خواهد کرد و هر دوی گزینه ها را  انتخاب کرده که یک ارتباط کامل خارجی ایجاد می کند.<br />
۱۳- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Close</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای بستن کادر محاوره ای کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> خط ارتباطی را برای انعکاس مشخصات ارتباطی جدید تغییر می  دهد.</p>
<p>۱۴- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> همه سطرها در جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهد و مقادیر از جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Cautions</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را ارتباط می دهد.</p>
<p><span style="color: #6600ff;">ایجاد یک  ارتباط خارجی سمت راست با استفاده از قاب </span></span><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA">1- قاب دیاگرام را پنهان  کرده و قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نشان می دهیم.</p>
<p>۲- حالت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> موجود را با عبارت زیر جایگزین می کنیم.<br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT Oils.Oil</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Name.Properties.Property</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Right OUTER JOIN Oil  Properties</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">on</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils.Oil ID=Oil Properties.Oil  ID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">INNER JOIN Properties on</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oil</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Properties.Property  ID=Properties.Property ID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"></p>
<p>3- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> شامل همه سطرها از جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oil Properties</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> با مقادیر ارتباطی از جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Oils</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> می باشد.</p>
<p>۴- پنجره </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را می بندیم.<br />
<strong><span style="color: #6600ff;"><br />
</span></strong></span><strong><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" dir="ltr">UNIONS</span></strong><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
آخرین نوع از ارتباط  به صورت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Union</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> شناخته می گردد. یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Union</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نتایجی از دو عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> متمایز را در داخل یک تنظیم از سطرها ترکیب می کند. ارتباطات داخلی  و خارجی ستونهایی از دو جدول درگیر شده در یک سطر تکی را با هم ترکیب می کند یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Union</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> سطرهایی از دو جدول در یک ستون تکی را به هم ترکیب می کند. شما می  توانید تصور کنید که تنظیمات دو سطر را گرفته و یکی را در بالای دیگری باز گردانید.  اگر چه قاعده اصلی از سطرها باز گردانده شده به وسیله شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">ORDER BY</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> مشخص می گردد. ساختار دستور یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Union</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> از پیوندها متفاوت می باشد. یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Union</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> ساختار دستوری به صورت زیر دارد:<br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">UNION [All</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA">]<br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">FROM</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
[</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">ORDER</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">BY</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> ]<br />
شما می توانید بسیاری از حالتهای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">UNION SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را همان طوری که شما برای یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> دوست دارید اضافه کنید. (این موضوع برای ۲۵۶ جدول محدود می باشد)  اما همه عبارتهای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> باید همان تعداد از ستونها را از انواع سازگار یا شبیه در همان  دستور باز گرداند. اولین عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نامهای ستون را مشخص خواهد کرد و شرط </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">ORDER BY</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> از آخرین عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> دستور </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Sort</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را تعیین خواهد کرد. به طور پیش فرض، </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL Server</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> سطرهای چندگانه ای از نتایج را از یک </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Union Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> برمی دارد. اگر شما </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Union All</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را مشخص کنید، ولی سطرهای چندگانه حفظ خواهد شد.</p>
<p><span style="color: #6600ff;">ایجاد کردن یک </span></span><span style="font-size: 9pt; color: #6600ff; font-family: Tahoma;" dir="ltr">UNION</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
1- </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را به وسیله کلیک کردن جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Properties</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> در قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Details</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> باز کرده روی جدول </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Open</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> رفته و همه سطرهای بازگشتی را انتخاب می کنیم.<br />
۲- قاب </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را نشان می دهیم.</p>
<p>۳- حالت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SQL</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> موجود را با عبارت زیر جایگزین می کنیم.</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr"></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0pt; direction: rtl; unicode-bidi: embed; text-align: left;" dir="rtl" align="right"><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT Property Table AS Table  Name.Property ID AS</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">ID</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Property AS Quality From  Properties</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">UNION</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT odor Table.odor  ID</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">odor From odors</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"><br />
</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">ORDER BY Quality</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"></p>
<p>4- دکمه </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Run</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> در نوار ابزار </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;"> </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را برای اجرای </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> کلیک می کنیم. </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">Query Designer</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> نتایجی از دو عبارت </span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr">SELECT</span><span style="font-size: 9pt; font-family: Tahoma;" lang="AR-SA"> را با هم ترکیب می کند.</span><span style="font-size: 9pt; font-family: Tahoma;" dir="ltr"></span></p>
<p></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.irandevelopers.com/programming/relationmanagementsql8711021627-1302/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

