Thứ Năm, 18 tháng 5, 2023

Xóa nhanh toàn bộ dữ liệu trong tất cả Table có trong Database

 Để xóa toàn bộ dữ liệu trong tất cả các bảng có trong một cơ sở dữ liệu, bạn có thể sử dụng câu lệnh EXEC sp_MSforeachtable 'TRUNCATE TABLE ?'. Lệnh này sẽ thực thi lệnh TRUNCATE TABLE trên mỗi bảng trong cơ sở dữ liệu một cách tự động.

Vui lòng lưu ý rằng lệnh này sẽ xóa toàn bộ dữ liệu trong tất cả các bảng mà không thể khôi phục lại được. Hãy đảm bảo bạn đã sao lưu dữ liệu hoặc chắc chắn rằng bạn không cần giữ lại bất kỳ dữ liệu nào trong các bảng trước khi thực hiện lệnh này.

Thực thi tác vụ trong một khoảng thời gian quy định

Để thực hiện một hàm trong một khoảng thời gian quy định và ngừng nếu quá thời gian, bạn có thể sử dụng đối tượng CancellationTokenSource và Task trong C#. Dưới đây là một ví dụ minh họa:

csharp
using System; using System.Threading; using System.Threading.Tasks; public class Program { public static void Main() { CancellationTokenSource cts = new CancellationTokenSource(); TimeSpan duration = TimeSpan.FromHours(3); // Bắt đầu thực hiện hàm A trong 3 giờ Task task = Task.Run(() => FunctionA(cts.Token), cts.Token); // Chờ trong 3 giờ bool completed = task.Wait(duration); // Kiểm tra xem hàm đã hoàn thành hay chưa if (completed) { Console.WriteLine("Hàm A đã hoàn thành trong thời gian quy định."); } else { // Nếu hàm chưa hoàn thành, hủy tác vụ và thông báo hết giờ cts.Cancel(); Console.WriteLine("Hết giờ quy định, hàm A đã bị dừng."); } } public static void FunctionA(CancellationToken cancellationToken) { // Ví dụ: Thực hiện một công việc lặp đi lặp lại trong hàm A while (!cancellationToken.IsCancellationRequested) { // Thực hiện công việc Console.WriteLine("Đang thực hiện công việc A..."); // Ngừng một khoảng thời gian trước khi tiếp tục Task.Delay(TimeSpan.FromSeconds(1)).Wait(); } } }

Trong ví dụ trên, chúng ta sử dụng CancellationTokenSource để tạo ra một CancellationToken để có thể hủy bỏ thực thi của hàm A. Task.Run được sử dụng để chạy hàm A trong một luồng riêng biệt. Bằng cách sử dụng Task.Wait, chúng ta chờ đợi trong một khoảng thời gian quy định (3 giờ). Nếu hàm A hoàn thành trong thời gian quy định, chúng ta sẽ nhận được thông báo "Hàm A đã hoàn thành trong thời gian quy định". Nếu hàm A không hoàn thành trong thời gian quy định, chúng ta sẽ hủy bỏ tác vụ và nhận được thông báo "Hết giờ quy định, hàm A đã bị dừng".


Lưu ý rằng trong hàm A, chúng ta cần kiểm tra cancellationToken.IsCancellationRequested để kiểm tra xem có yêu cầu hủy bỏ thực thi hay không. Trường hợp này cho phép chúng ta thoát khỏi vòng lặp và dừng thực hiện công việc.



Thứ Năm, 13 tháng 4, 2023

Đóng gói nhiều DLL lại thành 1 DLL duy nhất (Khi DLL này gọi đến DLL kia chạy, nhưng không muốn add references nhiều DLL)

Để gộp các DLL phụ thuộc vào một DLL chính, bạn có thể sử dụng công cụ ILMerge. ILMerge là một công cụ mã nguồn mở cho phép bạn gộp nhiều tệp DLL thành một tệp DLL duy nhất.

Cài đặt ILMerge bằng cách tải xuống và cài đặt gói cài đặt từ trang web chính thức của ILMerge. Hoặc search trong Nuget :  https://www.nuget.org/packages/ilmerge

Sau khi cài đặt, bạn có thể sử dụng ILMerge trong dòng lệnh hoặc trong script MSBuild.

Ví dụ, để gộp tất cả các DLL phụ thuộc vào một DLL chính có tên là MyApplication.exe, bạn có thể sử dụng lệnh dòng lệnh sau:

cmd
ILMerge.exe /target:exe /out:MyApplicationMerged.exe MyApplication.exe DependentAssembly1.dll DependentAssembly2.dll

Trong ví dụ này, ILMerge.exe là tên tệp thực thi của ILMerge, /target:exe cho biết rằng đối tượng đầu vào là một tệp thực thi, /out:MyApplicationMerged.exe cho biết tên của tệp kết quả, và MyApplication.exe, DependentAssembly1.dll và DependentAssembly2.dll là các tệp DLL cần được gộp vào tệp chính.

Nếu bạn muốn gộp các tệp DLL thành một tệp DLL thư viện, bạn có thể thay thế /target:exe bằng /target:library.

Ví dụ: Để gộp các tệp DLL "file1.dll", "file2.dll", "file3.dll" thành một tệp DLL duy nhất có tên "newfile.dll" bằng ILMerge, bạn có thể sử dụng lệnh dòng lệnh sau:

cmd
ILMerge.exe /out:newfile.dll file1.dll file2.dll file3.dll

Bạn cần đảm bảo rằng tất cả các tệp DLL phụ thuộc được đặt trong cùng thư mục với tệp thực thi ILMerge.exe. Bạn cũng có thể chỉ định đường dẫn tuyệt đối hoặc tương đối đến các tệp DLL nếu chúng không nằm trong cùng thư mục.

Thứ Sáu, 7 tháng 4, 2023

Cải thiện tốc độ khi update vào table có dữ liệu quá lớn.

Khi update một bảng có dữ liệu lớn, thường sẽ gặp phải vấn đề về hiệu suất và thời gian thực thi. Để cải thiện hiệu suất của câu lệnh UPDATE, bạn có thể thực hiện các cách sau:

  1. Sử dụng câu lệnh UPDATE với điều kiện WHERE cụ thể: Nếu bạn chỉ muốn cập nhật một phần nhỏ của bảng, hãy sử dụng điều kiện WHERE cụ thể để giới hạn số lượng dòng bị ảnh hưởng bởi câu lệnh UPDATE.
  2. Sử dụng index trên các cột được sử dụng trong điều kiện WHERE: Nếu bảng của bạn có một số lượng lớn các dòng và câu lệnh WHERE dựa trên một hoặc nhiều cột, bạn có thể tăng tốc độ câu lệnh UPDATE bằng cách tạo index trên các cột đó. Việc này sẽ giảm thời gian tìm kiếm trong bảng để tìm các dòng phù hợp với điều kiện WHERE.
  3. Sử dụng cú pháp MERGE: Nếu bạn muốn cập nhật bảng đích từ bảng nguồn, bạn có thể sử dụng câu lệnh MERGE thay vì câu lệnh UPDATE. Cú pháp MERGE cho phép bạn thực hiện nhiều thao tác (cập nhật, chèn, xóa) trong một câu lệnh, giảm thời gian thực thi.
  4. Chia nhỏ câu lệnh UPDATE thành nhiều phần: Nếu bảng của bạn quá lớn, bạn có thể chia câu lệnh UPDATE thành nhiều phần bằng cách sử dụng cấu trúc tập hợp và câu lệnh WHERE. Việc này sẽ giảm tác động lên bảng và giúp tăng tốc độ thực thi câu lệnh.
  5. Tăng kích thước bộ đệm: Nếu máy chủ SQL Server của bạn đang sử dụng bộ đệm có kích thước mặc định, bạn có thể tăng kích thước bộ đệm để giảm thời gian I/O và tăng hiệu suất của các câu lệnh UPDATE.
  6. Nâng cấp phần cứng hoặc thay đổi cấu trúc bảng: Nếu bảng của bạn quá lớn và máy chủ SQL Server của bạn không đủ khả năng để xử lý nó, bạn có thể cân nhắc nâng cấp phần cứng hoặc thay đổi cấu trúc bảng

 

Cú pháp MERGE được sử dụng để thực hiện các hoạt động chèn, cập nhật và xóa trên bảng đích dựa trên các dữ liệu được cung cấp từ bảng nguồn. Câu lệnh MERGE thường được sử dụng để cập nhật hoặc thêm mới các dữ liệu trong một bảng.

Ví dụ, giả sử bạn có hai bảng Sales và SalesUpdate. Bảng Sales chứa các thông tin về các đơn hàng đã được bán, trong khi bảng SalesUpdate chứa các thông tin về các đơn hàng mới nhất đã được cập nhật từ hệ thống bán hàng của bạn. Bạn muốn cập nhật bảng Sales với các thông tin mới nhất từ bảng SalesUpdate.

Câu lệnh MERGE sẽ được sử dụng để thực hiện việc này như sau:

sql
MERGE INTO Sales AS Target 
USING SalesUpdate AS Source 
ON (Target.SalesOrderID = Source.SalesOrderID) 
WHEN MATCHED THEN 
    UPDATE SET Target.ShipDate = Source.ShipDate, Target.TotalDue = Source.TotalDue WHEN NOT MATCHED BY TARGET THEN 
    INSERT (SalesOrderID, OrderDate, DueDate, ShipDate, TotalDue)
    VALUES (Source.SalesOrderID, Source.OrderDate, Source.DueDate, Source.ShipDate, Source.TotalDue);
Trong câu lệnh MERGE này:

Bảng Sales được đặt làm bảng đích (Target), và bảng SalesUpdate được đặt làm bảng nguồn (Source).

Dòng "ON" xác định điều kiện ghép nối giữa bảng đích và bảng nguồn. Trong ví dụ này, các đơn hàng trong Sales sẽ được ghép nối với các đơn hàng trong SalesUpdate dựa trên trường SalesOrderID.

Khi có bất kỳ đơn hàng nào được tìm thấy trong cả hai bảng (MATCHED), thì dòng "WHEN MATCHED" sẽ được thực hiện để cập nhật thông tin của đơn hàng trong bảng Sales với thông tin mới nhất từ bảng SalesUpdate.

Khi không có đơn hàng nào được tìm thấy trong bảng đích (NOT MATCHED BY TARGET), thì dòng "WHEN NOT MATCHED BY TARGET" sẽ được thực hiện để chèn các đơn hàng mới từ bảng SalesUpdate vào bảng Sales.

Lưu ý rằng cú pháp MERGE sẽ chỉ hoạt động trên các phiên bản SQL Server 2008 trở lên.

Thứ Sáu, 17 tháng 3, 2023

 

Cách tạo một Windows Service Applications đơn giản trong Visual Studio với CSharp

 Windows Service Applications  hay là Microsoft Windows services  ( còn gọi là các NT services)  cho phép chúng ta viết các ứng dụng chạy ngầm bên trong các phiên làm việc của Windows mà không cần có giao diện người sử dụng để tương tác với chúng.

      Mục đích của chúng để thực hiện các công việc theo một quy trình tuần hoàn nào đó với các tham số, cấu hình được định nghĩa trước mà người sử dụng không cần phải can thiệp thông qua giao diện, chúng được thiết lập các tham số để chạy.  Các services này có thể được chạy một cách tự động chạy khi máy tính khởi động, có thể tạm dừng và khởi động lại services.

     Dưới đây xin trình bày các tạo ra một Window Services đơn giản nhất sử dụng Visual Studio 2012.

Windows Service Applications hay là Microsoft Windows services ( còn gọi là các NT services) cho phép chúng ta viết các ứng dụng chạy ngầm bên

 

       Đặt tên cho Project Services rồi  nhấn Ok, Project Windows Service sẽ có cấu trúc như sau.

Tao Project Windows Services Trong Visual Studio 2012 -01

      File chính mặc định của Project là Services1.cs,  trong ví dụ được đổi thành tên DemoServices.cs theo tên Project.

      Các ứng dụng Windows Services do người dùng viết đều được kế thừa từ lớp ServiceBase  trong namspace có tên  System.ServiceProcess.

1.  Ghi lại hoạt động của Services bằng EventLog

      Do các Windows Services không có giao diện người sử dụng, nên để theo dõi hoạt động của  Services người ta thường sử dụng Log của window để chứa các thông tin liên quan tới các thao tác xử lý bên trong Services. Để cập nhật vào dữ liệu Log của Window. Trong C# người ta sẽ sử dụng lớp EventLog trong namespace System.Diagnostics

      Việc khởi tạo đối tượng ghi Log của Window thường diễn ra trong Constructor của lớp Services, trong ví dụ này là DemoServices

    Thuộc tính Source dùng để định danh cho Log giúp, thường có tên trùng với ứng dụng để xác định Log này được dùng cho ứng dụng nào, trong ví dụ này là DemoSource.  Đoạn code trên giúp kiểm tra xem đã tồn tại Log nào sử dụng tên như vậy trong hệ thống chưa, nếu chưa tồn tại thì thực hiện log.

2.  Xử lý nghiệp vụ mang tính tuần hoàn bằng cách sử dụng 1 Timer.

      Mục đích sử dụng của Windows Services thường dùng để giải quyết các công việc theo quy trình mang tính chất lặp đi lặp lại và để thực hiện điều này trong Windows Services chúng ta thường sử dụng 1 Timer,  Trong C# cung cấp lớp Timer trong namspace System.Timers .

      Việc khởi tạo đối tượng Timer của Window thường diễn ra trong Constructor của lớp Services, trong ví dụ này là DemoServices

3. Các phương thức khác.

      Khi tạo Windows Services thường sẽ có thêm 2 phương thức cơ bản dùng để khởi động hoặc tắt Services bao gôm OnStart và OnStop như sau

       Nếu có sử dụng Timer bên trong Services thì Onstart thường sẽ là nơi dừng quy trình cũ và thự hiện quy trính mới.

Nếu có sử dụng Timer bên trong Services thì OnStop thường sẽ là nơi dừng quy trình cũ

Ngoải ra còn có thể bổ sung cho Services một sốcác phương thức hỗ trợ như tạm dừng ( OnPause), tiêp tục ( OnContinue),..

Dưới đây là toàn bộ code đẩy đủ của ví dụ.

4.  Tạo thông tin cài đặt cho Services bằng cách sử dụng lớp Installer

Để cài đặt services cần tạo bộ cài đặt cho Serivces thông qua lớp Installer của namspace System.Configuration.Install

Kích chuột phải vào file DemoServices chọn View Designer trên Visual Studio. Tại View Designer tiếp chọn Add Installer. 

Tao Project Windows Services Trong Visual Studio 2012 -02

5. Thực hiện Cài đặt Services thực tế trên hệ thống

     Có nhiểu cách để hỗ trợ bạn cài đặt window services:

 Cách 1 : Sử dụng lệnh command line sc để cài đặt Windows Services

 Cách 2 : Sử dụng tiên ích có sẵn của Visual Studio – Công cụ Installutil.exe ( thường sử dụng khi tự test)

  • Để cài đặt Windows Services, bạn phải có quyền Admin trên máy tính cần cài đặt. Các bước cài nh sau:
  1. Trong  Windows 7 và Windows Server, mở Developer Command Prompt  của Visual Studio Tools trong Start. Trong Windows 8 hoặc  Windows 8.1, chọn Visual Studio Tools trong màn hình Start, và chạy Developer Command Prompt với quyền Admin. (thực hiện right-click trên Developer Command Prompt, và chọn Run as Administrator.)

  2. Mở Command Prompt window, di chuyển tới file Exe project Windows Serivces  của bạn. Ví dụ của tôi là:  Visual Studio 2013\Projects\WindowSerivcesDemo\bin\Debug.

  3. Chạy dòng lệnh sau:

Cách 3 : Tạo Project cài đặt, được sử dụng khi Services được tạo trên máy khách hàng

      Xem chi tiết : tại đây

Cách 4 : Sử dụng bằng tay với các lệnh của PowerShell

Một sỗ lỗi khi cài đặt

    – Lỗi : “The source was not found, but some or all event logs could not be searched.  Inaccessible logs: Security.”

    – Khắc phục : chạy Developer Command Prompt với quyền Admin

 6. Kiểm tra Services sau cài đặt

     Kiểm tra services cài đặt thành công chưa bằng cách mở màn hình Start hoăc menu Start, và gõ services.msc.

Tao Project Windows Services Trong Visual Studio 2012 -04

    Start Services  bằng cách kích chuột phải và Start. Kiểm tra log xem thông tin hoạt động của Services.

Tao Project Windows Services Trong Visual Studio 2012 -03

Nguồn: https://hoctoantap.com/2016/08/12/cach-tao-mot-windows-service-applications-don-gian-trong-visual-studio-voi-csharp.html