اشتراکها
نظرات مطالب
آموزش مفاهیم Data Warehouse
بسیار عالی
آیا OLTP و DW میتوانند بر روی یک سرور باشند مثلا" بر روی یک SQL Server باشند
Blazor، چارچوبی است ارائه شده توسط مایکروسافت که به ما اجازه میدهد برنامههای تعاملی وب را با CSharp و بدون JavaScript بنویسیم. Blazor از اساس، Component based بوده و در برنامههایی که Backend نیز با CSharp نوشته شده باشد ( مثلا با ASP.NET Core) امکان به اشتراک گذاری کد بین کلاینت و سرور را نیز فراهم میکند. معماری Blazor معماریای مدرن است که در دل خود از امکانات CSharp نیز به خوبی بهره برده است تا بتوان پروژه را بهصورتی که قابلیت نگهداری بالایی داشته باشد، توسعه داد. Blazor در ذات معماری خود امکان نوشتن برنامههای Native موبایل را نیز میدهد و برای اثبات این مهم چندین دمو برای Proof of concept ارائه شده است؛ اما تا به امروز امکانی که به صورت Production ready باشد، ارائه نشده است.
Blazor به دو شکل کار میکند. Blazor Server و Blazor Client
در Blazor Client با استفاده از پشتیبانی نزدیک به 90% ای مرورگرها از Web Assembly که اجازه اجرای کدهای غیر JavaScript ای را در مرورگر میدهد، ابتدا DLLها به همراه HTML-CSS و عکسها و ... دانلود شده و برنامه به صورت Single Page App کار میکند. در این مدل شما میتوانید از تکنیک Pre rendering یا SSR نیز استفاده کنید تا تجربه کاربری بهتری را نیز ارائه دهید و یا در بحث SEO بهتر عمل کنید.
Blazor در سمت کلاینت از NET Standard 2.1 پشتیبانی میکند که عملا به شما اجازه میدهد بازهی گستردهای از Nuget Packageها را استفاده کنید.
البته Blazor Client به صورت Preview ارائه شده است و "فعلا" دو مشکل را دارد:
۱- امکان دیباگ خوبی ندارد.
۲- در عمل باید فایلهای اجرایی برنامه به صورت wasm یا web assembly دانلود شوند که در این حالت سرعتی بسیار بالا و بیش از جاوااسکریپت خواهند داشت؛ اما تا این لحظه این فایلها به صورت DLL دانلود میشوند و در سمت مرورگر "تفسیر" میشوند که باعث میشود سرعت گاه تا 70 برابر کمتر شود.
البته این دو مشکل در زمان ارائه نسخه NET 5. حل خواهند شد و در پروژه نسخه نهایی خود این دو مشکل را نخواهد داشت.
Blazor مدل اجرای دومی نیز دارد که به آن Blazor Server نیز میگوییم. در این مدل کدها تماما سمت سرور اجرا میشوند و تعاملات UI به صورت Web Socket به کلاینت منتقل و یا از آن دریافت میشوند که در این مدل، امکان Debug بدون کوچکترین مشکلی کار میکند و مشکلی از بابت کندی دانلود و اجرای DLLها ندارد. فقط چون کدها تماما سمت سرور اجرا میشوند، در زمانیکه ارتباط شبکهای، مناسب نباشد، میتوانیم در سناریوهای مختلف، شاهد لگ و کندی باشیم.
آیندهی Blazor در مدل اول آن تعریف شدهاست و در گذر زمان برای مدل Blazor Server، نمیتوان آیندهی زیادی را متصور بود. اما نکتهی مهم و جالب اینجاست که کد پروژه در هر دو مدل یکی است و فقط Configuration این دو از هم متفاوت است. پس اگر علاقمند به شروع به استفاده از Blazor هستید، یک راه این است که با مدل Blazor Server شروع و بعدا با تغییر Configuration، به Blazor Client سوئیچ کنید. البته در این میان باید به نکاتی دقت کنید:
۱- Blazor Server از NET Core 3.1. پشتیبانی میکند و Blazor Client از NET Standard 2.1. در مواقعی خاص ممکن است یک کلاس یا یک متد در NET Core 3.1. باشد و در NET Standard 2.1. نباشد.
۲- در Blazor Server شما حتی میتوانید با Entity Framework Core مثلا به Sql Server وصل شوید؛ ولی طبیعتا Browser امکان اتصال مستقیم به Sql Server را در مدل Client به شما نخواهد داد.
این موارد باعث میشود که اگر پروژه را با Blazor Server شروع کنید، شاید در آن کارهایی را انجام دهید که در BlazorServer کار میکنند، ولی در BlazorClient کار نمیکنند و این باعث شود بعدا که نسخه نهایی و کامل BlazorClient آماده شد، شاید نتوانید به آن، به صورت ساده و آسانی سوئیچ کنید.
ایده آل این است که پروژهای داشته باشید که به سادگی عوض کردن یک کلمه، بین این دو مدل سوئیچ کنید و بر صحت عملکرد پروژه در هر دو حالت نظارت داشته باشید. برای رسیدن به این مهم، پروژهای را ساختهام به نام BlazorDualMode که عمدهی بررسیها را به صورت اتوماتیک انجام میدهد و عملا تضمینی بر مهاجرت آسان شما از BlazorServer به BlazorClient در آینده خواهد بود
اگر در نت جستجو کنید، پروژههایی با این اسم را خواهید دید؛ اما این پروژه دو مزیت مهم را دارد که الباقی فاقد آن هستند:
۱- مدل Blazor Client آن دارای تکنیک Pre rendering یا SSR است.
۲- پروژه Api آن، از پروژهی Blazor آن جداست. اگر پروژهی Api را پروژهای بدانیم که به همراه Model، Data و ... امکان دسترسی به DbContext و دیتابیس را دارد، جدا بودن پروژهی Blazor باعث میشود که حتی در مدل Server آن نیز مجبور باشیم دیتا را از Api به صورت Rest Api call بگیریم و به واسطه پروژه Shared مابین Api و Blazor نهایت Dtoها و سایر کدهای مشترک را ببینیم.
البته در پروژه DualMode فقط پروژه Api درست شدهاست و ما کاری با جزئیات آن، اینکه مثلا CQRS میخواهیم یا نه، آیا میخواهیم لایهای کار کنیم و ... نداریم و فقط روی موارد مرتبط با Blazor متمرکز شدهایم.
در پروژه یک فایل داریم به نام Directory.build.props. زمانیکه چنین فایلی در فولدری قرار بگیرد، تمامی موارد نوشته شده در آن به صورت ضمنی در تمامی فایلهای csproj زیر مجموعه آن اعمال میشود.
در این فایل داریم:
<Project> <PropertyGroup> <BlazorMode>Client</BlazorMode> <DefineConstants Condition=" '$(BlazorMode)' == 'Client' ">$(DefineConstants);BlazorClient</DefineConstants> <DefineConstants Condition=" '$(BlazorMode)' == 'Server' ">$(DefineConstants);BlazorServer</DefineConstants> <LangVersion>8.0</LangVersion> </PropertyGroup> </Project>
در ادامه Define Constant کردهایم که اجازه میدهد کدهای CSharp دخیل در Configuration پروژه Blazor را شرطی کنیم. برای مثال بنویسیم:
#if BlazorClient ... #elif BlazorServer ... #endif
نسخه CSharp تمامی پروژهها نیز 8.0 قرار داده شده است.
پروژهی BlazorDualMode.Api آن پروژهای است که Api Controllerها در آن قرار میگیرند و همچنین در حالت Blazor Client، پروژه را برای مرورگرها ارائه یا Serve میکند. به واقع در این مدل، درخواستی که به هیچ Api Controller ای نرسد، به Blazor تحویل میشود. Blazor نیز ابتدا به دنبال Component ای میگردد که برای Route مربوطه نوشته شده باشد و آن را اجرا میکند و سپس Response آماده، به کلاینت ارسال میشود. در ادامه، مرورگر فایلهای DLL را دانلود و برنامه به صورت Single Page App به کار خود ادامه میدهد.
پروژه BlazorDualMode.Shared پروژهای است که کد مشترک بین Api و Blazor در آن قرار میگیرد. برای مثال میتوانید Dtoها را در این قسمت قرار دهید.
پروژه BlazorDualMode.Web پروژهای است که در آن Componentهای Blazor قرار دارند. در حالت Server این پروژه نیز قابلیت اجرا مییابد و باید با امکانات Visual Studio یا IDE دلخواه خود پروژه Web و Api را به صورت همزمان اجرا کنید تا به درستی کار کند.
فایلهای Program.cs، Startup.cs و همچنین خود csprojها و در نهایت فایل Host.cshtml، نهایت تفاوت این دو حالت بوده و کدهای بیزینسی پروژه و حتی Componentها و Api Controllerها در هر دو حالت یکی هستند. Configuration با شرط if server یا if client هندل شدهاند و درک جزئیات تنظیمات مربوطه نیاز به تسلط بر روی خود Blazor را دارد که از موضوع این پست خارج است؛ ولی در صورت داشتن هر گونه سوالی، میتوانید از قسمت پرسش و پاسخ همین سایت استفاده کنید.
نظرات مطالب
EF Code First #5
چندتا بحث هست در مورد این خطا:
- EF Code first زمانیکه مشاهده کنه دیتابیس تعریف شده در رشته اتصالی وجود خارجی ندارد، سعی در ایجاد آن خواهد کرد. شما در هاستها عموما دسترسی dbo ندارید. یعنی دسترسی ساخت دیتابیس ندارید. به عبارتی باید یک دیتابیس خالی از پیش تعیین شده داشته باشید. اگر پنل خاصی دارید از آن استفاده کنید برای ساخت دیتابیس. اگر ندارید باید تماس بگیرید تا دیتابیس برای شما ایجاد شود.
- زمانیکه خطای یافت نشدن بانک اطلاعاتی DataLayer.Context.MedicallexiconContex را دریافت میکنید یعنی پیش فرضهای EF Code first رو رعایت نکردید. در اینجا name ایی که در رشته اتصالی تعریف میکنید مهم است. به صورت پیش فرض این name باید همان نام کلاس Context شما باشد (صرفنظر از اینکه رشته اتصالی شما به چه بانک اطلاعاتی اشاره میکند).
- EF Code first زمانیکه مشاهده کنه دیتابیس تعریف شده در رشته اتصالی وجود خارجی ندارد، سعی در ایجاد آن خواهد کرد. شما در هاستها عموما دسترسی dbo ندارید. یعنی دسترسی ساخت دیتابیس ندارید. به عبارتی باید یک دیتابیس خالی از پیش تعیین شده داشته باشید. اگر پنل خاصی دارید از آن استفاده کنید برای ساخت دیتابیس. اگر ندارید باید تماس بگیرید تا دیتابیس برای شما ایجاد شود.
- زمانیکه خطای یافت نشدن بانک اطلاعاتی DataLayer.Context.MedicallexiconContex را دریافت میکنید یعنی پیش فرضهای EF Code first رو رعایت نکردید. در اینجا name ایی که در رشته اتصالی تعریف میکنید مهم است. به صورت پیش فرض این name باید همان نام کلاس Context شما باشد (صرفنظر از اینکه رشته اتصالی شما به چه بانک اطلاعاتی اشاره میکند).
در این قسمت یک مثال ساده از insert ، load و delete را بر اساس اطلاعات قسمتهای قبل با هم مرور خواهیم کرد. برای سادگی کار از یک برنامه Console استفاده خواهد شد (هر چند مرسوم شده است که برای نوشتن آزمایشات از آزمونهای واحد بجای این نوع پروژهها استفاده شود). همچنین فرض هم بر این است که database schema برنامه را مطابق قسمت قبل در اس کیوال سرور ایجاد کرده اید (نکته آخر بحث قسمت سوم).
یک پروژه جدید از نوع کنسول را به solution برنامه (همان NHSample1 که در قسمتهای قبل ایجاد شد)، اضافه نمائید.
سپس ارجاعاتی را به اسمبلیهای زیر به آن اضافه کنید:
FluentNHibernate.dll
NHibernate.dll
NHibernate.ByteCode.Castle.dll
NHSample1.dll : در قسمتهای قبل تعاریف موجودیتها و نگاشت آنها را در این پروژه class library ایجاد کرده بودیم و اکنون قصد استفاده از آن را داریم.
اگر دیتابیس قسمت قبل را هنوز ایجاد نکردهاید، کلاس CDb را به برنامه افزوده و سپس متد CreateDb آنرا به برنامه اضافه نمائید.
using FluentNHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHSample1.Mappings;
namespace ConsoleTestApplication
{
class CDb
{
public static void CreateDb(IPersistenceConfigurer dbType)
{
var cfg = Fluently.Configure().Database(dbType);
PersistenceModel pm = new PersistenceModel();
pm.AddMappingsFromAssembly(typeof(CustomerMapping).Assembly);
var sessionSource = new SessionSource(
cfg.BuildConfiguration().Properties,
pm);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session, true);
}
}
}
CDb.CreateDb(
MsSqlConfiguration
.MsSql2008
.ConnectionString("Data Source=(local);Initial Catalog=HelloNHibernate;Integrated Security = true")
.ShowSql());
در ادامه یک کلاس جدید به نام Config را به برنامه کنسول ایجاد شده اضافه کنید:
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHSample1.Mappings;
namespace ConsoleTestApplication
{
class Config
{
public static ISessionFactory CreateSessionFactory(IPersistenceConfigurer dbType)
{
return
Fluently.Configure().Database(dbType
).Mappings(m => m.FluentMappings.AddFromAssembly(typeof(CustomerMapping).Assembly))
.BuildSessionFactory();
}
}
}
اکنون سورس کامل مثال برنامه را در نظر بگیرید:
کلاس CDbOperations جهت اعمال ثبت و حذف اطلاعات:
using System;
using NHibernate;
using NHSample1.Domain;
namespace ConsoleTestApplication
{
class CDbOperations
{
ISessionFactory _factory;
public CDbOperations(ISessionFactory factory)
{
_factory = factory;
}
public int AddNewCustomer()
{
using (ISession session = _factory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
Customer vahid = new Customer()
{
FirstName = "Vahid",
LastName = "Nasiri",
AddressLine1 = "Addr1",
AddressLine2 = "Addr2",
PostalCode = "1234",
City = "Tehran",
CountryCode = "IR"
};
Console.WriteLine("Saving a customer...");
session.Save(vahid);
session.Flush();//چندین عملیات با هم و بعد
transaction.Commit();
return vahid.Id;
}
}
}
public void DeleteCustomer(int id)
{
using (ISession session = _factory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
Customer customer = session.Load<Customer>(id);
Console.WriteLine("Id:{0}, Name: {1}", customer.Id, customer.FirstName);
Console.WriteLine("Deleting a customer...");
session.Delete(customer);
session.Flush();//چندین عملیات با هم و بعد
transaction.Commit();
}
}
}
}
}
using System;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHSample1.Domain;
namespace ConsoleTestApplication
{
class Program
{
static void Main(string[] args)
{
//CDb.CreateDb(SQLiteConfiguration.Standard.ConnectionString("data source=sample.sqlite").ShowSql());
//return;
//todo: Read ConnectionString from app.config or web.config
using (ISessionFactory session = Config.CreateSessionFactory(
MsSqlConfiguration
.MsSql2008
.ConnectionString("Data Source=(local);Initial Catalog=HelloNHibernate;Integrated Security = true")
.ShowSql()
))
{
CDbOperations db = new CDbOperations(session);
int id = db.AddNewCustomer();
Console.WriteLine("Loading a customer and delete it...");
db.DeleteCustomer(id);
}
Console.WriteLine("Press a key...");
Console.ReadKey();
}
}
}
نیاز است تا ISessionFactory را برای ساخت سشنهای دسترسی به دیتابیس ذکر شده در تنظمیات آن جهت استفاده در تمام تردهای برنامه، ایجاد نمائیم. لازم به ذکر است که تا قبل از فراخوانی BuildSessionFactory این تنظیمات باید معرفی شده باشند و پس از آن دیگر اثری نخواهند داشت.
ایجاد شیء ISessionFactory هزینه بر است و گاهی بر اساس تعداد کلاسهایی که باید مپ شوند، ممکن است تا چند ثانیه به طول انجامد. به همین جهت نیاز است تا یکبار ایجاد شده و بارها مورد استفاده قرار گیرد. در برنامه به کرات از using استفاده شده تا اشیاء IDisposable را به صورت خودکار و حتمی، معدوم نماید.
بررسی متد AddNewCustomer :
در ابتدا یک سشن را از ISessionFactory موجود درخواست میکنیم. سپس یکی از بهترین تمرینهای کاری جهت کار با دیتابیسها ایجاد یک تراکنش جدید است تا اگر در حین اجرای کوئریها مشکلی در سیستم، سخت افزار و غیره پدید آمد، دیتابیسی ناهماهنگ حاصل نشود. زمانیکه از تراکنش استفاده شود، تا هنگامیکه دستور transaction.Commit آن با موفقیت به پایان نرسیده باشد، اطلاعاتی در دیتابیس تغییر نخواهد کرد و از این لحاظ استفاده از تراکنشها جزو الزامات یک برنامه اصولی است.
در ادامه یک وهله از شیء Customer را ایجاد کرده و آنرا مقدار دهی میکنیم (این شیء در قسمتهای قبل ایجاد گردید). سپس با استفاده از session.Save دستور ثبت را صادر کرده، اما تا زمانیکه transaction.Commit فراخوانی و به پایان نرسیده باشد، اطلاعاتی در دیتابیس ثبت نخواهد شد.
نیازی به ذکر سطر فلاش در این مثال نبود و NHibernate اینکار را به صورت خودکار انجام میدهد و فقط از این جهت عنوان گردید که اگر چندین عملیات را با هم معرفی کردید، استفاده از session.Flush سبب خواهد شد که رفت و برگشتها به دیتابیس حداقل شود و فقط یکبار صورت گیرد.
در پایان این متد، Id ثبت شده در دیتابیس بازگشت داده میشود.
چون در متد CreateSessionFactory ، متد ShowSql را نیز ذکر کرده بودیم، هنگام اجرای برنامه، عبارات SQL ایی که در پشت صحنه توسط NHibernate تولید میشوند را نیز میتوان مشاهده نمود:
بررسی متد DeleteCustomer :
ایجاد سشن و آغاز تراکنش آن همانند متد AddNewCustomer است. سپس در این سشن، یک شیء از نوع Customer با Id ایی مشخص load خواهد گردید. برای نمونه، نام این مشتری نیز در کنسول نمایش داده میشود. سپس این شیء مشخص و بارگذاری شده را به متد session.Delete ارسال کرده و پس از فراخوانی transaction.Commit ، این مشتری از دیتابیس حذف میشود.
برای نمونه خروجی SQL پشت صحنه این عملیات که توسط NHibernate مدیریت میشود، به صورت زیر است:
Saving a customer...
NHibernate: select next_hi from hibernate_unique_key with (updlock, rowlock)
NHibernate: update hibernate_unique_key set next_hi = @p0 where next_hi = @p1;@p0 = 17, @p1 = 16
NHibernate: INSERT INTO [Customer] (FirstName, LastName, AddressLine1, AddressLine2, PostalCode, City, CountryCode, Id) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7);@p0 = 'Vahid', @p1 = 'Nasiri', @p2 = 'Addr1', @p3 = 'Addr2', @p4 = '1234', @p5 = 'Tehran', @p6 = 'IR', @p7 = 16016
Loading a customer and delete it...
NHibernate: SELECT customer0_.Id as Id2_0_, customer0_.FirstName as FirstName2_0_, customer0_.LastName as LastName2_0_, customer0_.AddressLine1 as AddressL4_2_0_, customer0_.AddressLine2 as AddressL5_2_0_, customer0_.PostalCode as PostalCode2_0_, customer0_.City as City2_0_, customer0_.CountryCode as CountryC8_2_0_ FROM [Customer] customer0_ WHERE customer0_.Id=@p0;@p0 = 16016
Id:16016, Name: Vahid
Deleting a customer...
NHibernate: DELETE FROM [Customer] WHERE Id = @p0;@p0 = 16016
Press a key...
فرض کنید از هفته آینده قرار شده است که نسخه سبک و تک کاربرهای از برنامه ما تهیه شود. بدیهی است SQL server برای این منظور انتخاب مناسبی نیست (هزینه بالا برای یک مشتری، مشکلات نصب، مشکلات نگهداری و امثال آن برای یک کاربر نهایی و نه یک سازمان بزرگ که حتما ادمینی برای این مسایل در نظر گرفته میشود).
اکنون چه باید کرد؟ باید برنامه را از صفر بازنویسی کرد یا قسمت دسترسی به دادههای آنرا کلا مورد باز بینی قرار داد؟ اگر برنامه اسپاگتی ما اصلا لایه دسترسی به دادهها را نداشت چه؟! همه جای برنامه پر است از SqlCommand و Open و Close ! و عملا استفاده از یک دیتابیس دیگر یعنی باز نویسی کل برنامه.
همانطور که ملاحظه میکنید، زمانیکه با NHibernate کار شود، مدیریت لایه دسترسی به دادهها به این فریم ورک محول میشود و اکنون برای استفاده از دیتابیس SQLite تنها باید تغییرات زیر صورت گیرد:
ابتدا ارجاعی را به اسمبلی System.Data.SQLite.dll اضافه نمائید (تمام این اسمبلیهای ذکر شده به همراه مجموعه FluentNHibernate ارائه میشوند). سپس:
الف) ایجاد یک دیتابیس خام بر اساس کلاسهای domain و mapping تعریف شده در قسمتهای قبل به صورت خودکار
CDb.CreateDb(SQLiteConfiguration.Standard.ConnectionString("data source=sample.sqlite").ShowSql());
//todo: Read ConnectionString from app.config or web.config
using (ISessionFactory session = Config.CreateSessionFactory(
SQLiteConfiguration.Standard.ConnectionString("data source=sample.sqlite").ShowSql()
))
{
...
دریافت سورس برنامه تا این قسمت
نکته:
در سه قسمت قبل، تمام خواص پابلیک کلاسهای پوشه domain را به صورت معمولی و متداول معرفی کردیم. اگر نیاز به lazy loading در برنامه وجود داشت، باید تمامی کلاسها را ویرایش کرده و واژه کلیدی virtual را به کلیه خواص پابلیک آنها اضافه کرد. علت هم این است که برای عملیات lazy loading ، فریم ورک NHibernate باید یک سری پروکسی را به صورت خودکار جهت کلاسهای برنامه ایجاد نماید و برای این امر نیاز است تا بتواند این خواص را تحریف (override) کند. به همین جهت باید آنها را به صورت virtual تعریف کرد. همچنین تمام سطرهای Not.LazyLoad نیز باید حذف شوند.
ادامه دارد ...
- WMI Provider MSI still failing to install in 16.6
- View History on context menu in Solution Explorer doesn't do anything
- Cannot generate shim for X509Certificate2 with Visual Studio 2019 16.6.0
- Add Controller and Add New Scaffolded Item dialogs are not showing all data contexts after upgrading Visual Studio Enterprise 16.5.6->16.6.0
- Cannot open new json file
- About Microsoft Visual Studio frozen.
- Visual Studio 2019 16.6.0 Microsoft Fakes Issue
- VSSDK IVsHierarchy Regression in VS 16.6.x
- Windows 10 SDK (10.0.19041.1)- ARM64 memcpy crashes when accessing unaligned uncached memory
- Add script to SQL Server Database project does not open User Scripts list
- Fakes generation with ref argument
- Frequent soft hang with Code Analysis callstack in Open Folder project
- Visual Studio Class Designer dark theme support
- Added support for Text Template Transformation Toolkit (T4) in .NET Core projects
- Separate IntelliCode team completions model acquisition from model production.
- Addressed an issue where users may have experienced critical update or installation failures due to the WMIProvider package that would block use of the IDE. Failures in this component no longer block use of the IDE.
- Fixed a problem causing the product to stop responding when working with Xamarin projects on certain scenarios.
- Fixed a bug where VS would crash when attempting to decrypt an invalid UWP code-signing certificate
بله. Collation نحوهی ذخیره سازی و همچنین مرتب سازی و مقایسهی اطلاعات رشتهای را مشخص میکند (کاری با تاریخ ندارد).
اما چندتا بحث هست. Collation های فعلی یا Collation های آتی.
مدل توسعهی SQL Server باز نیست. به این معنا که مثلا تا سال 2008 طول کشید تا Persian Collation به آن اضافه شد (Persian_100_CS_AS ، آن هم فقط با هدف گیری قسمت مرتب سازی صحیح رشتهها) یا Collation فعلی SQLite در مرتب سازی یک سری حروف فارسی مشکل دارد (بر اساس کدهای اسکی حروف عمل میکند، چیزی که در SQL Server حل شده است به لطف وجود Collation مناسب). البته مدل توسعهی آن باز است ولی ... من ندیم کسی این مورد را اصلاح کند و یک patch ارائه دهد.
هنوز کسی در مورد قسمت و مفهوم مقایسهای رشتهها در Collations کاری نکرده است که جای کار دارد (مثلا ی و ی یکی درنظر گرفته شود).
ولی باز هم به عنوان راه حل جامع قابل قبول نیست. چون گیرم به نگارش بعدی اضافه شد، نگارشهای قبلی چه کنند؟ سایر بانکهای اطلاعاتی چکار کنند؟
به همین جهت یک راه حل ساده و بدون نیاز به منتظر ماندن و سازگار با تمام بانکهای اطلاعاتی، یکسان سازی اطلاعات دریافتی است.
اما چندتا بحث هست. Collation های فعلی یا Collation های آتی.
مدل توسعهی SQL Server باز نیست. به این معنا که مثلا تا سال 2008 طول کشید تا Persian Collation به آن اضافه شد (Persian_100_CS_AS ، آن هم فقط با هدف گیری قسمت مرتب سازی صحیح رشتهها) یا Collation فعلی SQLite در مرتب سازی یک سری حروف فارسی مشکل دارد (بر اساس کدهای اسکی حروف عمل میکند، چیزی که در SQL Server حل شده است به لطف وجود Collation مناسب). البته مدل توسعهی آن باز است ولی ... من ندیم کسی این مورد را اصلاح کند و یک patch ارائه دهد.
هنوز کسی در مورد قسمت و مفهوم مقایسهای رشتهها در Collations کاری نکرده است که جای کار دارد (مثلا ی و ی یکی درنظر گرفته شود).
ولی باز هم به عنوان راه حل جامع قابل قبول نیست. چون گیرم به نگارش بعدی اضافه شد، نگارشهای قبلی چه کنند؟ سایر بانکهای اطلاعاتی چکار کنند؟
به همین جهت یک راه حل ساده و بدون نیاز به منتظر ماندن و سازگار با تمام بانکهای اطلاعاتی، یکسان سازی اطلاعات دریافتی است.
نظرات مطالب
بررسی نحوهی راه اندازی پروژهی Decision
با تشکر از جواب شما. sql server روی یک سرور دیگر بود که به آن ریموت میزدم و روی اون سرور پوشه FileStream نبود که پس از ساختن مشکل برطرف گردید.