- SQL Server 2000, var, bu, MultipleActiveResults'u desteklemiyor.
- Birden çok ek yapmam gerekiyor ve ekleme başına bir bağlantı ile tamamlandı.
- Tüm ekleme işlemlerinden önce bir işlem başlatmak ve tüm ekleme işlemlerinden sonra bitirmek istiyorum.
- Nasıl yaparım?
cevap
Tek bir bağlantı ve çoklu komut kullanmamanın nedeni nedir (aslında bir komut döngüde yeniden oluşturulmuş)? Belki bu çözüm sizin için çalışacaktır:
public static void CommandExecNonQuery(SqlCommand cmd,
string query, SqlParameter[] prms)
{
cmd.CommandText = query;
cmd.Parameters.AddRange(prms);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
static void Main(string[] args)
{
string insertQuery =
@"INSERT TESTTABLE (COLUMN1, COLUMN2) " +
"VALUES(@ParamCol1, @ParamCol2)";
using (SqlConnection connection =
new SqlConnection(connectionString))
{
using (SqlCommand command =
connection.CreateCommand())
{
SqlTransaction transaction = null;
try
{
// BeginTransaction() Requires Open Connection
connection.Open();
transaction = connection.BeginTransaction();
// Assign Transaction to Command
command.Transaction = transaction;
for (int i = 0; i < 100; i++)
CommandExecNonQuery(command, insertQuery,
new SqlParameter[] {
new SqlParameter("@ParamCol1", i),
new SqlParameter("@ParamCol2", i.ToString()) });
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
finally
{
connection.Close();
}
}
}
}
Ayrıca Kodunuzun bazı gönderebilir miyim, ben 2k MultipleActiveResults desteklemediğini olsun, ama
Sql Server Transactions - ADO.NET 2.0 - Commit and Rollback - Using Statement - IDisposable
Sql Server 2000'de bunun mümkün olmadığını düşünüyorum. –
SqlTransaction öğesini açık yakalama/sonek yerine bir kullanma deyimi ile atmak daha iyi olur. Bir işlemin atılması, işlenmemişse geri alır. – Joe
Bu mümkün, Jader. SQL 8.00.194 –
.NET 2.0 kullanıp kullanmadığınızı belirtmediniz, ancak bu varsayımı yapacağım. başarısız DB ifadelerden herhangi, ts.complete ulaşılabilir asla ve işlem kullanılarak deyimi sonunda geri otomatik rulo edilecektir
using (var tx = new TransactionScope()) {
// Execute multiple DB statements inside here
ts.Complete();
}
: C# 3.0 örnek kodu aşağıda listelenmiştir. Bununla birlikte, bu yaklaşıma yönelik bir uyarı, birden fazla bağlantı kullanırsanız, daha düşük performans anlamına gelirse, DTC'den yararlanacağınızdır.
DTC kullanmaktan kaçınmak için tek bir SQL bağlantısı zorlama örneği TransactionScope için SQLTransaction değiştirmek Düzenlendi:
using (var tx = new TransactionScope())
using (var db = new SqlConnection(connString)) {
// Command 1
using (var cmd = db.CreateCommand()) {
cmd.CommandText = "select...";
using (var reader = cmd.ExecuteReader()) {
// Process results or store them somewhere for later
}
}
// Command 2
using (var cmd = db.CreateCommand()) {
cmd.CommandText = "select...";
using (var reader = cmd.ExecuteReader()) {
// Process results or store them somewhere for later
}
}
// Command 3
using (var cmd = db.CreateCommand()) {
cmd.CommandText = "select...";
using (var reader = cmd.ExecuteReader()) {
// Process results or store them somewhere for later
}
}
tx.Complete();
}
alternatif? Sql Server 2005'in M.A.R.S'yi desteklediğini biliyorum, ancak 2000 bunu yapmıyor. –
SqlTransaction için kamu kurucusu yok. Bir örnek oluşturmayı bildiğim tek yol, statik olmayan SqlConnection.BeginTransaction yöntemini kullanmaktır. –
@Jader: Haklısın, TransactionScope'u kullanmak istemiştim. Yayın düzenlendi. – Chris
Bir işlemin birden çok bağlantı yayılan sanmıyorum.
Çoklu bağlantıların ayrı bağlantılarda yapılmasının nedeni nedir? Onların normalde tek bir bağlantıda olmasını isterdim.
Sql Server 2000, MultipleActiveResultSets özelliğini desteklemiyor. Bu yüzden her bir ekleme için bir bağlantı oluşturmalıydım. –
@JaderDias MARS, tek bir 'IDbConnection'ın çoklu' IDbCommand' ile yeniden kullanılması için gerekli değildir.Aslında, SqlClient kullanıyorsanız, ADO’nun bağlantı havuzu, kodunuz bağlantıyı kapatıp yeniden açıyor olsa bile, aynı bağlantıyı veritabanına yeniden kullanmanızı sağlayacaktır. – binki
İşlemler, bir bağlantı üzerinde oluşturulur ve oluşturuldukları bağlantıyı aşan bir kapsamı yoktur, böylece istediğiniz şeyi yapamazsınız. Refactor, böylece ekler aynı anda yerine yerine bir bağlantı üzerinde yürütmek veya geri alma elde etmek için farklı bir mekanizma uygulamak (örneğin, daha sonra bir hatayla karşılaşılırsa eklenen kayıtları silmek için bir arama olarak kullanılabilecek eklenmiş anahtarların bir tablo) süreç)
OP'nin dileği mümkün değil. – Cheeso
- 1. Yii2'de tek bir denetleyicide birden çok senaryo nasıl kullanılır?
- 2. Tek bir uygulamada birden çok java.net.CookieHandler nasıl kullanılır?
- 3. Tek bir URL parametresi için birden çok değer nasıl iletilir?
- 4. Swift'de birden çok düğme için bir IBAction nasıl kullanılır?
- 5. Birden çok/tek Linq için SQL DataContext
- 6. Tek bir yöntemde birden çok yönü
- 7. Tek bölmede birden çok denetim nasıl yerleştirilir?
- 8. Birden çok satırdan tek bir satır oluşturma
- 9. Tek bir sayfada birden çok Dropzone
- 10. , Birden çok sütunda KeyAttribute nasıl kullanılır
- 11. Tek bakışta birden çok yineleme -
- 12. JavaScript: Birden çok öğe için tek bir sınıf ekle/kaldır
- 13. Ad alanı birden çok dosyada nasıl kullanılır
- 14. Tek bir öğe için neden birden çok çağrı alıyorum?
- 15. Birden çok paket için tek nokta kesimi nasıl belirlenir
- 16. nodejs kullanımı birden çok ips nasıl kullanılır?
- 17. Birden çok tuval içeriği nasıl kullanılır?
- 18. Paint olayı bir formda birden çok kez nasıl kullanılır?
- 19. Birden çok nodejs projesi için gulp görevleri nasıl yeniden kullanılır
- 20. Birden çok toplam almak için LINQ nasıl kullanılır
- 21. Birden çok tabloya katılmak için kapsamlar nasıl kullanılır
- 22. Tek bir öğeye birden çok XAML stilini nasıl uygularım?
- 23. Tek bir sınıfta birden çok FontLoader nesnesi nasıl bulunur?
- 24. VBA: tek bir hücrede bulunan birden çok satırı nasıl birleştirilir?
- 25. Birden çok iş parçacığı ile tek bir dosyada nasıl yazılır?
- 26. Tek bir şekilde birden çok görüntü nasıl gösterilir?
- 27. Birden çok sütunun toplamına göre tek bir satırı nasıl döndürebilirim?
- 28. Android'de birden çok görüntüyü tek bir görüntüde nasıl birleştirilir?
- 29. Birden çok Neo4j veritabanını tek bir sunucuda nasıl çalıştırabilirim?
- 30. Tek bir yöntemde birden çok genel tür kısıtlaması nasıl belirlenir?
bkz eşzamanlı gruplar için tek hususlar Bir bağlantı, belirli bir bağlantıda bir komut nesnesi ile kesinlikle birden çok yürütme olabilir. – cmsjr
Jader, Cmsjr ile katılıyorum, SQL 8.00.194 ile test edilen sinple durum. Kodunuz belirli olabilir, ancak daha fazla bilgiye ihtiyacımız var. Sql Server 2000'de birden çok bağlantıya –