2011-05-30 25 views
6

İki tablom var:SQL insert ifadesi hakkında bir soru!

Threads 
******* 
ThreadID 
UserID 
TopicsID 
Date 
ThreadTitle 
ThreadParagraph 
ThreadClosed 

Topics 
****** 
TopicID 
Theme 
Topics 
Date 

İki ifade ekleyip bunlar arasında bağlantı kurmam gerekiyor! Bu ilk ifade:

string insertCommand = 
    "INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
    "VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
    "),TopicID,dateTime,questionTitle,subTopic)"; 

ve konu başlık tablosu için başka bir açıklama daha gerekiyor:

string insertCommand = 
    "INSERT INTO Topics (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
    "VALUES ('Theme, Topics, Date')"; 

Sorun şu ki TopicsID (Threads tablosu) ve TopicsID (Konular tablosu). Her ikisi de inkremental ints'tır, bu yüzden her ikisi de aynı TopicID değerini 'e nasıl eklerim?

+4

Bu ekleme komutlarını nasıl çağırdığınız hakkında biraz daha ayrıntılı bilgi verebilir misiniz? kişisel olarak, saklanan bir proc oluşturuyordum - bu, yaratılan kimliği '@@ identity' – Beno

+1

kullanarak iade edebilecektir. @guagland'ın önerdiği bağlantı şu şekildedir: http://msdn.microsoft.com/en-us/library /ms187342.aspx –

+0

Tam olarak ne istediğinizi değil, ancak bunu otomatik olarak işleyen bir veri erişim katmanı kullanmayı tercih ediyorum. linq-to-sql. –

cevap

2

MS SQL sunucusunu kullanırsanız, @@ Kimlik ile otomatik değerleme değerini alabilirsiniz.

string insertCommand = 
    "INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
    "VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
    "),TopicID,dateTime,questionTitle,subTopic); SELECT @@Identity"; 

Sonra ExecuteScalar olarak bu komutu çalıştırmak ve TransactionScope kullanarak ve Birinci Sorgusu'ndan eklenen kimliği almak için SCOPE_IDENTITY() kullanarak

+1

bütün fikrini ihmal etmeyi veya bir işlemde aynı anda 2 satır ekleyebilecek saklı bir yordam oluşturmayı tercih ederim –

+1

@@ Kimlik, eklenen son kimliği alır. SQL Server birçok uygulamaya aynı anda sunulabilir. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Bunun yerine SCOPE_IDENTITY() kullanın. –

+0

, böylece kimliği almak için @@ Seçiniz. Kimlik, Konu tablosuna Konu kodu ekleyebilecek başka bir sql ekleme ifadesiyle besleyebileceğim bir "int" dir. Select @@ kimliği ile ne yapabilirim – WithFlyingColors

1

Sen Transaction koruyabilirsiniz değeriniz olsun. Eğer güvenilir bir şey arıyorsanız

// Create the TransactionScope 
using (TransactionScope oTranScope = new TransactionScope()) 
{ 
    Int32 TopicID; 
    // Open a connection 
    using (SqlConnection oCn1 = new SqlConnection(this.sCn1)) 
    { 
     SqlCommand oCmd1 = new SqlCommand("INSERT INTO Users (UserID,TopicID,Date,ThreadTitle,ThreadParagraph) " + 
"VALUES ('CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
"),TopicID,dateTime,questionTitle,subTopic); SELECT SCOPE_IDENTITY()";, oCn1); 

     oCmd1.Parameters.Add ... Better to use parameter to save SQL Injection Attack 

     oCn1.Open(); 
     // At this point, the connection is in the transaction scope, 
     // which is a lightweight transaction. 
     TopicID = Convert.ToInt32 oCmd1.ExecuteScaler()); // as you want to get Id 
     oCn1.Close(); 
    } 
    // Open a connection 
    using (SqlConnection oCn2 = new SqlConnection(this.sCn2)) 
    { 
     SqlCommand oCmd2 = new SqlCommand("SQLQuery", oCn2); 
     //use return TopicID from last inserted query 
     oCn2.Open(); 
     // The connection is enlisted in the transaction scope, 
     // which is now promoted to a distributed transaction 
     // controlled by MSDTC 
     oCmd2.ExecuteNonQuery(); 
     oCn2.Close(); 
    } 
    // Tell the transaction scope to commit when ready 
    oTranScope.Consistent = true; 
    // The following bracket completes and disposes the transaction 
} 
+0

topicID ile ne yaparsınız ve 2 sql ifadesi olmamalıdır. konuParagraph, topicTitle ve Date ile TopicID'yi ekleyen başka bir sql ifadesi? – WithFlyingColors

0

Örnek kod örnekleri, sağlanan bilgilerin geri kalanıyla iyi bir korelasyon göstermez. Kodunuz olmasa da yazıcınız yeterince tutarlı görünüyor, bu yüzden bu snippet'leri sadece hatalı olarak düşünmeye eğilimliyim. Her neyse, senin fikrin açık gibi görünüyor. SQL Server size bunun gibi bir INSERT deyimi ile sorununuzu çözebilir 2005+:

string insertCommand = 
    "INSERT INTO Topics (Theme, Topics, Date) " + 
     "OUTPUT 'CONVERT(uniqueidentifier, '" + giveMeGuidID() + 
     "'), INSERTED.TopicID, @dateTime, @questionTitle, @subTopic " + 
     "INTO Threads (UserID, TopicID, Date, ThreadTitle, ThreadParagraph) " + 
    "VALUES (@Theme, @Topics, @Date)"; 

bu tek açıklama olmasına rağmen, farklı tablolarda içine iki ekler gerçekleştirir. 'Ana' ek Topics tablosuna yapılır. Threads içine 'ikincil', OUTPUT...INTO yan tümce tarafından tanımlanır. Temel olarak, OUTPUT yan tümcesi, eklenen verilere başvuruda bulunmanıza ve istemciye bir satır kümesi olarak geri dönmenize veya (INTO ile birleştirildiğinde) bunları mevcut bir tabloya yönlendirmenize izin verir.