2013-09-27 86 views
10

Xin chào tôi đã nhận được mã này đọc dữ liệu từ SQL DB.Sử dụng tên cột khi sử dụng SqlDataReader.IsDBNull

Tôi không biết phải chỉnh sửa như thế nào để tôi có thể sử dụng tên cột gốc và không sử dụng chỉ mục cột.

string query = "SELECT * FROM zajezd WHERE event='" + thisrow+ "' AND year='" + klientClass.Year() + "'"; 
SqlCommand cmd= new SqlCommand(query, spojeni); 
spojeni.Open(); 
SqlDataReader read= cmd.ExecuteReader(); 


if (read.Read()) 
{ 
    maskedTextBox2.Text = read.IsDBNull(24) ? 
     string.Empty : 
     read.GetDateTime(24).ToString("MM/dd/yyyy"); 

Xin cảm ơn trước.

+3

Vì vậy, bạn đang sử dụng SELECT * và cột bạn đang theo sau là cột thứ 24? Đây là một cách khủng khiếp để mã - điều gì xảy ra khi ai đó thay đổi bảng (ví dụ: thêm một cột ở đâu đó giữa 1-23)? Bạn có thể gặp lỗi hoặc bạn có thể xảy ra để nhận cột thời gian ngày khác và không thông báo. Ngoài ra, bạn có thích SQL injection? Vui lòng sử dụng truy vấn được tham số hóa. SQL động như thế này là lý do tại sao có rất nhiều khai thác SQL injection trên web mỗi ngày. –

+0

@NathanKoop trong bản chỉnh sửa của bạn, bạn đã thêm dấu ngoặc đóng. Có lẽ bạn là đúng, nhưng như bạn có thể nhìn thấy từ các ý kiến ​​dưới đây này đưa ra một ý nghĩa rất cụ thể cho các truy vấn được sử dụng bởi OP. Nếu OP chỉ cần một cột thì cách tiếp cận tốt hơn là có thể. – Steve

+0

@Steve xin lỗi vì phản hồi bị trì hoãn. Tôi không nhìn thấy (các) nhận xét mà bạn đang tham chiếu, nhưng tôi đã xóa bỏ phần quăn. Nó không phải là một vấn đề lớn đối với tôi một trong hai cách nếu nó có hoặc không :-) –

Trả lời

14

Bạn đang tìm kiếm SqlDataReader.GetOrdinal

Theo MSDN

Gets the thứ tự cột, được đặt tên của cột.

if (read.Read()) 
{ 
    int colIndex = read.GetOrdinal("MyColumnName"); 
    maskedTextBox2.Text = read.IsDBNull(colIndex) ? 
        string.Empty : 
        read.GetDateTime(colIndex).ToString("MM/dd/yyyy"); 

} 

Là một mặt lưu ý, câu hỏi của bạn là mở cửa cho sql injection. Không sử dụng nối chuỗi để xây dựng một lệnh sql nhưng sử dụng một truy vấn tham số

string query = "SELECT * FROM zajezd WHERE [email protected] AND [email protected]"; 
    using(SqlCommand cmd= new SqlCommand(query, spojeni)) 
    { 
    spojeni.Open(); 
    cmd.Parameters.AddWithValue("@p1",thisrow); 
    cmd.Parameters.AddWithValue("@p2",klientClass.Year().ToString()); 
    using(SqlDataReader read= cmd.ExecuteReader()) 
    { 
     ...... 
    } 
    } 
+0

Downvoter, bạn có thể giải thích những gì tôi đang thiếu? – Steve

+0

Tôi đã không downvote, nhưng nếu tôi đã làm nó tôi sẽ làm việc đọc bên ngoài vòng lặp. EDIT: Chỉ cần nhìn thấy đây là một câu lệnh 'if' không phải là một vòng lặp. Tôi đoán anh ta nên sử dụng ExecuteScaler thay thế. –

+0

Chúng tôi giả định rằng OP chỉ cần một cột, nhưng điều này không thể được xác minh từ mã không đầy đủ được đăng, tuy nhiên nếu OP thực sự chỉ cần một cột từ một bản ghi tôi đồng ý thì toàn bộ truy vấn sẽ được viết lại – Steve

7

tôi sẽ cố gắng (string)(reader["ColumnName"] == DBNull.Value ? "" : reader["ColumnName"]); để làm điều đó bởi tên cột.

+0

OP cần sử dụng IsDBNull và không thể thực hiện với tên cột .... – Steve

+0

Đây là những gì chúng ta làm và hoạt động tốt (string) (reader ["ColumnName"] == DBNull.Value? "": reader ["ColumnName"]); –

+0

Vâng, đó là chính xác, nhưng tại sao bạn không thêm vào câu trả lời của bạn sau đó? – Steve

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