2011-05-30 18 views
6

मेरे पास दो टेबल हैं:एसक्यूएल सम्मिलन कथन के बारे में एक सवाल!

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

Topics 
****** 
TopicID 
Theme 
Topics 
Date 

मुझे दो कथन डालने और उनके बीच कनेक्ट करने की आवश्यकता है! यह पहला स्टेटमेंट है:

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

और मुझे विषय तालिका के लिए एक और कथन होना चाहिए:

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

समस्या यह है कि मेरे पास TopicsID (थ्रेड टेबल) और TopicsID (विषय तालिका)। दोनों incremental ints हैं, तो मैं एक ही TopicID को दोनों में कैसे डालूं ताकि उन्हें वही मान मिल सके?

+4

क्या आप उन सम्मिलित आदेशों को कॉल करने के बारे में थोड़ा और विवरण दे सकते हैं। व्यक्तिगत रूप से, मैं एक संग्रहित प्रो बनाउंगा - यह '@@ पहचान' – Beno

+1

का उपयोग करके बनाई गई आईडी को वापस करने में सक्षम होगा। @guagland क्या सुझाव दे रहा है: http://msdn.microsoft.com/en-us/library /ms187342.aspx –

+0

बिल्कुल वही नहीं जो आप पूछ रहे हैं, लेकिन मैं डेटा एक्सेस लेयर का उपयोग करना पसंद करता हूं जो इसे स्वचालित रूप से संभालता है, उदाहरण के लिए LINQ करने वाली एसक्यूएल। –

उत्तर

2

यदि आप एमएस एसक्यूएल सर्वर का उपयोग करते हैं, तो आप @@ पहचान के साथ ऑटोइनक्रिकमेंट मान प्राप्त कर सकते हैं।

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

फिर, ExecuteScalar के रूप में इस आदेश को चलाने के लिए और TransactionScope का उपयोग करने और SCOPE_IDENTITY() का उपयोग कर पहली क्वेरी से डाला आईडी प्राप्त करने के लिए द्वारा

+1

के पूरे विचार को अनदेखा कर दूंगा या एक संग्रहित प्रक्रिया तैयार करूंगा जो एक लेनदेन में एक बार में 2 पंक्तियां डालेगा –

+1

@@ पहचान को अंतिम पहचान मिली है। SQL सर्वर एक साथ कई अनुप्रयोगों की सेवा कर सकता है, इसलिए @@ पहचान आपको किसी चीज़ की पहचान वापस दे सकती है जो कोई और कर रहा था अगर वे आपके INSERT कथन को आपके INSERT और SELECT के बीच प्राप्त करने में कामयाब रहे। इसके बजाय SCOPE_IDENTITY() का उपयोग करें। –

+0

ताकि आप पहचान प्राप्त करने के लिए @@ का चयन कर सकें। पहचान एक "int" है जिसे मैं किसी अन्य एसक्यूएल सम्मिलन कथन में खिला सकता हूं जो विषय तालिका में TopicID डालेगा। मैं चयन @@ पहचान – WithFlyingColors

1

आप Transaction बनाए रख सकते हैं अपने मूल्य मिलता है।

// 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 के साथ क्या करते हैं, और 2 वर्ग कथन नहीं होना चाहिए। एक और एसक्यूएल स्टेटमेंट जो विषय पैराग्राफ, विषय टाइटल और डेट के साथ विषय वस्तु को सम्मिलित करता है? – WithFlyingColors

0

आप देख रहे हैं कुछ विश्वसनीय के लिए आप लेनदेन उपयोग करने के लिए की जरूरत है।

एक विचार प्राप्त करने के लिए Managing Transactions in SQL Server Stored Procedures का संदर्भ लें।

इसके अलावा, Controlling Transactions (Database Engine) और SQL Server Transaction Isolation Models पर एक नज़र डालें।

आपको अंतिम बार सम्मिलित पहचान मान @@Identity का उपयोग करने की भी आवश्यकता है।

0

आप कोड नमूने प्रदान की गई शेष जानकारी के साथ अच्छी तरह से सहसंबंध नहीं करते हैं। कोड के बिना आपकी पोस्ट काफी सुसंगत प्रतीत होती है, हालांकि, मैं उन स्निपेट को केवल गलत के रूप में मानने के इच्छुक हूं।

वैसे भी, आपका विचार स्पष्ट दिखता है। एसक्यूएल सर्वर में 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)"; 

हालांकि यह एक सिंगल स्टेटमेंट है, यह अलग तालिकाओं में दो आवेषण प्रदर्शन करती है। 'मुख्य' डालने को Topics तालिका में बनाया जा रहा है। 'माध्यमिक' एक, Threads में, OUTPUT...INTO खंड द्वारा परिभाषित किया गया है। असल में, OUTPUT खंड आपको डेटा को सम्मिलित करने के संदर्भ में अनुमति देता है और या तो उन्हें क्लाइंट को एक पंक्ति के रूप में वापस कर देता है, या (INTO के साथ संयुक्त होने पर) उन्हें मौजूदा तालिका में निर्देशित करता है, जैसा कि आप इसे यहां देख सकते हैं।

संबंधित मुद्दे