2010-01-28 39 views
11

Sau một vài hướng dẫn và tôi có thể tạo thành công một lớp sưu tập kế thừa chức năng cần thiết để tạo một DataTable có thể được chuyển đến một thủ tục lưu trữ của Sql Server như một tham số giá trị bảng. Mọi thứ dường như hoạt động tốt; Tôi có thể nhận được tất cả các hàng được thêm vào và nó trông đẹp. Tuy nhiên, khi kiểm tra kỹ hơn, tôi nhận thấy rằng khi tôi thêm một hàng mới, dữ liệu cho tất cả các hàng trước đó sẽ bị ghi đè bằng giá trị cho hàng mới. Vì vậy, nếu tôi có một hàng với một giá trị chuỗi của "foo" và tôi thêm một hàng thứ hai với giá trị "bar", hàng thứ hai sẽ được chèn (tạo một DataTable với hai hàng) nhưng cả hai hàng sẽ có giá trị "bar ". Bất cứ ai có thể thấy lý do tại sao điều này sẽ được? Dưới đây là một số mã, hoạt động nhưng đã được đơn giản hóa một chút (lớp Tag đã được giảm để dễ giải thích).Tại sao thêm một giá trị mới vào danh sách <> ghi đè các giá trị trước đó trong danh sách <>

Sau đây là lớp Collection của:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Web; 
using Microsoft.SqlServer.Server; 

namespace TagTableBuilder 
{ 
public class TagCollection : List<Tag>, IEnumerable<SqlDataRecord> 
{ 
    IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator() 
    { 
     var sdr = new SqlDataRecord(
      new SqlMetaData("Tag", SqlDbType.NVarChar) 
      ); 

     foreach (Tag t in this) 
     { 
      sdr.SetSqlString(0, t.tagName); 

      yield return sdr; 
     } 
    } 
} 

public class Tag 
{ 
    public string tagName { get; set; } 
} 
} 

Chúng được gọi như sau:

//Create instance of collection 
TagCollection tags = new TagCollection(); 

//Create instance of object 
Tag _tag = new Tag(); 

foreach (string t in tagList) 
{ 
    //Add value to class propety 
    _tag.tagName = t; 
    //Add class to collection, this is where all previously added rows are overwritten 
    tags.Add(_tag); 
} 
+0

Đúng, tôi nên sửa lỗi đó ngay lập tức cảm ơn bạn! –

Trả lời

25

Bạn đang sử dụng cùng một ví dụ của đối tượng Tag bên trong vòng lặp, vì vậy mỗi lần cập nhật tới tagName là cùng một tham chiếu. Di chuyển tờ khai bên trong vòng lặp để có được một đối tượng tươi trên mỗi lộ trình qua các vòng lặp:

foreach (string t in tagList) 
{ 
    Tag _tag = new Tag(); 

    //Add value to class propety 
    _tag.tagName = t; 
    //Add class to collection, this is where all previously added rows are overwritten 
    tags.Add(_tag); 
} 

Cũng cần chú ý rằng tôi cập nhật dòng cuối cùng để thêm _tag thay vì mTag như tôi không thấy điều này được xác định ở bất cứ đâu.

2

Trong vòng lặp nơi bạn thêm thẻ vào bộ sưu tập, bạn đang sử dụng cùng một đối tượng của Thẻ. Về cơ bản, bạn đang đặt tên Thẻ thành giá trị đầu tiên trong danh sách thẻ và thêm nó vào bộ sưu tập, sau đó bạn đang thay đổi tên của cùng một thẻ đó thành giá trị thứ hai trong danh sách thẻ và thêm lại vào bộ sưu tập.

Bộ sưu tập thẻ của bạn chứa một số tham chiếu đến cùng một đối tượng Thẻ! Khởi tạo _tag bên trong vòng lặp for mỗi lần trước khi đặt tên của Thẻ và thêm nó vào bộ sưu tập.

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