Mở đăng ký khóa học Fullstack qua Zoom. Tham khảo tại đây

Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

Interactive Practice Tổng cộng 4,442 câu hỏi độc bản

Luyện Tập Phỏng Vấn Thử

Mô phỏng áp lực phỏng vấn thật với đồng hồ đếm ngược từng câu, tự đánh giá phản xạ và đo lường độ sẵn sàng của bạn.

Vui lòng đăng nhập để tham gia luyện tập và lưu tiến độ phỏng vấn.
Tất cả công nghệ .Net (39) ADO.NET (44) Agile scrum (33) Android (40) Angular (40) API Design (40) Arrays (40) ASP.NET (42) ASP.NET MVC (40) ASP.NET Web API (49) Availability & Reliability (40) Azure (49) Backtracking (40) Big-O Notation (35) Binary Tree (40) Bit Manipulation (40) Blockchain (45) C# (45) Caching (50) CAP Theorem (45) CDN (45) Concurrency (49) Cosmos DB (44) Cryptography (40) CSS (40) Data Structures (40) Databases (35) DDD (42) Dependency Injection (50) Design pattern (45) Devops (50) Divide & Conquer (40) Docker (43) Dynamic Programming (40) Entity Framework (40) Fibonacci Series (35) Flutter (40) Git (40) Go lang (40) Graph Theory (40) GraphQL (40) Greedy Algorithms (40) Hash Tables (40) Heaps and Maps (35) HTML (40) Ionic (45) IOS (45) Java (73) Javascript (81) jQuery (40) Kotlin (50) Kubernetes (11) Laravel (41) Layering & Middleware (44) Linked Lists (45) LINQ (40) Load Balancing (45) Microservices (44) Mongodb (45) MySQL (44) Net core (44) next.js (52) Node.js (40) NoSQL (48) Objective-C (40) OOP (44) Package Managerment (50) PHP (40) PostgreSQL (44) PWA (40) Python (41) Queues (44) React Native (48) React.js (45) Reactive Programming (50) Recursion (45) Redis (40) Ruby (44) Ruby on Rails (48) Rust (40) Searching (45) SOA (42) Software Architecture (44) Software Testing (40) Sorting (48) Spring (45) SQL (37) SQL Server (45) Stacks (44) Strings (50) Swift (45) System Design (56) Systems Design (7) T-SQL (39) Trees (49) Trie (35) Typescript (44) Unit testing (49) UX Design (50) Vue.js (50) Web security (40) WebSockets (49) Xamarin (40)
Khóa học Chuyên sâu ADO.NET

Làm Chủ Phỏng Vấn & Nâng Cao Trình Độ Chuyên Nghiệp

Hệ thống khóa học thực chiến chuẩn Enterprise giúp bạn tự tin chinh phục mọi kỳ phỏng vấn kỹ thuật và thăng tiến thu nhập.

01

Tại sao việc sử dụng khối lệnh 'using' khi khởi tạo SqlConnection và SqlCommand lại là quy tắc bắt buộc trong quản lý tài nguyên ADO.NET?

Junior

Trong ADO.NET, các đối tượng như SqlConnection và SqlCommand nắm giữ các tài nguyên hệ thống quý giá như kết nối vật lý đến cơ sở dữ liệu và bộ nhớ đệm. Các đối tượng này triển khai giao diện IDisposable. Việc sử dụng khối lệnh 'using' đảm bảo rằng phương thức Dispose() được gọi tự động ngay cả khi có ngoại lệ xảy ra. Điều này giúp giải phóng kết nối về Connection Pool ngay lập tức thay vì chờ đợi Garbage Collection, tránh tình trạng cạn kiệt kết nối (Connection Pool Exhaustion) trong ứng dụng Enterprise.

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
02

Sự khác biệt giữa Connection Pooling và việc mở/đóng kết nối thủ công là gì và tại sao nó ảnh hưởng đến hiệu năng ứng dụng?

Junior

