Có SqlCommand.Clone()
tạo bản sao sâu hoặc bản sao nông không? Ngoài ra, có an toàn khi gọi Clone()
từ nhiều luồng cùng lúc (tạo một lệnh mà nhiều luồng có thể sao chép, đặt giá trị tham số và thực thi) không?SqlCommand.Clone() có tạo bản sao sâu hoặc bản sao nông không?
Trả lời
Không an toàn khi gọi Clone
từ nhiều chủ đề vì chính lớp học SqlCommand
không phải là lớp an toàn chủ đề. bạn nên lock
trước khi nhân bản ..
Tuy nhiên bạn có thể nhìn vào SqlCommand.Clone()
phương pháp sử dụng các chương trình như Reflector
, đây là mã thực tế:
public SqlCommand Clone()
{
SqlCommand command = new SqlCommand(this);
Bid.Trace("<sc.SqlCommand.Clone|API> %d#, clone=%d#\n", this.ObjectID, command.ObjectID);
return command;
}
internal static void Trace(string fmtPrintfW, int a1, int a2)
{
if (((modFlags & ApiGroup.Trace) != ApiGroup.Off) && (modID != NoData))
{
NativeMethods.Trace(modID, UIntPtr.Zero, UIntPtr.Zero, fmtPrintfW, a1, a2);
}
}
[DllImport("System.Data.dll", EntryPoint="DllBidTraceCW", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
internal static extern void Trace(IntPtr hID, UIntPtr src, UIntPtr info, string fmtPrintfW, int a1, int a2);
private SqlCommand(SqlCommand from) : this()
{
this.CommandText = from.CommandText;
this.CommandTimeout = from.CommandTimeout;
this.CommandType = from.CommandType;
this.Connection = from.Connection;
this.DesignTimeVisible = from.DesignTimeVisible;
this.Transaction = from.Transaction;
this.UpdatedRowSource = from.UpdatedRowSource;
SqlParameterCollection parameters = this.Parameters;
foreach (object obj2 in from.Parameters)
{
parameters.Add((obj2 is ICloneable) ? (obj2 as ICloneable).Clone() : obj2);
}
}
Bạn có thể thấy rằng nó tạo một đối tượng mới và thêm vào đó tất cả các thuộc tính cũ, nhưng nó không sao chép sâu tất cả các thuộc tính "chẳng hạn như Connection
chẳng hạn" và do đó nó là bản sao nông.
Tôi không mong đợi nó sao chép tài nguyên critcal như SqlConnection. Tôi sẽ nói bởi vì nó nhân bản tất cả các tham số ICloneable rằng nó đang thực hiện một 'nỗ lực tốt nhất' tại một bản sao sâu. Trong ứng dụng tôi đang xem xét nó không bao giờ sử dụng SqlCommand 'ban đầu', vì vậy các thuộc tính Connection và Transaction sẽ luôn luôn là null trên thể hiện 'from' hoặc 'original'. – yzorg
@yzorg: đúng, nhưng vì nó không sao chép tất cả dữ liệu sâu sắc "như' SqlConnection', 'Tham số' ..", nó được coi là bản sao nông. Nó chỉ được coi là một 'bản sao sâu' nếu nó sao chép tất cả dữ liệu sâu sắc, vì vậy nếu bạn thay đổi bất kỳ tài sản nào từ bản gốc hoặc bản sao, nó sẽ không ảnh hưởng đến tài sản khác. –
Phương thức SqlCommand.Clone
thực hiện bản sao nông. Bất kỳ thuộc tính nào là một kiểu tham chiếu sẽ đại diện cho cùng một đối tượng trong cả hai trường hợp SqlCommand. Vì vậy, không phải thread an toàn.
AFAIK, tất cả các phương thức Clone() (MemberwiseClone) trong khuôn khổ .NET là bản sao nông.
Bạn chưa đăng mã, nhưng tôi khuyên bạn nên tạo SqlCommand
mới thay vì nhân bản.
- 1. Arrays.copyOf có tạo bản sao nông hoặc sâu không?
- 2. std vector C++ - bản sao sâu hoặc nông
- 3. Hoạt động cắt có cho tôi bản sao sâu hoặc nông không?
- 4. ArrayList bản sao nông lặp hoặc sao chép()
- 5. bản sao sâu vs Sao chép Shallow
- 6. Hiểu dict.copy() - nông hoặc sâu?
- 7. Phương pháp sao chép trên mảng bản sao sâu hay nông?
- 8. Sao chép danh sách trong python: sâu vs nông bản sao: gotcha cho tôi trong python?
- 9. BeanUtils.cloneBean() bản sao sâu
- 10. C# Từ điển bản sao nông nghiệp?
- 11. Bản sao sâu của bản vẽ
- 12. Bản sao sâu trong JPA
- 13. bản sao nông của một bản đồ trong Java
- 14. Có Enumerable.Repeat() làm một bản sao sâu?
- 15. jquery.extend (đúng, [], obj) không tạo bản sao sâu
- 16. Các đối tượng có được đẩy vào một mảng trong bản javascript sâu hoặc nông không?
- 17. Cách tạo bản sao sâu của InputStream trong Java
- 18. Bản sao sâu của đối tượng C#
- 19. Không có hàm tạo bản sao nào có sẵn hoặc hàm tạo bản sao được khai báo 'rõ ràng'
- 20. Viết bản sao sâu - sao chép giá trị con trỏ
- 21. Câu hỏi về bản sao nông trong C++
- 22. Sâu bản sao tiện ích giới thiệu
- 23. Bản sao sâu của mảng trong Ruby
- 24. Bản sao nông sản của một băm nhỏ
- 25. env.Clone() trong scons không làm một bản sao sâu
- 26. omu.valueinjecter bản sao sâu không giống như các loại
- 27. Qt 4.5 - QList :: QList (const QList &) - đây có phải là một hàm tạo bản sao sâu không?
- 28. Cách tạo một bản sao nông của một danh sách bằng Python
- 29. Sao chép sâu trong C#
- 30. Làm cách nào để tạo bản sao nông của tham chiếu băm Perl?
Để biết thêm thông tin về nhân bản, bản sao sâu so với nông và ví dụ, hãy xem phương pháp [Object.MemberwiseClone] (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx) http://stackoverflow.com/questions/699210/why-should-i-implement-icloneable-in-c/4186747#4186747 – Sreekumar
Lý do cho câu hỏi của tôi là nếu nó là threadsafe để Clone() SqlCommand từ nhiều chủ đề tại cùng một lúc. Từ các cuộc thảo luận có vẻ như đó là sự thật, vì vậy mặc dù nó không phải là một bản sao sâu, nó clone tập hợp tham số. Vì vậy, lúc khởi động, bạn có thể chuẩn bị SqlCommand một lần, sau đó sao chép nó từ nhiều luồng song song để lưu một số công việc. – yzorg