context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);
استفاده از فونت های مختلف در گزارش
استفاده از چندین Context در EF 6 Code first
- ORMها صرفا کارهایی را قادر به انجام هستند که بانک اطلاعاتی مورد استفاده پشتیبانی میکند. برای نمونه در SQL Server امکان تهیه رابطه بین دو جدول از دو بانک اطلاعاتی مختلف وجود ندارد. منظور مثلا ایجاد کلید خارجی بین جداول دو بانک اطلاعاتی مختلف است و نه نوشتن کوئری بین آنها که از این لحاظ مشکلی نیست.
A FOREIGN KEY constraint can reference columns in tables in the same database or within the same table
- هدف از پشتیبانی چند Context در EF 6، تلفیق اینها با هم در قالب یک بانک اطلاعاتی است (مطلب فوق).
- همچنین در EF 6 میتوان چندین Context را به چندین بانک اطلاعاتی مختلف با رشتههای اتصالی متفاوت، انتساب داد. مباحث آغاز بانکهای اطلاعاتی هر کدام جداگانه عمل کرده و مستقل از هم عمل میکنند.
یک مثال جهت اجرا و آزمایش:
Sample25.cs
- اگر میخواهید به انعطاف پذیری Linked servers برسید (مثلا در طی یک کوئری و نه چند کوئری از جداول دو بانک اطلاعاتی مختلف در دو سرور متفاوت کوئری بگیرید)، نیاز خواهید داشت مثلا View یا SP تهیه کنید و سپس اینها را در برنامه مورد استفاده قرار دهید. Viewها با استفاده از T-SQL میتوانند کوئری واحدی از چند بانک اطلاعاتی تهیه کنند. اینبار برنامه هم نهایتا به یک بانک اطلاعاتی متصل میشود و برای آن اهمیتی ندارد که View یا SP به چه نحوی تهیه شده و با چند بانک اطلاعاتی کار میکند.
- تراکنشهای توزیع شده هم نیاز به تنظیمات خاصی در SQL Server دارند و باید MSDTC راه اندازی و تنظیم شود: (^). در غیراینصورت پیام خطای The underlying provider failed on Open. MSDTC on server is unavailable را دریافت خواهید کرد. بعد از آن باید از TransactionScope برای کار همزمان با چند Context استفاده کنید.
string greeting = "Hello, C#";
که در این حالت مجموعهای از کاراکترها را ایجاد خواهد کرد:
- خانههای آن یک ضرب پر نمیشوند بلکه به ترتیب، خانه به خانه پر میشوند.
- قبل از انتساب متن باید باید از طول متن مطمئن شویم تا بتوانیم تعداد خانهها را بر اساس آن ایجاد کنیم.
- همه عملیات آرایهها از پر کردن ابتدای کار گرفته تا هر عملی، نیاز است به صورت دستی صورت بگیرد و تعداد خطوط کد برای هر کاری هم بالا میرود.
string str = "abcde"; char ch = str[1]; // ch == 'b' str[1] = 'a'; // Compilation error! ch = str[50]; // IndexOutOfRangeException
string a="Hello \"C#\""; string b="Hello \r\n C#"; //مساوی با اینتر string c="C:\\a.jpg"; //چاپ خود علامت \ -مسیردهی
string c=@"C:\a.jpg";// == "C:\\a.jpg"
string source = "Some source"; string assigned = source;
string hel = "Hel"; string hello = "Hello"; string copy = hel + "lo";
string hello = "Hello"; string same = "Hello";
برای اطلاعات بیشتر در این زمینه این لینک را مطالعه نمایید.
Console.WriteLine(word1.Equals(word2, StringComparison.CurrentCultureIgnoreCase));
string score = "sCore"; string scary = "scary"; Console.WriteLine(score.CompareTo(scary)); Console.WriteLine(scary.CompareTo(score)); Console.WriteLine(scary.CompareTo(scary)); // Console output: // 1 // -1 // 0
string alpha = "alpha"; string score1 = "sCorE"; string score2 = "score"; Console.WriteLine(string.Compare(alpha, score1, false)); Console.WriteLine(string.Compare(score1, score2, false)); Console.WriteLine(string.Compare(score1, score2, true)); Console.WriteLine(string.Compare(score1, score2, StringComparison.CurrentCultureIgnoreCase)); // Console output: // -1 // 1 // 0 // 0
نکته : برای مقایسه برابری دو رشته از متد Equals یا == استفاده کنید و فقط برای تعیین کوچک یا بزرگ بودن از compareها استفاده نمایید. دلیل آن هم این است که برای مقایسه از فرهنگ culture فعلی سیستم استفاده میشود و نظم جدول یونیکد را رعایت نمیکنند و ممکن است بعضی رشتههای نابرابر با یکدیگر برابر باشند. برای مثال در زبان آلمانی دو رشته "SS" و "ß " با یکدیگر برابر هستند.
عبارات با قاعده Regular Expression
string doc = "Smith's number: 0898880022\nFranky can be " + "found at 0888445566.\nSteven's mobile number: 0887654321"; string replacedDoc = Regex.Replace( doc, "(08)[0-9]{8}", "$1********"); Console.WriteLine(replacedDoc); // Console output: // Smith's number: 08******** // Franky can be found at 08********. // Steven' mobile number: 08********
اتصال رشتهها در Loop
DateTime dt = DateTime.Now; string s = ""; for (int index = 1; index <= 20000; index++) { s += index.ToString(); } Console.WriteLine(s); Console.WriteLine(dt); Console.WriteLine(DateTime.Now); Console.ReadKey();
- قسمتی از حافظه به طور موقت برای این دور جدید حلقه، گرفته میشود که به آن بافر میگوییم.
- رشته قبلی به بافر انتقال میابد که بسته به مقدار آن زمان بر و کند است؛ 5 کیلو یا 5 مگابایت یا 50 مگابایت و ...
- شماره تولید شده جدید به بافر چسبانده میشود.
- بافر به یک رشته تبدیل میشود وجایی برای خود در حافظه Heap میگیرد.
- حافظه رشته قدیمی و بافر دیگر بلا استفاده شدهاند و توسط GC پاکسازی میشوند که ممکن است عملیاتی زمان بر باشد.
String Builder
string declared = "Intern pool"; string built = new StringBuilder("Intern pool").ToString();
StringBuilder sb = new StringBuilder(); sb.Append("Numbers: "); DateTime dt = DateTime.Now; for (int index = 1; index <= 200000; index++) { sb.Append(index); } Console.WriteLine(sb.ToString()); Console.WriteLine(dt); Console.WriteLine(DateTime.Now); Console.ReadKey();
StringBuilder sb = new StringBuilder(15); sb.Append("Hello, C#!");
استفاده از متد ایستای string.Format
DateTime date = DateTime.Now; string name = "David Scott"; string task = "Introduction to C# book"; string location = "his office"; string formattedText = String.Format( "Today is {0:MM/dd/yyyy} and {1} is working on {2} in {3}.", date, name, task, location); Console.WriteLine(formattedText);
پیشتر مطلبی را در مورد ساخت کتابخانههای مخصوص Angular را به کمک Angular CLI، در این سایت مطالعه کرده بودید. در این مطلب فرض بر این است که شما توسعه دهندهی Angular «نیستید»، اما قصد دارید با استفاده از ابزار Angular CLI، کتابخانهی جاوا اسکریپتی عمومی بسیار مدرنی را با پشتیبانی از تمام موارد یاد شده، تولید کنید.
ساخت قالب آغازین کتابخانه به کمک Angular CLI
برای تبدیل کتابخانههای جاوا اسکریپتی خود به قالب مدرنی که در مقدمه عنوان شد، نیاز به ابزاری جهت خودکارسازی فرآیندهای آن داریم و این ویژگیها مدتی است که به ابزار Angular CLI اضافه شدهاند و همانطور که عنوان شد، مخاطب این مطلب، توسعه دهندگان عمومی JavaScript است و نه صرفا توسعه دهندگان Angular. به همین جهت نیاز است ابتدا این ابزار را نصب کرد:
npm install -g @angular/cli
پس از نصب Angular CLI، از آن جهت ساخت قالب تولید کتابخانههای TypeScript ای استفاده میکنیم:
ng new my-math-app
بنابراین پس از اجرای دستور فوق، از طریق خط فرمان به پوشهی my-math-app وارد شده و سپس دستور زیر را اجرا کنید:
ng generate library ts-math-example
تکمیل کتابخانهی جاوا اسکریپتی
همچنین میتوان به فایل my-math-app\projects\ts-math-example\package.json نیز مراجعه کرد (فایل package.json پروژهی کتابخانه) و قسمت peerDependencies آن را که به Angular اشاره میکند نیز حذف نمود.
سپس یک فایل خالی math.ts را به پوشهی یاد شده اضافه میکنیم:
با این محتوا:
export function add(num1: number, num2: number) { return num1 + num2; }
در ادامه نیاز است این ماژول را به فایل my-math-app\projects\ts-math-example\src\public-api.ts معرفی کرد تا به عنوان API قابل دسترسی کتابخانه، در دسترس قرار گیرد:
/* * Public API Surface of ts-math-example */ export * from './lib/math';
در حین توسعهی کتابخانه خود،جهت اطمینان از صحت کامپایل برنامه، دستور ng build ts-math-example --watch را در پوشهی my-math-app صادر کنید. کار آن کامپایل مداوم پروژهی کتابخانه بر اساس تغییرات داده شدهاست. حاصل این کامپایل نیز در پوشهی my-math-app\dist\ts-math-example قرار میگیرد:
این همان خروجی مدرنی است که در ابتدای بحث از آن صحبت کردیم و شامل کتابخانههای ES5 و ES2015 به بعد و همچنین ارائهی متادیتای مخصوص TypeScript نیز هست.
کامپایل و انتشار نهایی کتابخانه
پس از تکمیل کتابخانهی خود، اکنون میتوانیم آنرا به سایت npm، برای استفادهی سایرین ارسال کنیم. برای این منظور باید مراحل زیر طی شوند:
ابتدا فایل package.json واقع در ریشهی پوشهی ts-math-example را جهت تعریف اطلاعات این کتابخانه، تکمیل کنید. سپس دستورات زیر را در ریشهی پروژهی اصلی صادر کنید:
ng build ts-math-example --prod cd dist/ts-math-example npm publish
با دستور دوم به پوشهی خروجی کتابخانه وارد شده و دستور سوم، آنرا به سایت npm ارسال میکند.
استفاده کنندهی از کتابخانهی ما (این استفاده کننده میتواند هر نوع پروژهی جاوا اسکریپتی اعم از Angular ،React ،Vue ،ES6 ،TypeScript و غیره باشد) ابتدا با دستور npm install ts-math-example --save آنرا نصب و به پروژهی خود اضافه کرده و سپس به نحو زیر میتواند از آن استفاده کند:
import { add } from '@myuser/ts-math-example';
ساختار درختی
اصطلاحات درخت
در شکل بالا دایرههایی برای هر بخش از اطلاعت کشیده شده و ارتباط هر کدام از آنها از طریق یک خط برقرار شده است. اعداد داخل هر دایره تکراری نیست و همه منحصر به فرد هستند. پس وقتی از اعداد اسم ببریم متوجه میشویم که در مورد چه چیزی صحبت میکنیم.
در شکل بالا به هر یک از دایرهها یک گره Node میگویند و به هر خط ارتباط دهنده بین گرهها لبه Edge گفته میشود. گرههای 19 و 21 و 14 زیر گرههای گره 7 محسوب میشوند. گرههایی که به صورت مستقیم به زیر گرههای خودشان اشاره میکنند را گرههای والد Parent میگویند و زیرگرههای 7 را گرههای فرزند ChildNodes. پس با این حساب میتوانیم بگوییم گرههای 1 و 12 و 31 را هم فرزند گره 19 هستند و گره 19 والد آن هاست. همچنین گرههای یک والد را مثل 19 و 21 و 14 که والد مشترک دارند، گرههای خواهر و برادر یا حتی همنژاد Sibling میگوییم. همچنین ارتباط بین گره 7 و گرههای سطح دوم و الی آخر یعنی 1 و 12 و 31 و 23 و 6 را که والد بودن آن به صورت غیر مستقیم است را جد یا ancestor مینامیم و نوهها و نتیجههای آنها را نسل descendants.
ریشه Root: به گرهای میگوییم که هیچ والدی ندارد و خودش در واقع اولین والد محسوب میشود؛ مثل گره 7.
برگ Leaf: به گرههایی که هیچ فرزندی ندارند، برگ میگوییم. مثال گرههای 1 و12 و 31 و 23 و 6
گرههای داخلی Internal Nodes: گره هایی که نه برگ هستند و نه ریشه. یعنی حداقل یک فرزند دارند و خودشان یک گره فرزند محسوب میشوند؛ مثل گرههای 19 و 14.
مسیر Path: راه رسیدن از یک گره به گره دیگر را مسیر میگویند. مثلا گرههای 1 و 19 و 7 و 21 به ترتیب یک مسیر را تشکیل میدهند ولی گرههای 1 و 19 و 23 از آن جا که هیچ جور اتصالی بین آنها نیست، مسیری را تشکیل نمیدهند.
طول مسیر Length of Path: به تعداد لبههای یک مسیر، طول مسیر میگویند که میتوان از تعداد گرهها -1 نیز آن را به دست آورد. برای نمونه : مسیر 1 و19 و 7 و 21 طول مسیرشان 3 هست.
عمق Depth: طول مسیر یک گره از ریشه تا آن گره را عمق درخت میگویند. عمق یک ریشه همیشه صفر است و برای مثال در درخت بالا، گره 19 در عمق یک است و برای گره 23 عمق آن 2 خواهد بود.
تعریف خود درخت Tree: درخت یک ساختار داده برگشتی recursive است که شامل گرهها و لبهها، برای اتصال گرهها به یکدیگر است.
جملات زیر در مورد درخت صدق میکند:
- هر گره میتواند فرزند نداشته باشد یا به هر تعداد که میخواهد فرزند داشته باشد.
- هر گره یک والد دارد و تنها گرهای که والد ندارد، گره ریشه است (البته اگر درخت خالی باشد هیچ گره ای وجود ندارد).
- همه گرهها از ریشه قابل دسترسی هستند و برای دسترسی به گره مورد نظر باید از ریشه تا آن گره، مسیری را طی کرد.
برای پیاده سازی یک درخت، از دو کلاس یکی جهت ساخت گره که حاوی اطلاعات است <TreeNode<T و دیگری جهت ایجاد درخت اصلی به همراه کلیه متدها و خاصیت هایش <Tree<T کمک میگیریم.
public class TreeNode<T> { // شامل مقدار گره است private T value; // مشخص میکند که آیا گره والد دارد یا خیر private bool hasParent; // در صورت داشتن فرزند ، لیست فرزندان را شامل میشود private List<TreeNode<T>> children; /// <summary>سازنده کلاس </summary> /// <param name="value">مقدار گره</param> public TreeNode(T value) { if (value == null) { throw new ArgumentNullException( "Cannot insert null value!"); } this.value = value; this.children = new List<TreeNode<T>>(); } /// <summary>خاصیتی جهت مقداردهی گره</summary> public T Value { get { return this.value; } set { this.value = value; } } /// <summary>تعداد گرههای فرزند را بر میگرداند</summary> public int ChildrenCount { get { return this.children.Count; } } /// <summary>به گره یک فرزند اضافه میکند</summary> /// <param name="child">آرگومان این متد یک گره است که قرار است به فرزندی گره فعلی در آید</param> public void AddChild(TreeNode<T> child) { if (child == null) { throw new ArgumentNullException( "Cannot insert null value!"); } if (child.hasParent) { throw new ArgumentException( "The node already has a parent!"); } child.hasParent = true; this.children.Add(child); } /// <summary> /// گره ای که اندیس آن داده شده است بازگردانده میشود /// </summary> /// <param name="index">اندیس گره</param> /// <returns>گره بازگشتی</returns> public TreeNode<T> GetChild(int index) { return this.children[index]; } } /// <summary>این کلاس ساختار درخت را به کمک کلاس گرهها که در بالا تعریف کردیم میسازد</summary> /// <typeparam name="T">نوع مقادیری که قرار است داخل درخت ذخیره شوند</typeparam> public class Tree<T> { // گره ریشه private TreeNode<T> root; /// <summary>سازنده کلاس</summary> /// <param name="value">مقدار گره اول که همان ریشه میشود</param> public Tree(T value) { if (value == null) { throw new ArgumentNullException( "Cannot insert null value!"); } this.root = new TreeNode<T>(value); } /// <summary>سازنده دیگر برای کلاس درخت</summary> /// <param name="value">مقدار گره ریشه مثل سازنده اول</param> /// <param name="children">آرایه ای از گرهها که فرزند گره ریشه میشوند</param> public Tree(T value, params Tree<T>[] children) : this(value) { foreach (Tree<T> child in children) { this.root.AddChild(child.root); } } /// <summary> /// ریشه را بر میگرداند ، اگر ریشه ای نباشد نال بر میگرداند /// </summary> public TreeNode<T> Root { get { return this.root; } } /// <summary>پیمودن عرضی و نمایش درخت با الگوریتم دی اف اس </summary> /// <param name="root">ریشه (گره ابتدایی) درختی که قرار است پیمایش از آن شروع شود</param> /// <param name="spaces">یک کاراکتر جهت جداسازی مقادیر هر گره</param> private void PrintDFS(TreeNode<T> root, string spaces) { if (this.root == null) { return; } Console.WriteLine(spaces + root.Value); TreeNode<T> child = null; for (int i = 0; i < root.ChildrenCount; i++) { child = root.GetChild(i); PrintDFS(child, spaces + " "); } } /// <summary>متد پیمایش درخت به صورت عمومی که تابع خصوصی که در بالا توضیح دادیم را صدا میزند</summary> public void TraverseDFS() { this.PrintDFS(this.root, string.Empty); } } /// <summary> /// کد استفاده از ساختار درخت /// </summary> public static class TreeExample { static void Main() { // Create the tree from the sample Tree<int> tree = new Tree<int>(7, new Tree<int>(19, new Tree<int>(1), new Tree<int>(12), new Tree<int>(31)), new Tree<int>(21), new Tree<int>(14, new Tree<int>(23), new Tree<int>(6)) ); // پیمایش درخت با الگوریتم دی اف اس یا عمقی tree.TraverseDFS(); // خروجی // 7 // 19 // 1 // 12 // 31 // 21 // 14 // 23 // 6 } }
پیمایش درخت به روش عمقی (DFS (Depth First Search
هدف از پیمایش درخت ملاقات یا بازبینی (تهیه لیستی از همه گرههای یک درخت) تنها یکبار هر گره در درخت است. برای این کار الگوریتمهای زیادی وجود دارند که ما در این مقاله تنها دو روش DFS و BFS را بررسی میکنیم.
روش DFS: هر گرهای که به تابع بالا بدهید، آن گره برای پیمایش، گره ریشه حساب خواهد شد و پیمایش از آن آغاز میگردد. در الگوریتم DFS روش پیمایش بدین گونه است که ما از گره ریشه آغاز کرده و گره ریشه را ملاقات میکنیم. سپس گرههای فرزندش را به دست میآوریم و یکی از گرهها را انتخاب کرده و دوباره همین مورد را رویش انجام میدهیم تا نهایتا به یک برگ برسیم. وقتی که به برگی میرسیم یک مرحله به بالا برگشته و این کار را آنقدر تکرار میکنیم تا همهی گرههای آن ریشه یا درخت پیمایش شده باشند.
همین درخت را در نظر بگیرید:
پیمایش درخت را از گره 7 آغاز میکنیم و آن را به عنوان ریشه در نظر میگیریم. حتی میتوانیم پیمایش را از گره مثلا 19 آغاز کنیم و آن را برای پیمایش ریشه در نظر بگیریم ولی ما از همان 7 پیمایش را آغاز میکنیم:
ابتدا گره 7 ملاقات شده و آن را مینویسیم. سپس فرزندانش را بررسی میکنیم که سه فرزند دارد. یکی از فرزندان مثل گره 19 را انتخاب کرده و آن را ملاقات میکنیم (با هر بار ملاقات آن را چاپ میکنیم) سپس فرزندان آن را بررسی میکنیم و یکی از گرهها را انتخاب میکنیم و ملاقاتش میکنیم؛ برای مثال گره 1. از آن جا که گره یک، برگ است و فرزندی ندارد یک مرحله به سمت بالا برمیگردیم و برگهای 12 و 31 را هم ملاقات میکنیم. حالا همهی فرزندان گره 19 را بررسی کردیم، بر میگردیم یک مرحله به سمت بالا و گره 21 را ملاقات میکنیم و از آنجا که گره 21 برگ است و فرزندی ندارد به بالا باز میگردیم و بعد گره 14 و فرزندانش 23 و 6 هم بررسی میشوند. پس ترتیب چاپ ما اینگونه میشود:
7-19-1-12-31-21-14-23-6
پیمایش درخت به روش (BFS (Breadth First Search
در این روش (پیمایش سطحی) گره والد ملاقات شده و سپس همه گرههای فرزندش ملاقات میشوند. بعد از آن یک گره انتخاب شده و همین پیمایش مجددا روی آن انجام میشود تا آن سطح کاملا پیمایش شده باشد. سپس به همین مرحله برگشته و فرزند بعدی را پیمایش میکنیم و الی آخر. نمونهی این پیمایش روی درخت بالا به صورت زیر نمایش داده میشود:
7-19-21-14-1-12-31-23-6
اگر خوب دقت کنید میبینید که پیمایش سطحی است و هر سطح به ترتیب ملاقات میشود. به این الگوریتم، پیمایش موجی هم میگویند. دلیل آن هم این است که مثل سنگی میماند که شما برای ایجاد موج روی دریاچه پرتاب میکنید.
برای این پیمایش از صف کمک گرفته میشود که مراحل زیر روی صف صورت میگیرد:
- ریشه وارد صف Q میشود.
- دو مرحله زیر مرتبا تکرار میشوند:
- اولین گره صف به نام V را از Q در یافت میکنیم و آن را چاپ میکنیم.
- فرزندان گره V را به صف اضافه میکنیم.
هر چند مدتی است که اس کیوال سرور 2008 ارائه شده یا سرویس پک 3 اس کیوال سرور 2005 اخیرا منتشر گردیده، اما هنوز هم هاستهای ما زحمت ارتقاء را به خود ندادهاند. (چرا باید پول خرج کنند؟!)
اس کیوال سروری را که الان برای برنامه نویسی از آن استفاده میکنم 2008 است و چند روز قبل قصد داشتم به اس کیوال سرور 2000 هاست محترم از طریق management studio 2008 متصل شوم تا تغییرات جدید را به دیتابیس سایت اعمال کنم.
اولین تلاش برای اتصال با خطای زیر متوقف شد!
------------------------------
Failed to retrieve data for this request. (Microsoft.SqlServer.Management.Sdk.Sfc)
------------------------------
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
------------------------------
Server user 'hostXYZ' is not a valid user in database 'hostZXY'. (Microsoft SQL Server, Error: 916)
------------------------------
فقط هم management studio 2008 این مشکل را دارد. با 2005 تست کردم مشکلی نبود.
پس از مدتی جستجو، نتیجه کار به صورت زیر است:
به منوی View گزینه Object Explorer Details مراجعه کنید (در management studio اس کیوال سرور 2008). روی هدر صفحهای که ظاهر میشود کلیک راست کرده و تیک collation را بردارید (شکل زیر). ممکن است collation دیتابیس آفلاین، نال گزارش شود و این مورد مشکل درست میکند. تیک collation را که بردارید این مورد بررسی نشده و لیست دیتابیسها نمایش داده میشود.
اگه در جستجوی یک کلاس Html و JavaScript هستید .
دیباگ کدهای فشرده جاوااسکریپت
یکی از پروسههای بهبود سئو وب سایت کاهش حجم نهایی فایلهای CSS و JS میباشد که به آن Minification یا Minimization گفته میشود. این عمل موجب حذف شدن کامنتها، فضاء خالی بین دستورات و ... میگردد. در سوی دیگر با عمل فشرده سازی کدهای نهایی جاوااسکریپت و سی اس اس موجب عدم خوانایی بهتر این دستورات برای انسانها میشود.
نه خالی است و شماره ای ندارد.
موقعی که پول را نسبت نداده باشم 502.5 را دریافت میکنم.
پی نوشت: سیستم را به پولی که سایت قبلی روی آن بدون مشکل کار میکرد انتقال دادم و بدون مشکل اجرا شد. مشخصا مشکل از پول ایجاد شده است.