Connection Pooling là cơ chế mặc định của ADO.NET giúp tái sử dụng các kết nối vật lý thay vì tạo mới mỗi khi cần. Khi bạn gọi Close() hoặc Dispose() trên một SqlConnection, kết nối không thực sự bị đóng mà được trả về Pool. Việc mở/đóng thủ công mà không có Pooling sẽ gây tốn kém tài nguyên CPU và thời gian do quá trình bắt tay (handshake) TCP/IP và xác thực bảo mật với SQL Server. Trong môi trường Enterprise, việc tận dụng Connection Pooling giúp giảm độ trễ (latency) và tăng khả năng chịu tải cho hệ thống.

03

Khi nào nên sử dụng SqlDataReader thay vì DataSet/DataTable trong các ứng dụng Web có lưu lượng truy cập cao?

Junior

SqlDataReader là một cơ chế đọc dữ liệu theo hướng tiến (forward-only) và chỉ đọc (read-only), giúp giảm thiểu đáng kể việc tiêu thụ bộ nhớ vì nó không tải toàn bộ dữ liệu vào RAM như DataSet. Trong các ứng dụng Web, việc sử dụng SqlDataReader giúp tối ưu hóa hiệu năng (memory footprint) và giảm áp lực lên Garbage Collection. DataSet/DataTable chỉ nên được sử dụng khi cần thao tác dữ liệu phức tạp, phân trang phía client hoặc cần truyền tải dữ liệu giữa các lớp (layers) mà không giữ kết nối mở.

04

Làm thế nào để xử lý các giá trị NULL từ cơ sở dữ liệu khi ánh xạ sang các kiểu dữ liệu giá trị (Value Types) trong C#?

Junior

Khi truy vấn dữ liệu, nếu một cột trong SQL có giá trị NULL, việc cố gắng gán trực tiếp vào kiểu dữ liệu như int hay DateTime sẽ gây ra lỗi InvalidCastException. Giải pháp là kiểm tra bằng phương thức IsDBNull() của SqlDataReader hoặc sử dụng toán tử null-coalescing kết hợp với Nullable Types (ví dụ: int?).

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
05

Tại sao việc chỉ định rõ SqlDbType và kích thước (Size) cho SqlParameter lại quan trọng đối với hiệu năng truy vấn?

Junior

Việc chỉ định rõ SqlDbType giúp ADO.NET tránh được quá trình suy luận kiểu dữ liệu (type inference) tốn kém. Đặc biệt với các kiểu dữ liệu chuỗi (như nvarchar), nếu không chỉ định kích thước, SQL Server có thể phải thực hiện việc chuyển đổi kiểu dữ liệu ngầm định hoặc không tận dụng được kế hoạch thực thi (Execution Plan) đã lưu trong bộ nhớ đệm (Plan Cache). Điều này có thể dẫn đến hiện tượng Parameter Sniffing hoặc làm chậm quá trình truy vấn do SQL Server phải biên dịch lại câu lệnh SQL cho mỗi kích thước tham số khác nhau.

06

Tại sao việc sử dụng SqlParameter thay vì nối chuỗi (String Concatenation) lại là yêu cầu bắt buộc để phòng chống lỗ hổng SQL Injection?

Junior

Nối chuỗi trực tiếp tạo điều kiện cho kẻ tấn công chèn các lệnh SQL độc hại vào tham số đầu vào. Sử dụng SqlParameter giúp ADO.NET gửi giá trị dưới dạng tham số riêng biệt với câu lệnh SQL. Cơ sở dữ liệu sẽ coi giá trị này là dữ liệu thuần túy (literal value) thay vì là một phần của lệnh thực thi. Ngoài ra, việc sử dụng tham số còn giúp SQL Server tái sử dụng Execution Plan, giúp tăng hiệu năng cho các truy vấn lặp lại.

07

Khi làm việc với các kiểu dữ liệu Nullable trong C# và cơ sở dữ liệu, việc sử dụng DBNull.Value khác gì so với giá trị null thông thường?

