حاصل قطع برق و یا یک ری استارت دستی ناصحیح را در نظر بگیرید:
Database 'msdb' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server errorlog for more information. (Microsoft SQL Server, Error: 926)
Msdb از نوع دیتابیسهای سیستمی است و نمیشود مطابق روال متداول دیتابیسهای SUSPECT شده آنرا بازیابی کرد. این روش متداول به صورت زیر است:
ALTER DATABASE DBName SET EMERGENCY
DBCC checkdb('DBname')
ALTER DATABASE DBName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ('DBName', REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE DBName SET MULTI_USER
DBCC checkdb('DBname')
ALTER DATABASE DBName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ('DBName', REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE DBName SET MULTI_USER
در ابتدای کار دیتابیس در حالت اورژانسی قرار میگیرد. بعد وضعیت و میزان تخریب نمایش داده شده، سپس تک کاربره میشود. در ادامه به اس کیوال سرور اجازه داده میشود که دیتابیس را با هر وضعی (حتی به قیمت از دست رفتن تعدادی رکورد) ترمیم کند و در آخر دیتابیس مجددا به حالت چند کاربره بازگشت داده میشود.
این روشی است که سال قبل با قطعیهای مکرر برق زیاد کاربرد داشت.
اما دیتابیس سیستمی msdb را نمیشود در حالت اورژانسی قرار داد؛ بنابراین باید به دنبال راه چارهی دیگری بود. پس از مدتی جستجو در وبلاگهای msdn ، راه حل زیر یافت شد و کاملا عملی است (تست شده!) :
روش زیر در مورد اس کیوال سرور 2008 ، 2005 و حتی 2000 نیز قابل استفاده است.
ابتدا خونسردی خودتان را حفظ کنید! الان فقط دیگر با management studio نمیتوانید دیتابیسها را مرور کنید و همچنین تمام job های تعریف شده شما نابود شدهاند! اما سرور به کار عادی خودش میتواند ادامه دهد. سپس :
الف) تمام سرویسهای مربوط به اس کیوال سرور را stop کنید. به کنسول سرویسها مراجعه کرده و هر آنچه که در نام آن sql را مشاهده میکنید، stop کنید.
ب) با استفاده از خط فرمان، ابتدا به مسیر زیر وارد شوید:
cd "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\"
و سپس دستور زیر را اجرا نمائید:
start sqlservr.exe -c -m -T3608
به این ترتیب اس کیوال سرور در یک حالت حداقل که بتوان دیتابیس msdb تخریب شده را detach کرد راه اندازی میشود. (پرچم 3608 مجوز detach کردن این دیتابیس را میدهد)
ج) management studio را اجرا کنید. زمانیکه پنجره کانکت ظاهر میشود آنرا کنسل کرده و در نوار ابزار بالای صفحه روی دکمه new query کیک کنید (چون حالت راه اندازی سرور در حالت تک کاربره است نمیخواهیم اتصال دیگری برقرار شود و در کار اخلال کند). با کلیک بر روی new query پنجره connect to server ظاهر میشود. در همین پنجره بر روی دکمه options کلیک کرده در برگه connection properties در قسمت connect to database نام master را وارد نمود و اکنون بر روی دکمه connect کلیک نمائید.
ج) سپس دستور زیر را وارد کنید تا دیتابیس msdb را بتوان detach کرد.
Use master;
sp_detach_db 'msdb'
sp_detach_db 'msdb'
مراحلی که عنوان شد مهم است. اگر به این صورت عمل نکنید با پیغام خطای زیر مواجه خواهید شد:
Cannot detach an opened database when the server is in minimally configured mode
اگر به این خطا برخوردید، یکبار دیگر از صفر شروع کنید. تمام سرویسهای مرتبط با sql را استاپ کنید (حتی در صورت نیاز کارت شبکه سرور را نیز غیرفعال کنید). و از مرحله الف مجددا شروع نمائید تا حتما حالت تک کاربرهی اتصال برقرار شود. (همچنین پنجرهی کوئری جدیدی را نیز باز نکنید چون در این حالت فقط و فقط یک اتصال مجاز است)
تا اینجا موفق شدیدم که دیتابیس msdb را detach کنیم. اکنون به پوشه دیتابیسها مراجعه کرده و mdf و ldf این دیتابیس تخریب شده را rename کنید (به هر اسمی که مایل بودید).
د) اکنون نوبت بازسازی مجدد این دیتابیس است.
محتویات فایل instmsdb.sql را که در مسیر C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\install قرار دارد، در پنجرهی کوئری تک کاربرهای که در مرحله قبل بازکردهایم، copy/paste کرده و دکمه F5 را فشار دهید. پس از مدتی دیتابیس msdb باز سازی شده و مشکل برطرف میشود.
ه) اکنون سرور را stop و start کنید یا کلا کامپیوتر سرور را restart کنید تا تمامی سرویسهای stop شده راه اندازی مجدد شوند.
کتابخانههای بسیاری هستند که به زبانهای C ، C++ ، Rust و امثال آن تهیه شدهاند. دات نت 6، قابلیت جدید استفادهی از این نوع کتابخانهها را بدون نیاز به تبدیل کدهای آنها به #C، به برنامههای سمت کلاینت Blazor Web Assembly اضافه کرده که در این مطلب، نمونهای از آنرا با استفاده از بانک اطلاعاتی SQLite در برنامههای Blazor WASM 6x، بررسی خواهیم کرد. یعنی یک برنامهی SPA سمت کلاینت که بدون نیاز به سرور و Web API، تنها با استفاده از EF-Core و بانک اطلاعاتی بومی SQLite میتواند اطلاعات مورد نیاز خود را ثبت و یا بازیابی کند (همه چیز داخل مرورگر رخ میدهد).
ایجاد یک پروژهی Blazor WASM جدید
یک پوشهی جدید دلخواه را به نام BlazorWasmSQLite ایجاد کرده و با اجرای دستور dotnet new blazorwasm، یک پروژهی Blazor Web Assembly خالی جدید را در آن آغاز میکنیم. همانطور که از دستور نیز مشخص است، این پروژه از نوع hosted که به همراه Web API هم هست، نمیباشد.
افزودن Context و مدل EF-Core به برنامه
مدل برنامه به صورت زیر در پوشهی Models آن قرار میگیرد:
و Context ای که آنرا در معرض دید قرار میدهد، به صورت زیر تعریف خواهد شد:
همچنین چون میخواهیم از بانک اطلاعاتی SQLite استفاده کنیم، وابستگی زیر را به فایل csproj برنامه اضافه میکنیم:
سپس این Context را به نحو زیر به فایل Program.cs معرفی میکنیم:
در مورد علت استفادهی از AddDbContextFactory و نکات مرتبط با آن، به مطلب «نکات ویژهی کار با EF-Core در برنامههای Blazor Server» مراجعه نمائید.
ثبت تعدادی رکورد در بانک اطلاعاتی
در ادامه سعی میکنیم در فایل Index.razor، تعدادی رکورد را به بانک اطلاعاتی اضافه کنیم:
در این مثال سعی شدهاست سادهترین حالت ممکن کار با EF-Core در پیش گرفته شود؛ چون هدف اصلی آن، دسترسی به SQLite است.
اولین سعی در اجرای برنامه
در ادامه سعی میکنیم تا برنامه را اجرا کنیم. با خطای زیر متوقف خواهیم شد:
عنوان میکند که فایلهای بانک اطلاعاتی SQLite به همراه EF-Core را نمیتواند پیدا کند. یا به عبارتی هر DLL بومی را نمیتوان داخل مرورگر اجرا کرد.
رفع مشکل کار با SQLite با کامپایل ویژهی آن
برای دسترسی به کدهای native در Blazor WASM و مرورگر، باید آنها را توسط کامپایلر emcc به صورت زیر کامپایل کرد:
در اینجا هر نوع فایل portable native code با فرمتهای o. یا object files، .a و یا archive files و یا .bc یا bitcode و یا .wasm یا Standalone WebAssembly modules توسط Blazor wasm قابل استفاده هستند که در مثال فوق نمونهی object files آنها توسط کامپایلر تولید میشود.
مرحلهی بعد، معرفی این object file تولید شده به برنامه است. برای اینکار ابتدا باید dotnet workload install wasm-tools را نصب کرد (مهم). سپس به فایل csproj برنامه مراجعه کرده و فایل e_sqlite3.o را به آن معرفی میکنیم:
در اینجا فرض شدهاست که فایل o. حاصل، در پوشهی data قرار دارد. این نوع فایلها توسط NativeFileReferenceها به برنامه معرفی میشوند.
سعی در اجرای مجدد برنامه
پس از نصب wasm-tools و ذکر NativeFileReference فوق، اکنون اگر برنامه را اجرا کنیم، برنامه بدون مشکل اجرا خواهد شد:
کدهای کامل این مطلب را از اینجا میتوانید دریافت کنید: BlazorWasmSQLite.zip
ایجاد یک پروژهی Blazor WASM جدید
یک پوشهی جدید دلخواه را به نام BlazorWasmSQLite ایجاد کرده و با اجرای دستور dotnet new blazorwasm، یک پروژهی Blazor Web Assembly خالی جدید را در آن آغاز میکنیم. همانطور که از دستور نیز مشخص است، این پروژه از نوع hosted که به همراه Web API هم هست، نمیباشد.
افزودن Context و مدل EF-Core به برنامه
مدل برنامه به صورت زیر در پوشهی Models آن قرار میگیرد:
namespace BlazorWasmSQLite.Models; public class Car { public int Id { get; set; } public string Brand { get; set; } public int Price { get; set; } }
using Microsoft.EntityFrameworkCore; using BlazorWasmSQLite.Models; namespace BlazorWasmSQLite.Data; public class ClientSideDbContext : DbContext { public DbSet<Car> Cars { get; set; } = default!; public ClientSideDbContext(DbContextOptions<ClientSideDbContext> options) : base(options) { } }
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> <ItemGroup> <!-- EF Core and Sqlite --> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.1" /> </ItemGroup> </Project>
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using BlazorWasmSQLite; using Microsoft.EntityFrameworkCore; using BlazorWasmSQLite.Data; var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); builder.RootComponents.Add<HeadOutlet>("head::after"); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); // Sets up EF Core with Sqlite builder.Services.AddDbContextFactory<ClientSideDbContext>(options => options .UseSqlite($"Filename=DemoData.db") .EnableSensitiveDataLogging()); await builder.Build().RunAsync();
ثبت تعدادی رکورد در بانک اطلاعاتی
در ادامه سعی میکنیم در فایل Index.razor، تعدادی رکورد را به بانک اطلاعاتی اضافه کنیم:
@page "/" @using Microsoft.Data.Sqlite @using Microsoft.EntityFrameworkCore @using BlazorWasmSQLite.Data @using BlazorWasmSQLite.Models <PageTitle>Index</PageTitle> <h1>Hello, world!</h1> Welcome to your new app. <SurveyPrompt Title="How is Blazor working for you?" /> @code { [Inject] private IDbContextFactory<ClientSideDbContext> _dbContextFactory { get; set; } = default!; protected override async Task OnInitializedAsync() { await using var db = await _dbContextFactory.CreateDbContextAsync(); await db.Database.EnsureCreatedAsync(); // create seed data if (!db.Cars.Any()) { var cars = new[] { new Car { Brand = "Audi", Price = 21000 }, new Car { Brand = "Volvo", Price = 11000 }, new Car { Brand = "Range Rover", Price = 135000 }, new Car { Brand = "Ford", Price = 8995 } }; await db.Cars.AddRangeAsync(cars); await db.SaveChangesAsync(); } await base.OnInitializedAsync(); } }
اولین سعی در اجرای برنامه
در ادامه سعی میکنیم تا برنامه را اجرا کنیم. با خطای زیر متوقف خواهیم شد:
crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: The type initializer for 'Microsoft.Data.Sqlite.SqliteConnection' threw an exception. System.TypeInitializationException: The type initializer for 'Microsoft.Data.Sqlite.SqliteConnection' threw an exception. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.DllNotFoundException: e_sqlite3 at SQLitePCL.SQLite3Provider_e_sqlite3.SQLitePCL.ISQLite3Provider.sqlite3_libversion_number()
رفع مشکل کار با SQLite با کامپایل ویژهی آن
برای دسترسی به کدهای native در Blazor WASM و مرورگر، باید آنها را توسط کامپایلر emcc به صورت زیر کامپایل کرد:
$ git clone https://github.com/cloudmeter/sqlite $ cd sqlite $ emcc sqlite3.c -shared -o e_sqlite3.o
مرحلهی بعد، معرفی این object file تولید شده به برنامه است. برای اینکار ابتدا باید dotnet workload install wasm-tools را نصب کرد (مهم). سپس به فایل csproj برنامه مراجعه کرده و فایل e_sqlite3.o را به آن معرفی میکنیم:
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> <ItemGroup> <!-- EF Core and Sqlite --> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.1" /> <NativeFileReference Include="Data\e_sqlite3.o" /> </ItemGroup> </Project>
سعی در اجرای مجدد برنامه
پس از نصب wasm-tools و ذکر NativeFileReference فوق، اکنون اگر برنامه را اجرا کنیم، برنامه بدون مشکل اجرا خواهد شد:
کدهای کامل این مطلب را از اینجا میتوانید دریافت کنید: BlazorWasmSQLite.zip
نظرات اشتراکها
معرفی DNTPersianComponents.Blazor
سلام
DNTPersianUtils با Net 6. هنگام پابلیش چنین خطایی صادر میکند
C:\Program Files\dotnet\packs\Microsoft.NET.Runtime.WebAssembly.Sdk\6.0.0\Sdk\WasmApp.Native.targets(506,5): Error : Precompiling failed for C:\Users\A-Pc\source\repos\Wasm\Client\obj\Release\net6.0\linked\DNTPersianUtils.Core.dll
نظرات اشتراکها
نگارش نهایی NET Core 2.1. منتشر شد
خیر. سایر نگارشهای نصب شده را هم در این آدرس میتوانید مشاهده کنید: C:\Program Files\dotnet\sdk
در این حالت اگر فایل global.json در ریشهی پروژه وجود نداشته باشد، همیشه از آخرین نگارش نصب شده به صورت خودکار استفاده میشود. اگر میخواهید پروژهای را محدود و مقید به یک شماره SDK خاص کنید، فایل global.json را به ریشهی پروژه با محتوای زیر اضافه کنید:
{ "sdk": { "version": "number ....." } }
اشتراکها
چرا CSV هنوز مهم است؟
A Blazor wrapper for the browser API File System Access
The API makes it possible to read and write to your local file system from the browser both files and directories.
Fast and simple Node.js version manager, built in Rust
Cross-platform support (macOS, Windows, Linux)
Single file, easy installation, instant startup
Built with speed in mind
Works with .node-version
and .nvmrc
files
Depcheck not only recognizes the dependencies in JavaScript files, but also supports these syntaxes:
- JavaScript (ES5, ES6 and ES7)
- React JSX
- CoffeeScript
- Typescript (with
typescript
dependency) - SASS and SCSS (with
node-sass
dependency) - Vue.js (with
vue-template-compiler
dependency)