2011-05-02 28 views
6

Tôi có một truy vấn SQL của mẫu đơn nàySử dụng các biến trong các truy vấn SQL trong asp.net (C#)

string cmdText = "Select * from " + searchTable 
    + "WHERE " + searchTable 
    + "Name =' " + searchValue + "'"; 

Về cơ bản những gì tôi đang cố gắng làm là nhận được thông tin một diễn viên đặc biệt từ bảng diễn viên của cơ sở dữ liệu. Biến searchTable có giá trị 'Actor' là tên bảng và searchValue có tên của tác nhân (được đại diện bởi thuộc tính ActorName trong bảng Actor, ở đây tôi đang cố gắng tạo thành tên của thuộc tính bằng cách nối các từ 'Actor 'và 'Tên')

Vì vậy, tốt, tất cả điều này nối kết quả trong (hoặc ít nhất nên kết quả trong) một truy vấn có dạng:

Select * from Actor where ActorName ='some actor'; 

Nhưng khi tôi cố gắng chạy này nó mang lại cho tôi lỗi "Cú pháp sai gần '='" trong trình duyệt. Bất cứ ai có thể vui lòng giúp đỡ?

Trả lời

5

Bạn không nên ghép nối chuỗi thành SQL, vì điều này sẽ mở cho bạn tối đa SQL Injection attacks.

This là một câu đọc khá dài về SQL động, nhưng đáng đọc để hiểu các rủi ro và tùy chọn.

Bạn nên sử dụng parameterized queries thay vào đó, mặc dù cách duy nhất để sử dụng tên bảng làm tham số là sử dụng SQL động.

Tôi mong bạn thay đổi cách tiếp cận của bạn về tên bảng - điều này sẽ dẫn đến các vấn đề trong tương lai - nó không thể duy trì và như tôi đã đề cập ở trên, có thể mở bạn đến SQL Injection.


Lỗi bạn đang thấy là kết quả của việc nối bạn đang thực hiện với mệnh đề "Ở đâu" - bạn đang thiếu một khoảng trắng trước đó. Bạn cũng đang thêm một dấu cách sau số ' trong thông số kết thúc bằng "Tên".

chuỗi kết quả của bạn, sử dụng ví dụ của bạn sẽ là:

Select * from ActorWHERE ActorName =' some actor'; 
+0

Cảm ơn bạn đã trả lời, tôi chắc chắn sẽ đọc về điều đó! – QPTR

+0

Cảm ơn bạn đã liên kết! Tôi sẽ thử sử dụng chúng. – QPTR

8

Bạn có thể đặt (và nên!) Các thông số vào các truy vấn SQL của bạn cho các giá trị trong ví dụ mệnh đề WHERE của bạn - nhưng bạn không thể thông tin đại diện như tên bảng của bạn.

Vì vậy, tôi muốn viết lại truy vấn là:

SELECT (list of columns) 
FROM dbo.Actor 
WHERE ActorName = @ActorName 

và sau đó vượt qua chỉ trong giá trị cho @ActorName.

Nếu bạn cần phải làm điều tương tự đối với giám đốc, bạn phải có một truy vấn thứ hai

SELECT (list of columns) 
FROM dbo.Directors 
WHERE DirectorName = @DirectorName 

Sử dụng các thông số như thế này

  • tăng cường an ninh (cấm tấn công SQL injection!)
  • tăng cường hiệu suất: kế hoạch truy vấn cho truy vấn có thể được lưu trữ và tái sử dụng cho thứ hai, thứ ba chạy

PS: vấn đề ban đầu trong thiết lập của bạn là thế này: bạn không có bất kỳ khoảng trống giữa đầu tiên sự xuất hiện của tên bảng của bạn và WHERE khoản - do đó bạn sẽ nhận được:

SELECT * FROM ActorWHERE ActorName ='.....' 

Nếu bạn thực sự nhấn mạnh vào concatenating cùng câu lệnh SQL của bạn (! tôi sẽ KHÔNG khuyên nó), sau đó bạn cần phải đặt một không gian giữa tên bảng vàcủa bạn 0!

Cập nhật: một số tài nguyên để tìm hiểu về các truy vấn parametrized trong ADO.NET:

+0

Cảm ơn bạn đã trả lời chi tiết, tôi rất rất mới với asp.net và C# và người hướng dẫn của chúng tôi vừa kết nối với chúng tôi. Điều đó nói rằng, tôi rất muốn biết nhiều hơn về các truy vấn tham số, tôi googled nó nhưng không thể tìm thấy bất kỳ giới thiệu thỏa đáng, một cái gì đó với các ví dụ mã, có một liên kết bạn có thể hướng dẫn tôi đến? Dù sao, cảm ơn rất nhiều sự giúp đỡ của bạn! – QPTR

+0

@QPTR: đã thêm một số liên kết tài nguyên –

+0

Cảm ơn bạn đã liên kết! – QPTR

1

Có một trống còn thiếu và là một trong quá nhiều:

searchTable + "Name =' " 

nên đọc

searchTable + " Name ='" 

Bên cạnh đó, hãy sử dụng tham số SQL để ngăn SQL injection.

+0

Cảm ơn bạn đã trả lời, tôi đã không nhận thấy không gian, nó hoạt động ngay bây giờ. – QPTR

-1
string cmdText = "Select * from " + searchTable + " WHERE Name = '" + searchValue + "'"; 
+0

Cảm ơn bạn đã trả lời, nó hoạt động ngay bây giờ! – QPTR

Các vấn đề liên quan