Junior

Trong C#, null là một tham chiếu không trỏ đến đối tượng nào, trong khi ADO.NET yêu cầu sử dụng DBNull.Value để biểu diễn giá trị NULL trong cơ sở dữ liệu. Nếu bạn truyền trực tiếp null vào SqlParameter, ADO.NET có thể hiểu đó là không có giá trị và gây lỗi hoặc hành vi không mong muốn. Do đó, khi gán giá trị cho tham số, bạn cần kiểm tra: command.Parameters.AddWithValue('@Param', value ?? (object)DBNull.Value);

08

Tại sao chúng ta nên ưu tiên sử dụng phương thức ExecuteScalar thay vì ExecuteReader khi chỉ cần lấy về một giá trị duy nhất từ cơ sở dữ liệu?

Junior

ExecuteScalar được thiết kế tối ưu để trả về cột đầu tiên của hàng đầu tiên trong tập kết quả, bỏ qua các dữ liệu còn lại. Điều này giúp giảm thiểu việc khởi tạo đối tượng SqlDataReader, tiết kiệm bộ nhớ và giảm tải cho hệ thống. Nếu bạn sử dụng ExecuteReader để lấy một giá trị đơn lẻ, bạn sẽ phải tốn thêm tài nguyên để tạo reader, duyệt qua tập kết quả và đóng reader, điều này không cần thiết và kém hiệu quả hơn về mặt tài nguyên.

09

Trong ADO.NET, tại sao việc sử dụng CommandBehavior.CloseConnection khi gọi phương thức ExecuteReader lại là một kỹ thuật tối ưu trong việc quản lý tài nguyên?

Junior

Khi bạn truyền CommandBehavior.CloseConnection vào phương thức ExecuteReader, đối tượng SqlDataReader sẽ tự động đóng SqlConnection liên kết ngay khi nó bị đóng. Điều này giúp giảm thiểu rủi ro quên đóng kết nối (Connection Leak) trong các phương thức trả về SqlDataReader cho tầng xử lý logic khác. Trong kiến trúc Enterprise, việc này đảm bảo kết nối được trả về Connection Pool ngay lập tức, tránh tình trạng cạn kiệt kết nối khi ứng dụng có tải cao.

10

Sự khác biệt giữa thuộc tính CommandTimeout và ConnectionTimeout trong ADO.NET là gì và làm thế nào để cấu hình chúng một cách hợp lý?

Junior

ConnectionTimeout là thời gian chờ tối đa để thiết lập kết nối ban đầu tới Server (mặc định là 15 giây), được cấu hình trong Connection String. CommandTimeout là thời gian chờ tối đa để thực thi một câu lệnh SQL (mặc định là 30 giây), được cấu hình trên đối tượng SqlCommand. Trong thực tế, bạn nên đặt ConnectionTimeout ngắn để phát hiện sớm lỗi mạng, và điều chỉnh CommandTimeout dựa trên độ phức tạp của câu truy vấn để tránh treo ứng dụng khi gặp các câu lệnh SQL chạy quá lâu.

11

Trong ADO.NET, tại sao việc sử dụng câu lệnh 'using' khi khởi tạo các đối tượng SqlConnection, SqlCommand và SqlDataReader lại là quy tắc bắt buộc trong phát triển Enterprise?

Junior

Trong ADO.NET, các đối tượng như SqlConnection, SqlCommand và SqlDataReader đều triển khai giao diện IDisposable vì chúng nắm giữ các tài nguyên không được quản lý (unmanaged resources) như kết nối mạng hoặc handle của hệ điều hành. Việc sử dụng khối 'using' đảm bảo rằng phương thức Dispose() được gọi tự động ngay cả khi có ngoại lệ xảy ra, giúp giải phóng tài nguyên ngay lập tức thay vì chờ đợi Garbage Collection. Nếu không giải phóng đúng cách, ứng dụng sẽ nhanh chóng rơi vào tình trạng cạn kiệt Connection Pool, dẫn đến lỗi 'Timeout expired' hoặc treo hệ thống. Ví dụ:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
12

