ابزار SQLCMD خط
فرمان موجود در SQL Server جهت دسترسی سریع و استفاده از دستورات T-SQL،
فراخوانی Stored Procedures و از این نوع دستهها با استفاده از ابزار CMD و
یا PowerShell و ... میباشد. در بخش اول این مقالات قصد دارم با استفاده
از ابزار SQLCMD نحوه ارتباط با پایگاه داده SQL Server به صورت اعتبار
سنجی از طریق وبندوز و SQL Server بپردازیم.
سلام
مقاله زیر به خوبی طرز استفاده از Execution Plan را آموزش میدهد.
دو کتاب زیر، جهت مطالعه و بهینه سازی در ایجاد Query مفید است:
موفق باشید.
پیش از هرچیز به شما پیشنهاد میکنم؛ بار دیگر کد سیشارپ درس نخست را در پروژهی خود کپی کنید و سپس Publish را بزنید. پس از ارسال آن مطلب، تغییراتی در جهت بهینهسازی کد دادم که به نظرم بهتر است شما نیز در پروژهی خود به کار برید.
چرا از این نوع داده استفاده کنیم؟
نخستین پرسشی که ممکن است برای شما پیش بیاید این است که چرا بهتر است از این نوع داده استفاده کنیم. برای پاسخ به این پرسش باید راهکارهای گذشته را بررسی کنیم. معمولاً طراحان پایگاه دادهها برای استفاده از تاریخ خورشیدی، زمان را به صورت میلادی ثبت میکنند؛ سپس با یک scalar-valued function زمان درج شده را به خورشیدی تبدیل میکنند. در این صورت میتوان با یک تابع کوچک دیگر بخش مربوط به ساعت را نیز از همان ستون به دست آورد. در این صورت میتوانیم از کلیهی متدهای مربوط به DateTime در SQL از جمله افزایش و کاهش و تفاضل دو تاریخ بهره برد. برخی دیگر از طراحان، ستونی از نوع (char(10 در نظر میگیرند و تاریخ خورشیدی را به صورت دهکاراکتری در آن ذخیره میکنند. این روش هرچند نیاز به تبدیل به خورشیدی را ندارد ولی کلیهی مزایایی که در استفاده از DateTime به آنها دسترسی داریم از دست میدهیم. افزون بر این جهت نگهداری زمان باید یک فیلد دیگر از نوع کاراکتری و یا در نگارشهای نوینتر از نوع time تعریف کنیم. برخی دیگر از هر دو را در کنار هم استفاده میکنند و در واقع جهت سرعت بالاتر نمایش و بررسی دادهها از طریق محیط SQL Server از فیلد کاراکتری تاریخ خورشیدی و برای مقایسه و بدست آوردن ساعت از فیلد نوع DateTime استفاده میکنند.
از نظر فضای اشغالشده نوع DataTime، هشت بایت، smalldatetime (در صورت استفاده) 4 بایت و فیلد 10 کاراکتری تاریخ 10 بایت فضا اشغال میکند در صورتی که نوع JalaliDate با درنظر گرفتن همهی مزایای انواع دادهی استفادهشده برای تاریخ، فقط 8 بایت فضا اشغال میکند. با استفاده از این نوع به راحتی دادهی تاریخ را بر اساس تقویم ایرانی اعتبارسنجی میکنید و بخشهای مختلف زمان از سال تا ثانیه را با یک متد به دست میآورید. میتوانید به راحتی به تاریخ خود زمانی را بیفزایید یا بکاهید و در گزارشها بدون نگرانی از تبدیل درست استفاده کنید. چون کدباز است میتوانید با کمی حوصله امکانات دیگر مد نظر خود را به آن بیفزایید و از آن در SQL بهره ببرید.
چگونه این نوع داده را حذف کنم!؟
شما میتوانید به سادگی نوع دادهی ایجادشده توسط CLR را در مسیر زیر بیابید و اقدام به حذف آن نمایید:
همانطور که مشاهده میشود؛ حتی نوع دادهی سیستمی hierarchyid که جهت ساختار سلسلهمراتبی مانند چارت سازمانی یا درخت تجهیزات استفاده میشود؛ نیز یک نوع دادهی CLR است.
آیا راه دیگری نیز برای افزودن این نوع داده به SQL به جز Publish کردن وجود دارد؟
مانند بسیاری دیگر از گونههای پروژه، در اینجا نیز شما یک فایل DLL خواهید داشت. این فایل برپایهی تنظیماتی که شما در قسمت Properties پروژهی خود انجام میدهید ساخته میشود. پس از تغییر مسیر فایل DLL در دستور زیر توسط یک New Query از Database خود، آن را اجرا کنید:
همچنین در صورت ویرایشهای دوباره پروژه از دستور زیر استفاده کنید:
با استفاده از دستورهای زیر میتوانید از چگونگی درج فایلهای افزوده شده آگاه شوید:
تا اینجا SQL Server، دیالال مربوط به پروژه را شناخته است. برای تعریف نوع داده از دستور زیر بهره ببرید:
این کار همانند استفاده از گزینهی Publish در Visual Studio است.
همچنین چنانچه در SQL Server 2012 از منوی راستکلیک پایگاه دادهها روی گزینه Tasks و سپس Generate Scripts را انتخاب کنیم، از مشاهدهی سند ساخته شده، درخواهیم یافت که حتی دستورهای مربوط به ساخت اسمبلی CLR با تبدیل فایل به کد در Scripts وجود دارد و با اجرای آن در سروری دیگر، انتقال مییابد.
دنباله دارد ...
چرا از این نوع داده استفاده کنیم؟
نخستین پرسشی که ممکن است برای شما پیش بیاید این است که چرا بهتر است از این نوع داده استفاده کنیم. برای پاسخ به این پرسش باید راهکارهای گذشته را بررسی کنیم. معمولاً طراحان پایگاه دادهها برای استفاده از تاریخ خورشیدی، زمان را به صورت میلادی ثبت میکنند؛ سپس با یک scalar-valued function زمان درج شده را به خورشیدی تبدیل میکنند. در این صورت میتوان با یک تابع کوچک دیگر بخش مربوط به ساعت را نیز از همان ستون به دست آورد. در این صورت میتوانیم از کلیهی متدهای مربوط به DateTime در SQL از جمله افزایش و کاهش و تفاضل دو تاریخ بهره برد. برخی دیگر از طراحان، ستونی از نوع (char(10 در نظر میگیرند و تاریخ خورشیدی را به صورت دهکاراکتری در آن ذخیره میکنند. این روش هرچند نیاز به تبدیل به خورشیدی را ندارد ولی کلیهی مزایایی که در استفاده از DateTime به آنها دسترسی داریم از دست میدهیم. افزون بر این جهت نگهداری زمان باید یک فیلد دیگر از نوع کاراکتری و یا در نگارشهای نوینتر از نوع time تعریف کنیم. برخی دیگر از هر دو را در کنار هم استفاده میکنند و در واقع جهت سرعت بالاتر نمایش و بررسی دادهها از طریق محیط SQL Server از فیلد کاراکتری تاریخ خورشیدی و برای مقایسه و بدست آوردن ساعت از فیلد نوع DateTime استفاده میکنند.
از نظر فضای اشغالشده نوع DataTime، هشت بایت، smalldatetime (در صورت استفاده) 4 بایت و فیلد 10 کاراکتری تاریخ 10 بایت فضا اشغال میکند در صورتی که نوع JalaliDate با درنظر گرفتن همهی مزایای انواع دادهی استفادهشده برای تاریخ، فقط 8 بایت فضا اشغال میکند. با استفاده از این نوع به راحتی دادهی تاریخ را بر اساس تقویم ایرانی اعتبارسنجی میکنید و بخشهای مختلف زمان از سال تا ثانیه را با یک متد به دست میآورید. میتوانید به راحتی به تاریخ خود زمانی را بیفزایید یا بکاهید و در گزارشها بدون نگرانی از تبدیل درست استفاده کنید. چون کدباز است میتوانید با کمی حوصله امکانات دیگر مد نظر خود را به آن بیفزایید و از آن در SQL بهره ببرید.
چگونه این نوع داده را حذف کنم!؟
شما میتوانید به سادگی نوع دادهی ایجادشده توسط CLR را در مسیر زیر بیابید و اقدام به حذف آن نمایید:
همانطور که مشاهده میشود؛ حتی نوع دادهی سیستمی hierarchyid که جهت ساختار سلسلهمراتبی مانند چارت سازمانی یا درخت تجهیزات استفاده میشود؛ نیز یک نوع دادهی CLR است.
آیا راه دیگری نیز برای افزودن این نوع داده به SQL به جز Publish کردن وجود دارد؟
مانند بسیاری دیگر از گونههای پروژه، در اینجا نیز شما یک فایل DLL خواهید داشت. این فایل برپایهی تنظیماتی که شما در قسمت Properties پروژهی خود انجام میدهید ساخته میشود. پس از تغییر مسیر فایل DLL در دستور زیر توسط یک New Query از Database خود، آن را اجرا کنید:
CREATE ASSEMBLY JalaliDate FROM 'F:\prgJalaliDate.dll' WITH PERMISSION_SET = SAFE;
ALTER ASSEMBLY JalaliDate FROM 'F:\prgJalaliDate.dll'
select * from sys.assemblies select * from sys.assembly_files
CREATE TYPE dbo.JalaliDate EXTERNAL NAME JalaliDate.[JalaliDate];
همچنین چنانچه در SQL Server 2012 از منوی راستکلیک پایگاه دادهها روی گزینه Tasks و سپس Generate Scripts را انتخاب کنیم، از مشاهدهی سند ساخته شده، درخواهیم یافت که حتی دستورهای مربوط به ساخت اسمبلی CLR با تبدیل فایل به کد در Scripts وجود دارد و با اجرای آن در سروری دیگر، انتقال مییابد.
GO /****** Object: SqlAssembly [prgJalaliDate] Script Date: 2013/04/30 08:27:00 ب.ظ ******/ CREATE ASSEMBLY [prgJalaliDate] FROM 0x4D5A90000300000004000000FFFF0000B8000000000000 ..... بقیهی کدها حذف شده WITH PERMISSION_SET = SAFE GO ALTER ASSEMBLY [prgJalaliDate] ADD FILE FROM 0x4D6963726F736F667420432F432B2B204D534620372E30300D0A1A44530..... بقیهی کدها حذف شده AS N'prgJalaliDate.pdb' GO /****** Object: UserDefinedType [dbo].[JalaliDate] Script Date: 2013/04/30 08:27:00 ب.ظ ******/ CREATE TYPE [dbo].[JalaliDate] EXTERNAL NAME [prgJalaliDate].[JalaliDate] GO
دنباله دارد ...
سلام جناب نصیری
مقاله بسیار جالبی بود.(حتی با اینکه متعلق به سه سال پیش بود)
بر اساس مقاله، تریگری برای لاگ کردن تمامی لاگینها به سرور ایجاد کردم. اما به یک مشکل برخوردم:اگر لاگین sysAdmin باشد مشکلی نخواهیم داشت اما اگر تنها public باشد در هنگام لاگین با خطا مواجه خواهیم شد:
مقاله بسیار جالبی بود.(حتی با اینکه متعلق به سه سال پیش بود)
بر اساس مقاله، تریگری برای لاگ کردن تمامی لاگینها به سرور ایجاد کردم. اما به یک مشکل برخوردم:اگر لاگین sysAdmin باشد مشکلی نخواهیم داشت اما اگر تنها public باشد در هنگام لاگین با خطا مواجه خواهیم شد:
Logon failed for login 'm' due to trigger execution.
Changed database context to 'master'.
Changed language setting to us_english. (Microsoft SQL Server, Error: 17892)
Changed database context to 'master'.
Changed language setting to us_english. (Microsoft SQL Server, Error: 17892)
آیا راه حلی وجود دارد؟متاسفانه من نتوانتستم راه حلی پیدا کنم.
با تشکر...
با تشکر...
بازخوردهای پروژهها
بروز رسانی پروژه IrisCms به NET 5.
این پروژه که نزدیک به ۸ سال از عمر آن میگذرد به دات نت 5، EF Core 5 و ASP.NET Core 5 بروز رسانی شد.
سعی شده که کار با حداقل تغییرات انجام شود و کتابخانه Lucene.NET، تنها کتابخانه ای است که حذف شده و برای جستجو از امکانات Full Text Search و Semantic Search پایگاه داده SQL Server استفاده شده است.
هم اکنون هم نسخهی بروز شده در وبسایت https://www.ebooksworld.ir در حال استفاده است. امید است که با این بروزرسانی، بتوان نسخههای بهبود یافته را سریعتر منتشر کرد.
برای دریافت جدیدترین تغییرات، به https://github.com/MehdiSaeedifar/IrisCms مراجعه کنید.
- Drag و Drop کردن در الگوی MVVM | محمد صاحب | www.dotnetdev.info
- اضافه کردن Copy to / Move to به منوی کلیک راست در ویندوز ویستا و ۷ | خدادادی طاقانکی | nodiran.com
- آموزش سی شارپ – قسمت اول | mr.khaliliazar | narbonsoft.com
- شبکه اجتماعی شیرپوینت 2010 ( قسمت اول) | تکتم قربانی | www.parnianportal.com
- نکته : کلمه it در عبارات جستجو حین استفاده از Entity Framework | mojtabasahraei | mojtabasahraei.blogfa.com
- Announcing The jQuery Standards Team | Addy Osmani | blog.jquery.com
- iText.NET - C# Examples | www.ujihara.jp
- VisualSVN Server 2.5.1 Released | www.visualsvn.com
- SubtitleTools 1.9 منتشر شد | subtitletools.codeplex.com
- Visual Studio 2010 SP1 به لیست آپدیتهای اختیاری ویندوز اضافه شد | blogs.msdn.com
- Visual Studio add-in for SQL Server Compact 3.5 and 4.0 | sqlcetoolbox.codeplex.com
- آمار فروش کتاب iText | lowagie.com
- آیا Delphi XE2 برای استفاده در محیط کاری آماده است؟ | www.itwriting.com
- خالق زبان Lisp درگذشت | rss.slashdot.org
- لیست امتحانات مرتبط با SQL Server 2012 | beyondrelational.com
برای ارتقاء برنامههای قدیمی به EF 6 (که با دات نت 4 به بعد سازگار است) دو حالت استفاده از نیوگت را در حین افزودن ارجاعات لازم به کتابخانههای مرتبط با EF باید مدنظر داشت:
الف) از نیوگت استفاده کردهاید
در این حالت فقط کافی است کنسول پاورشل نیوگت را در VS.NET گشوده و دستور update-package را صادر کنید. (1) به صورت خودکار آخرین نگارش EF دریافت شده و (2) همچنین فایل کانفیگ برنامه برای افزودن و به روز رسانی تعاریف مرتبط با نگارش 6 به روز گردیده و (3) همچنین اسمبلی اضافی و قدیمی System.Data.Entity.dll نیز حذف خواهد شد.
ب) اگر از نیوگت استفاده نکردهاید
ابتدا یک فایل متنی ساده را به نام packages.config با محتوای ذیل به پروژه خود اضافه کنید.
سپس بر روی نام Solution در VS.NET کلیک راست کرده و گزینه فعال سازی Restore بستههای نیوگت را فعال کنید (انتخاب گزینه Enable NuGet Package Restore). در ادامه یکبار برنامه را Build کنید تا پوشه packages به صورت خودکار از اینترنت دریافت و بازسازی شود. اکنون دستور update-package را در کنسول پاورشل نیوگت صادر کنید. همان مراحل قسمت الف تکرار خواهند شد.
لازم به ذکر است، اگر پروژه شما از چندین زیر پروژه تشکیل شده است که هر کدام نیز ارجاعی را به اسمبلی EF دارند، باید فایل packages.config فوق را به این زیر پروژهها نیز اضافه کنید. دستور update-package، زیر پروژهها را نیز اسکن کرده و تمام ارجاعات لازم را به صورت خودکار به روز میکند. همچنین اسمبلیهای قدیمی اضافی را نیز حذف خواهد کرد. به این ترتیب با تداخل نگارشهای قدیمی و جدید EF مواجه نخواهید شد.
مشکلاتی که ممکن است با آنها مواجه شوید:
الف) برنامه کامپایل نمیشود
تنها تغییری که جهت کامپایل برنامه باید انجام دهید، استفاده از فضاهای نام جدید بجای فضاهای قدیمی موجود در اسمبلی منسوخ و حذف شده System.Data.Entity.dll است. خود VS.NET قابلیت یافتن فضاهای نام مرتبط را دارد و یا اگر از Resharper نیز استفاده میکنید، این قابلیت بهبود یافته است. در کل مثلا System.Data.EntityState شده است System.Data.Entity.EntityState و امثال آن که به روز رسانی آنها نکته خاصی ندارد .
ب) پروایدر بانک اطلاعاتی مورد استفاده یافت نمیشود
به صورت پیش فرض فقط پروایدر SQL Server به همراه بسته EF 6 است. حتی پروایدر SQL Server CE نیز با آن ارائه نمیشود. اگر از SQL Server CE استفاده کردهاید، باید دستور ذیل را نیز پس از نصب EF 6 صادر کنید:
تا با خطای ذیل مواجه نشوید:
استفاده از نیوگت به روشی که عنوان شد، فایل کانفیگ برنامه شما را جهت افزودن تعاریف پروایدرهای لازم، به روز میکند و این مورد در EF 6 الزامی است (حتما باید تعریف پروایدر در فایل کانفیگ موجود باشد).
ج) خطای عدم وجود کلید خارجی جدول Migration را دریافت میکنید
تا EF 5 نام کلید اصلی جدول MigrationHistory به صورت PK___MigrationHistory میباشد.
در EF 6 این نام شده است PK_dbo.__MigrationHistory
برای حل این مشکل تنها کافی است دستورات ذیل را یکبار بر روی بانک اطلاعاتی خود صادر کنید تا نام مورد نظر به عنوان کلید اصلی جدول migration اضافه شود؛ در غیراینصورت اصلا برنامه اجرا نخواهد شد:
البته یکبار برنامه را اجرا کنید. اگر خطای نبود کلید اصلی یاد شده صادر شد، آنگاه دو دستور فوق را اجرا نمائید.
الف) از نیوگت استفاده کردهاید
در این حالت فقط کافی است کنسول پاورشل نیوگت را در VS.NET گشوده و دستور update-package را صادر کنید. (1) به صورت خودکار آخرین نگارش EF دریافت شده و (2) همچنین فایل کانفیگ برنامه برای افزودن و به روز رسانی تعاریف مرتبط با نگارش 6 به روز گردیده و (3) همچنین اسمبلی اضافی و قدیمی System.Data.Entity.dll نیز حذف خواهد شد.
ب) اگر از نیوگت استفاده نکردهاید
ابتدا یک فایل متنی ساده را به نام packages.config با محتوای ذیل به پروژه خود اضافه کنید.
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="EntityFramework" version="5.0.0" targetFramework="net40" /> </packages>
لازم به ذکر است، اگر پروژه شما از چندین زیر پروژه تشکیل شده است که هر کدام نیز ارجاعی را به اسمبلی EF دارند، باید فایل packages.config فوق را به این زیر پروژهها نیز اضافه کنید. دستور update-package، زیر پروژهها را نیز اسکن کرده و تمام ارجاعات لازم را به صورت خودکار به روز میکند. همچنین اسمبلیهای قدیمی اضافی را نیز حذف خواهد کرد. به این ترتیب با تداخل نگارشهای قدیمی و جدید EF مواجه نخواهید شد.
مشکلاتی که ممکن است با آنها مواجه شوید:
الف) برنامه کامپایل نمیشود
تنها تغییری که جهت کامپایل برنامه باید انجام دهید، استفاده از فضاهای نام جدید بجای فضاهای قدیمی موجود در اسمبلی منسوخ و حذف شده System.Data.Entity.dll است. خود VS.NET قابلیت یافتن فضاهای نام مرتبط را دارد و یا اگر از Resharper نیز استفاده میکنید، این قابلیت بهبود یافته است. در کل مثلا System.Data.EntityState شده است System.Data.Entity.EntityState و امثال آن که به روز رسانی آنها نکته خاصی ندارد .
ب) پروایدر بانک اطلاعاتی مورد استفاده یافت نمیشود
به صورت پیش فرض فقط پروایدر SQL Server به همراه بسته EF 6 است. حتی پروایدر SQL Server CE نیز با آن ارائه نمیشود. اگر از SQL Server CE استفاده کردهاید، باید دستور ذیل را نیز پس از نصب EF 6 صادر کنید:
PM> Install-Package EntityFramework.SqlServerCompact
No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlServerCe.4.0'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
ج) خطای عدم وجود کلید خارجی جدول Migration را دریافت میکنید
The foreign key constraint does not exist. [ PK_dbo.__MigrationHistory ]
ALTER TABLE [__MigrationHistory] ADD CONSTRAINT [PK___MigrationHistory] PRIMARY KEY ([MigrationId]);
برای حل این مشکل تنها کافی است دستورات ذیل را یکبار بر روی بانک اطلاعاتی خود صادر کنید تا نام مورد نظر به عنوان کلید اصلی جدول migration اضافه شود؛ در غیراینصورت اصلا برنامه اجرا نخواهد شد:
ALTER TABLE [__MigrationHistory] drop CONSTRAINT [PK___MigrationHistory]; ALTER TABLE [__MigrationHistory] ADD CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY (MigrationId);
آقای علاقه مند :
در خصوص سوال اول شما (ستونها یا سطرها در Rangeهای مختلف گروه بندی شوند ) این کار را باید با طراحی مناسب جداول Fact,Dimension در DW انجام دهید. به عبارت دیگر جدول Fact در خصوص آمار داشته باشید که یکی از فیلدهای آن مشاهده تلویزیون میباشد و دو عدد Dimension که یکی گروههای سنی و دیگری ساعات میباشد.
حال باید در ETL واکشی مناسبی برای پر کردن جدول Fact داشته باشد.
در خصوص تبدیل MDX Query به T/SQL اطلاع دقیقی ندارم و با قاطعیت نمیتوانم بگویم نه. اما استدلال بنده این میباشد که از آنجایی که MDX Queryها روی پایگاه دادهی MDB نوشته میشوند کاملا متفاوت از T\SQL میباشند که روی مدل رابطه ای کار میکند بنابر این تصور میکنم چنین امکانی نباشد و درضمن در جستجوی وب هم چیزی نیافتم.
در خصوص نمایش نهایی این چنین گزارشاتی چندین روش وجود دارد
- واکشی اطلاعات در Excel
- استفاده از Performance Point Service در Sharepoint (ترجیحا 2013)
- استفاده از کامپوننتهای OLAP در محیط Visual Studio مانند RadarSoft,Dundas,...
- استفاده از نرم افزار هایی که کارشان ساختن گزارشات از MDBها میباشد (CubeWare)
نظرات مطالب
خواندنیهای 27 شهریور
سلام،
به تولبار شما باید یک سری آیتم اضافه شده باشد مطابق تصاویر ذیل:
http://blogs.msdn.com/vsdata/archive/2009/07/24/visual-basic-power-packs-is-included-in-visual-studio-2008-sp1.aspx
و یک نمونه از موارد کاربرد آن
http://msdn.microsoft.com/en-us/vbasic/bb735936.aspx
به تولبار شما باید یک سری آیتم اضافه شده باشد مطابق تصاویر ذیل:
http://blogs.msdn.com/vsdata/archive/2009/07/24/visual-basic-power-packs-is-included-in-visual-studio-2008-sp1.aspx
و یک نمونه از موارد کاربرد آن
http://msdn.microsoft.com/en-us/vbasic/bb735936.aspx