SqlCommand.Clone()
ディープコピーまたはシャローコピーを作成しますか?また、Clone()
を複数のスレッドから同時に呼び出しても安全です(複数のスレッドがコピーしたり、パラメータ値を設定して実行できるコマンドを1つ作成して実行する)?SqlCommand.Clone()はディープコピーまたはシャローコピーを作成しますか?
答えて
SqlCommand
クラス自体がスレッドセーフなクラスではないため、Clone
を複数のスレッドから呼び出すことは安全ではありません。
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);
}
}
あなたはそれが新しいインスタンスを作成することを確認し、それに追加することができます:あなたはReflector
などのプログラムを使用してSqlCommand.Clone()
方法を見ることができますしかし
が、ここで実際のコード..ですlock
クローニングの前にすべき古いもののすべてのプロパティが、例えば "Connection
のように"すべてのプロパティを深くコピーしないので、浅いコピーです。
私はSqlConnectionのようなcritcalリソースを複製することは期待していません。私はそれが深いコピーで 'ベストテスティング'を実行しているICloneableであるすべてのパラメータをクローンしているので、私は言うでしょう。私はそれが '元の' SqlCommandを使用することはありませんので、接続とトランザクションのプロパティは常に '元の'インスタンスからnullになることを検討しているアプリでは。 – yzorg
@yzorg:そうですが、「SqlConnection」、「Parameters' ..」のようにすべてのデータを深くクローンしないため、浅いコピーと見なされます。すべてのデータを深くコピーすると、「深いコピー」としか考えられませんでした。元のコピーやコピーからプロパティを変更しても、他のコピーは影響を受けません。 –
SqlCommand.Clone
メソッドは、シャローコピーを実行します。参照型のプロパティは、両方のSqlCommandインスタンスで同じオブジェクトを表します。したがって、スレッドセーフではありません。
AFAIK .NET FrameworkのClone()(MemberwiseClone)メソッドはすべて浅いコピーです。
コードを投稿していませんが、クローン作成ではなく新しいSqlCommand
を作成することをお勧めします。
- 1. goroutineはディープコピーかシャローコピーを作成しますか?
- 2. Objective-Cプロパティのコピー属性は、ディープコピーまたはシャローコピーを作成しますか?
- 3. GO - 配列コピーはディープコピーかシャローコピーか?
- 4. System.arraycopy()プリミティブおよびオブジェクト参照を使用したシャローコピーまたはディープコピー
- 5. JavaのArrayListのコピーコンストラクタは、シャローコピーかディープコピーかですか?
- 6. Xamarinは重複したオブジェクトを作成します(ディープコピー)
- 7. 追加メソッドを使用したPythonのシャローコピーとディープコピー
- 8. listIterator.next()はディープコピーかシャローコピーを返しますか?私は、コードの一部を以下している
- 9. バッファからQImageを作成します。ディープコピーはありませんか?
- 10. ディープコピーを作成するには?
- 11. ディープコピーはコピーオンライトを使用しますか?
- 12. ディープコピーをJavaで作成する方法
- 13. 配列のディープコピーを作成するC++
- 14. cv :: Matの矩形領域のディープコピーを作成するには?
- 15. datastax java driverのBoudStatementのディープコピーを作成するには?
- 16. Perlでは、配列のディープコピーを作成するにはどうしたらいいですか?
- 17. Linq to Sql - L2Sエンティティのディープコピーを作成できません
- 18. 割り当てオペレータの内部でシャローコピーを作成する
- 19. AngularまたはNodeでレポートを作成しますか? HTMLクライアントサイドまたはサーバサイドを生成しますか?
- 20. JavaScript:循環参照オブジェクトのシャローコピーをストライミングしますか?
- 21. メソッドにパラメータを渡してディープコピーを作成する
- 22. ないJavaはオブジェクトのディープコピーを作成するか、単にその参照
- 23. Emberjsのネイティブ配列はディープコピーをサポートしていませんか?
- 24. py2neo:ノードのディープコピーを作成しローカルに保存する
- 25. ディープコピー動作機能から
- 26. なぜ移動セマンティクスは、動的mem割り当てでシャローコピーと同じ動作をしますか?
- 27. JavaScriptでカスタムオブジェクトをディープコピーする方法はありますか?
- 28. ディープコピーはメソッドにステップインするときにのみ正常に動作します
- 29. intまたはstringからQdateオブジェクトを作成します。
- 30. SQL Server:ビューまたはプロシージャを作成しますか?
クローニング、深いコピーと浅いコピー、および例の詳細については、[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
私の質問の理由は、複数のスレッドからのClone()SqlCommandに対してスレッドセーフであるかどうかでした。同時。議論から、それは真実だと思われるので、深いクローンではないが、パラメータセットを複製する。そのため、スタートアップ時にSqlCommandを一度準備し、後で複数のスレッドから並列にクローンを作成して作業を省くことができます。 – yzorg