2010-06-07 24 views
7

Tôi đang phát triển một ứng dụng trang web C# VS2008/SQL Server và mới vào lớp Từ điển. Bạn có thể vui lòng tư vấn về phương pháp tốt nhất để hoàn thành việc này không? Dưới đây là một đoạn mã:Tôi làm cách nào để truy cập các mục từ điển?

SqlConnection conn2 = new SqlConnection(connString); 
SqlCommand cmd = conn2.CreateCommand(); 
cmd.CommandText = "dbo.AppendDataCT"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = conn2; 
SqlParameter p1, p2, p3; 
foreach (string s in dt.Rows[1].ItemArray) 
{ 
    DataRow dr = dt.Rows[1]; // second row 
    p1 = cmd.Parameters.AddWithValue((string)dic[0], (string)dr[0]); 
    p1.SqlDbType = SqlDbType.VarChar; 
    p2 = cmd.Parameters.AddWithValue((string)dic[1], (string)dr[1]); 
    p2.SqlDbType = SqlDbType.VarChar; 
    p3 = cmd.Parameters.AddWithValue((string)dic[2], (string)dr[2]); 
    p3.SqlDbType = SqlDbType.VarChar; 
} 

nhưng điều này đem lại cho tôi lỗi biên dịch:

The best overloaded method match for 'System.Collections.Generic.Dictionary<string,string>.this[string]' has some invalid arguments 

Tôi chỉ muốn truy cập mỗi giá trị từ "dic" và nạp vào các tham số SQL. Làm thế nào để tôi làm điều này? Tôi có phải nhập khóa không? Các phím được đặt tên là "col1", "col2", v.v., do đó không phải là người dùng thân thiện nhất. Bạn có lời khuyên nào khác không? Cảm ơn!

+0

đây là bản sao, bạn đã hỏi điều này hai lần. –

+0

bản sao có thể có của [Cách chuyển một biến từ điển sang một quy trình khác] (http://stackoverflow.com/questions/2987142/how-to-pass-a-dictionary-variable-to-another-procedure) –

Trả lời

5

Dường như bạn đang cố gắng truy cập vào một chỉ số Dictionary<string, string> bởi số nguyên. Bạn không thể làm điều đó - bạn phải tra cứu giá trị bằng khóa, đó là một chuỗi.

Nếu bạn không muốn sử dụng các khóa chuỗi, tại sao bạn sử dụng một số Dictionary<string, string> để bắt đầu? Bạn có thể sử dụng một số List<string> hoặc Dictionary<int, string> không?

Lưu ý rằng khi bạn được quản lý để sử dụng trình lập chỉ mục một cách thích hợp, bạn sẽ không cần truyền tới chuỗi.

0

Giá trị phải được truy cập bằng khóa.

6

A Dictionary ánh xạ đối tượng của một loại thành các đối tượng thuộc loại khác. Trong trường hợp của bạn, bạn có một số Dictionary<string, string>. Vì vậy, nếu bạn đã có nó được khởi tạo như thế này:

Dictionary<string, string> dic = new Dictionary<string, string>() 
{ 
    { "key1", "value1" }, 
    { "key2", "value2" }, 
    { "key3", "value3" } 
}; 

Bạn sẽ nhận được giá trị cho key2 bằng cách làm

dic["key2"]; // gives "value2" 

Các Dictionary được mạnh mẽ, đánh máy, do đó không cần bất kỳ đúc. Như Jon Skeet nói, bạn có thể tốt hơn với một số List<string> tại đây. Bạn có thể truy cập chúng bằng chỉ số nguyên.

1

Nếu khóa của bạn là "col1", "col2", v.v ... thì sử dụng 0, 1, v.v ... sẽ gây ra lỗi mà bạn đang gặp phải. Hãy thử điều này:

p1 = cmd.Parameters.AddWithValue(dic["col1"], dr[0]); 
p1.SqlDbType = SqlDbType.VarChar; 
p2 = cmd.Parameters.AddWithValue(dic["col2"], dr[1]); 
p2.SqlDbType = SqlDbType.VarChar; 
p3 = cmd.Parameters.AddWithValue(dic["col3"], dr[2]); 
p3.SqlDbType = SqlDbType.VarChar; 

Ngoài ra, không cần phải bỏ qua string làm đối tượng từ điển sẽ trả lại chuỗi.

0

Tôi không thể hiểu bạn thực sự đang tìm gì, vì vậy đây là lời khuyên nhỏ của tôi. Có một cách để duyệt từ điển bằng cách không yêu cầu các mục theo khóa. Đó là một lựa chọn foreach.

foreach (KeyValuePair<string,string> pair in dic) 
{ 
    p. = cmd.Parameters.AddWithValue(dic.Value /*or dic.Key*/, (string)dr[0]); 
    p.SqlDbType = SqlDbType.VarChar; 
    // further processing of this parameter 
} 
1

Đây là một đoạn mã sẽ làm những gì bạn đang theo dõi, tôi nghĩ .. Bạn sẽ phải thêm vào một tuyên bố khác, nhưng nó sẽ giúp bạn bắt đầu.

public void AttachParam(ref DbCommand command, Dictionary<string, string> parameters) 
{ 
    try 
    { 
    if (parameters.Count > 0) 
    { 
     foreach (KeyValuePair<string, string> kvp in parameters) 
     { 
      command.Parameters.AddWithValue(kvp.Key, kvp.Value); 
     } 
    } 
    } 
    catch (Exception ex) 
    { 
    throw; 
    } 
} 
Các vấn đề liên quan