Sự khác biệt giữa thuộc tính 'Initial Catalog' và 'Database' trong chuỗi kết nối (Connection String) của ADO.NET là gì và khi nào nên sử dụng từng loại?

Junior

Thực tế, 'Initial Catalog' và 'Database' là hai từ khóa đồng nghĩa trong chuỗi kết nối của SQL Server ADO.NET. Cả hai đều chỉ định tên cơ sở dữ liệu mặc định mà kết nối sẽ truy cập khi mở. Không có sự khác biệt về mặt kỹ thuật hay hiệu năng giữa chúng. Tuy nhiên, trong các dự án Enterprise, việc sử dụng 'Initial Catalog' được khuyến khích hơn vì đây là thuật ngữ chuẩn được Microsoft tài liệu hóa chính thức cho SQL Server, giúp mã nguồn trở nên đồng nhất và dễ bảo trì hơn đối với các lập trình viên khác trong đội ngũ.

13

Khi làm việc với ADO.NET, tại sao chúng ta nên ưu tiên sử dụng SqlDbType thay vì chỉ truyền giá trị trực tiếp vào SqlParameter?

Junior

Việc chỉ định rõ SqlDbType khi khai báo SqlParameter mang lại ba lợi ích quan trọng:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
14

Cơ chế 'Connection Pooling' trong ADO.NET hoạt động như thế nào và làm sao để kiểm soát số lượng kết nối tối đa trong một ứng dụng?

Junior

Connection Pooling là cơ chế giúp tái sử dụng các kết nối cơ sở dữ liệu thay vì tạo mới mỗi khi cần. Khi ứng dụng đóng kết nối (Close), kết nối đó không bị hủy thực sự mà được đưa vào một 'pool' để chờ tái sử dụng cho yêu cầu tiếp theo. Điều này giúp giảm đáng kể chi phí thiết lập kết nối (handshake). Để kiểm soát số lượng, chúng ta cấu hình trong Connection String thông qua các tham số:

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
15

Làm thế nào để thực hiện truy vấn dữ liệu an toàn với ADO.NET trong trường hợp tên bảng hoặc tên cột cần được truyền vào động từ phía người dùng?

Junior

Việc sử dụng Parameterized Queries thông thường không áp dụng được cho tên bảng hoặc tên cột (vì tham số chỉ thay thế cho giá trị dữ liệu). Để xử lý an toàn, tuyệt đối không được ghép chuỗi (concatenation) trực tiếp vì sẽ dẫn đến SQL Injection. Cách giải quyết là sử dụng danh sách trắng (Whitelist):

Nội dung chi tiết câu trả lời, phân tích kỹ thuật chuyên sâu, mã nguồn minh họa và các trường hợp ngoại lệ chỉ dành riêng cho học viên Unicode E-learning...

Để mở khóa toàn bộ giải pháp chi tiết và tài liệu hướng dẫn phỏng vấn, vui lòng nâng cấp tài khoản hoặc tham gia gói Learning Pass để truy cập không giới hạn.

// Mã nguồn và kiến trúc giải pháp bị ẩn đối với tài khoản chưa nâng cấp...
High-Ticket Mentoring
Cần Mentor Phỏng Vấn Thử 1-1 & Tối Ưu CV?

Mô phỏng phỏng vấn kỹ thuật thực tế 1-1 qua Google Meet, nhận xét chi tiết điểm mạnh/yếu và sửa CV trực tiếp cùng giảng viên Unicode.

AI Resume Scanner
Kiểm Tra CV Chuẩn ATS Miễn Phí

Tải CV của bạn lên để hệ thống AI rà soát từ khóa kỹ năng, định dạng và tính điểm chuẩn nhà tuyển dụng.

vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học