Secret Squirrel đã chính xác khi sử dụng dấu "?" cho các biến được tham số hóa. MySQL sử dụng "@" cho các biến sql nội tuyến cho các truy vấn và do đó mong đợi chúng được khai báo chẳng hạn như từ một tập lệnh hoặc một phần của khai báo nội tuyến (chọn truy vấn con).
Bạn cần thay đổi CẢ các phiên bản của tham số ... cả trong truy vấn và dưới dạng lệnh.Parameters.Add ... instance.
Ngoài ra, tôi nhận thấy, và không chắc có phải nó hay không, nhưng trong mệnh đề WHERE của bạn, bạn có "mật khẩu" (chỉ một 's') và mật khẩu (hai '). Không biết có cố ý hay không.
Một điều CUỐI CÙNG CÓ THỂ giúp ích. Vì một số tham số khớp với tên cột, tôi khuyên bạn nên thay đổi các tham số CHẬM bằng cách chỉ thêm một cái gì đó như "x" để LỰC LƯỢNG phân biệt giữa tên cột và các tham số thực tế ...
where... p.LoginID = ?xLoginID ...
và trong các tham số lệnh
objCommand.Parameters.AddWithValue("?xLoginID", loginID);