Top Issues Fixed in Visual Studio 2019 version 16.4.1
- Fixed "the write operation failed. you must first acquire write access from dataschemamodelcontroller" error trying to publish a database
- Fix ExecutionEngineException exceptions when using SignalR on iOS devices in some configurations
- Runtime Fix "CEE_RET: value type stack" crash when interpreter was enabled with some libraries
- TypeScript 3.7.3 is now included by default, which contains several fixes for issues that effect the JavaScript and TypeScript editing experience.
- May allow mitigation of a Per-Monitor awareness related crash in Visual Studio
Security Advisory Notice
CVE-2019-1486 Live Share extension URL redirection vulnerability
- Web Essentials for Visual Studio - Working with images
- Automatic optimization of images, CSS and JavaScript
- Creating Image Sprite in Visual Studio - Web Essential
- Paste Image from clipboard onto Visual Studio Editor
- Image Optimization in Website - Web Essential
- Base64 Encode Image in Website - Web Essential
TypeScript 4.6 Beta منتشر شد
Here’s a quick list of what’s new in TypeScript 4.6!
Allowing Code in Constructors Before super()
Improved Recursion Depth Checks
Indexed Access Inference Improvements
Control Flow Analysis for Dependent Parameters
More Syntax and Binding Errors in JavaScript
TypeScript Trace Analyzer
Breaking Changes
دوره کامل Typescript
Burke learns Blazor by porting a Vue.js app to Blazor
This summer, Burke and Jon are porting theurlist.com to Blazor - a real world JavaScript application written in Vue.js. Join them each week as they use Visual Studio, Visual Studio Code and GitHub Copilot to rebuild this app and try to tackle every frontend issue you might encounter along the way.
ایجاد Responsive Layered Slider
مستندات و ویدئوهای EF
Stored Procedure چیست ؟
Stored Procedure یا SP یا به زبان فارسی «رویههای ذخیره شده» اشیایی اجرا پذیر در بانک اطلاعاتی SQL Server هستند که شامل یک یا چندین دستور SQL میشوند. این رویهها میتوانند پارامترهای ورودی و خروجی داشته باشند؛ همچنین میتوانند لیستی از موجودیتها را نیز برگردانند و یا میتوان داخل این رویهها به زبان T-SQL برنامه نویسی کرد.
مهمترین کاربر این رویهها، ذخیره کردن دستورات Select , Insert , Update , Delete هست و یا ترکیبی از اینها .
اشکال راه حلهای پیش فرض مبتنی بر Context
برای استفاده از راه حلهای پیش فرض مبتنی بر Context، همانطور که در مقاله «استفاده از امکانات بومی بانکهای اطلاعاتی» به آن پرداخته شده، سه روش کلی برای استفاده از Stored Procedure پیشنهاد شدهاست:
- روش اول استفاده از متد fromsql است. اشکال این متد، محدودیت استفاده برای یک موجودیت برنامه است و به زبان ساده نمیتوان در کوئری پایگاه داده از join استفاده کرد.
- روش دوم استفاده از متد ExecuteSqlCommand موجود در context برنامه است . اشکال این متد void بودن آن است که باعث میشود بازگشتی از پایگاه داده حاصل نشود.
- روش سوم استفاده از متد ExecuteScalar موجود در Context برنامه است. اشکالی که به این متد گرفته میشود، Scalar بودن مقدار بازگشتی از آن است که باعث میشود نتوانیم لیستی از موجودیتها را به ViewModel مورد نظر نگاشت کنیم.
راه حل این مشکل
برای حل این مشکلات که بسیار هم مهم هستند، اول باید قطعه کد زیر را به Context برنامه اضافه نمود:
public void OpenConnection() { Database.OpenConnection(); } public DbCommand Command() { DbCommand cmd = Database.GetDbConnection().CreateCommand(); return cmd; }
void OpenConnection(); DbCommand Command();
public void ConfigureServices(IServiceCollection services) { services.AddScoped<IUnitOfWork, ApplicationDbContext>(); services.AddScoped<ISpReader, SpReader>(); }
public List<ViewModel> GetFromSp <ViewModel>(string[,] Parametr, string NameSp) where ViewModel : new()
{ _uow.OpenConnection(); DbCommand cmd = _uow.Command(); cmd.CommandText = NameSp; cmd.CommandType = CommandType.StoredProcedure; var countParametr = Parametr.GetLength(0); for (int i = 0; i < countParame tr; i++) { cmd.Parameters.Add(new SqlParameter { ParameterName = Parametr[i, 0], Value = Parametr[i, 1] }); } List<ViewModel> list = new List<ViewModel >(); using (var reader = cmd.ExecuteReader()) { if (reader != null && reader.HasRows) { var entity = typeof(ViewModel); var propDict = new Dictionary<string, PropertyInfo>(); var props = entity.GetProperties (BindingFlags.Instance | BindingFlags.Public); propDict = props.ToDictionary(p => p.Name.ToUpper(), p => p); while (reader.Read()) { ViewModel newobject = new ViewModel (); for (int index = 0; index < reader.FieldCount; index++) { if (propDict.ContainsKey(reader.GetName(index).ToUpper())) { var info = propDict[reader.GetName(index).ToUpper()]; if ((info != null) && info.CanWrite) { var val = reader.GetValue(index); info.SetValue(newobject, (val == DBNull.Value) ? null : val, null); } } } list.Add(newobject); } } return list; }
همچنین میتوان برای استفاده این متد برای رویههای بدون پارامتر ورودی، از OverLoad این متد، با حذف قطعات کد زیر:
var countParametr = Parametr.GetLength(0); for (int i = 0; i < countParametr; i++) { cmd.Parameters.Add(new SqlParameter { ParameterName = Parametr[i, 0], Value = Parametr[i, 1] }); }
روش استفاده از این متد
برای استفاده از این متد، لازم است چند نکته رعایت شوند:
1- خروجی Stored Procedure دقیقا منطبق بر ViewModel ارسالی به متد جهت تشکیل لیست باشد.
2- لیست پارامترها باید بصورت آرایه دوبعدی باشد که اندازه بعد اول، تعداد پارامترها و اندازه بعد دوم 2 باشد.
3- در ماتریسی که از این پارامترها ساخته میشود، ستون اول نام پارامتر و ستون دوم مقدار پارامتر ست میشود.
بطور مثال Stored Procedure زیر حاوی سه پارامتر است :
CREATE PROCEDURE [dbo].[isRelation]( @TableName as varchar(50), @FieldOfRelation as varchar(70), @ValueOfField as int)
public class EntityServices : IEntityService { private ISpreader _Reader; public EntityServices( ISpreader reader) { _Reader = reader; } public List<StoreProcedureResultViewModel> IsRelation(string tableName , int keyValue, string keyFieldName) { List<StoreProcedureResultViewModel> IsContact; try { string[,] Parametr = new string[3, 2]; Parametr[0, 0] = "@TableName"; Parametr[0, 1] = tableName ; Parametr[1, 0] = "@ValueOfField"; Parametr[1, 1] = keyValue.ToString().Trim(); Parametr[2, 0] = "@FieldOfRelation"; Parametr[2, 1] = keyFieldName.Trim(); IsContact = _Reader.GetSp<StoreProcedureResultViewModel>(Parametr, "IsRelation"); return IsContact; } catch (Exception ex) { } } }