2011-10-17 25 views
8

Tôi tin rằng câu hỏi này đã được hỏi vài tháng trước, nhưng tôi tin rằng hoàn cảnh của tôi khác và các quy tắc tương tự có thể không áp dụng.Lỗi Cơ sở dữ liệu: Không có hàng tại vị trí 0

Mỗi khi tôi thực hiện phương pháp này, cùng một lỗi sẽ xuất hiện. Không có hàng ở vị trí 0. Nếu tôi thay đổi [0] thành [1] hoặc [15]; Không có hàng tại [1] và vv Điều này có nghĩa là cơ sở dữ liệu của tôi thậm chí không kết nối? Tôi có nên viết một số loại câu lệnh if để xác định xem các hàng có ở đó không?

public bool UpdateOrderToShipped(string order) 
{ 
    orderNumber = order; 
    string batch = ConfigurationManager.AppSettings["SuccessfulOrderBatch"]; 
    string statement = "UPDATE SOP10100 SET BACHNUMB = '"+ batch +"' WHERE SOPNUMBE = @SOPNUMBE"; 
    SqlCommand comm = new SqlCommand(statement, connectionPCI); 
    comm.Parameters.Add("SOPNUMBE", orderNumber); 
    try 
    { 
     comm.Connection.Open(); 
     comm.ExecuteNonQuery(); 
     comm.Connection.Close(); 
    } 
    catch(Exception e) 
    { 
     comm.Connection.Close(); 
     KaplanFTP.errorMsg = "Database error: " + e.Message; 
    } 

    statement = "SELECT SOPTYPE FROM SOP10100 WHERE SOPNUMBE = @SOPNUMBE"; 
    comm.CommandText = statement; 
    SqlDataAdapter da = new SqlDataAdapter(comm); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    soptype = dt.Rows[0]["SOPTYPE"].ToString(); //errror here 

    return true; 
} 
+1

Tại sao phương pháp của bạn là một bool? Nó chỉ trả về đúng – Andre

+0

@Andre: một lý do rõ ràng là trong tương lai bắt được sẽ trả về một sai để người gọi sẽ biết liệu nó có thành công hay không. – Chris

+0

@Chris, điều này là đúng trong một số phương pháp, nơi bạn mong đợi các lỗi xảy ra. Đây không phải là trường hợp. – Andre

Trả lời

17

Điều này rất đơn giản ... điều đó có nghĩa là không có kết quả nào được trả về từ truy vấn của bạn. Bạn luôn phải mã hóa phòng thủ và kiểm tra xem mảng Hàng có bất kỳ mục nào trong đó không trước khi cố gắng lập chỉ mục vào nó. Một cái gì đó như:

if (dt.Rows.Count > 0) 
    soptype = dt.Rows[0]["SOPTYPE"].ToString(); 
else 
    somethingWentWrong(); 
+0

Cảm ơn sự giúp đỡ:] – javasocute

+1

Cảm ơn bạn. Bằng cách "ds.Rows.Count" là đúng, không phải "Chiều dài". –

1

bạn có thể có dữ liệu trong bảng nhưng tôi nghĩ rằng kết nối sẽ đóng sau truy vấn đầu tiên. thử mở lại kết nối. Ngoài ra bạn có chuỗi nối trong truy vấn SQL đầu tiên, đó không phải là một thực hành tốt. thử sử dụng khối thay vì thử .. bắt, chỉ để có mã tốt hơn. Và như Joel đã đề xuất, hãy sử dụng séc

0

Tôi đã gặp vấn đề tương tự, sau đó tôi nhận ra rằng cột đầu tiên của tôi không dựa trên số nguyên. Vì vậy, khi tôi chỉnh sửa đầu tiên tôi phải đối mặt với cùng một lỗi.

Vì vậy, đề xuất của tôi là không chỉnh sửa cột đầu tiên hoặc cột đầu tiên là cột ID trong trường hợp đó bạn không phải chỉnh sửa bất kỳ điều gì.

0
for (int i = 0; i <= dt.rows.count; i++) 
{ 
    // do something till rows in DT 
} 
+1

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Ngoài ra, hãy cố gắng không gắn mã của bạn với các nhận xét giải thích vì điều này làm giảm khả năng đọc của cả mã và giải thích! – FrankerZ

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