Vấn đề ngay lập tức của bạn có thể là một chuỗi kết nối không chính xác hoặc máy chủ cơ sở dữ liệu không khả dụng. Chuỗi kết nối phải giống như thế này
Server=localhost;Database=testdb;Uid=<username>;Pwd=<password>;
với <username>
và <password>
được thay thế bằng các giá trị thực tế của bạn.
Bên cạnh đó, mã của bạn có một số vấn đề và bạn chắc chắn nên xem xét chúng nếu điều này được dự định trở thành mã sản xuất và có thể ngay cả khi đây chỉ là một dự án đồ chơi để học hỏi điều gì đó. Danh sách theo thứ tự cụ thể và có thể không đầy đủ.
- Đừng mã hóa chuỗi kết nối của bạn. Thay vào đó, hãy chuyển nó vào tệp cấu hình.
- Không bao gồm mật khẩu văn bản thuần túy trong tệp cấu hình hoặc mã nguồn. Có nhiều giải pháp khác nhau như xác thực windows, chứng chỉ hoặc mật khẩu được bảo vệ bởi API Bảo vệ Dữ liệu của Windows .
- Không chỉ vứt bỏ
IDisposable
phiên bản bằng cách gọiIDisposable.Dispose()
. Thay vào đó, hãy sử dụngusing
tuyên bố giải phóng tài nguyên ngay cả trong trường hợp ngoại lệ. - Không xây dựng các câu lệnh SQL bằng kỹ thuật thao tác chuỗi. Thay vào đó, hãy sử dụng
SqlParameter
để ngăn chặn các cuộc tấn công đưa vào SQL. - Không lưu trữ mật khẩu văn bản thuần túy trong cơ sở dữ liệu. Thay vào đó, ít nhất hãy lưu trữ các hàm băm mặn của mật khẩu và sử dụng một hàm băm chậm, không phải MD5 hoặc một thành viên của Gia đình SHA.
- Bạn có thể sử dụng
IDbCommand.ExecuteScalar
để truy xuất kết quả vô hướng và tránh sử dụng trình đọc dữ liệu. - So sánh giá trị boolean với
true
hoặcfalse
là dư thừa và chỉ thêm nhiễu cho mã của bạn. Thay vìif (reader.IsDBNull(0) == true)
bạn chỉ có thể sử dụngif (reader.IsDBNull(0))
. Điều tương tự đối vớiif (reader.Read() != false)
tương đương vớiif (reader.Read() == true)
và do đó cũng cóif (reader.Read())
. - Sử dụng trình liên kết O / R như Khung thực thể thường được ưu tiên hơn là tương tác với cơ sở dữ liệu ở cấp độ các lệnh SQL.