2012-06-17 12 views
6

मैं ऑनलाइन निर्देशक सामग्री के माध्यम से दोनों के बारे में सीखने, डेल्फी में डेटाबेस और डीबी के लिए एक नौसिखिया हूँ। मैं वास्तविक जीवन और उदाहरणों के बीच एक अंतर के साथ संघर्ष कर रहा हूं। ठोस होने के लिए, आम पुस्तकों और लेखकों को कई से अधिक रिश्तों पर विचार करें। मान लें कि आपके पास एक बुक टेबल (book_id, book_title, आदि), एक लेखक तालिका (author_id, author_name, आदि) है, और एक लेखक पुस्तक तालिका में शामिल है। सभी तीन तालिकाओं में प्राथमिक कुंजी के रूप में अद्वितीय आईडी, स्वत: जेनरेट की जाएगी।एक डेटाबेस रिकॉर्ड में एक साथ रिकॉर्ड कैसे सम्मिलित करता है?

उदाहरण हमेशा लेखक और पुस्तक जानकारी के साथ शुरू होते हैं जो पहले से ही संबंधित तालिकाओं में डाले जाते हैं। वास्तविक जीवन में, मुझे लगता है कि आप एक साथ दोनों तालिकाओं में रिकॉर्ड्स डालने की कोशिश कर रहे हैं, यानी, उपयोगकर्ता पुस्तक के शीर्षक और उसके लेखक (ओं) में प्रवेश करने के लिए स्थानों के साथ एक फॉर्म या ग्रिड देखेंगे। डेल्फी में ऐसा कुछ कैसे होगा, डेटा-जागरूक नियंत्रण, अंतर्निहित एक्सेस डेटाबेस (या एसक्यूएल के माध्यम से कुछ और बदलने योग्य) मानते हैं?

+4

पुस्तकें में सम्मिलित करें। लेखकों में डालें। तालिका में शामिल होने के लिए सम्मिलित करें। लेनदेन का उपयोग प्रक्रिया * परमाणु * (लेकिन * एक साथ * नहीं) करेगा। डेल्फी/एक्सेस के साथ शुभकामनाएं - मैं गंदे काम करने के लिए ओआरएम या जेनरेट-डीएएल का उपयोग करता हूं :) –

उत्तर

7

यदि आपने इन जैसे तालिकाओं से शुरुआत की है। । ।

create table books (
    book_id integer primary key, 
    book_title varchar(15) not null 
); 

create table authors (
    author_id integer primary key, 
    author_name varchar(15) not null 
); 

create table book_authors (
    book_id integer not null references books (book_id), 
    author_id integer not null references authors (author_id), 
    primary key (book_id, author_id) 
); 

। । । और यदि आपको एक ही समय में एक नई पुस्तक और एक नया लेखक डालने की आवश्यकता है, तो आप इस तरह एक एसक्यूएल लेनदेन निष्पादित कर सकते हैं।

begin transaction; 
insert into books values (1, 'First book'); 
insert into authors values (1, 'First author'); 
insert into book_authors (book_id, author_id) values (1, 1); 
commit; 

एक लेनदेन का उपयोग करके गारंटी देता है कि या तो सभी तीन आवेषण डेटाबेस में लिखे गए हैं, या उनमें से कोई भी नहीं है। वैकल्पिक

  • डेटाबेस में एक संग्रहीत प्रक्रिया लिखते हैं, और संग्रहीत प्रक्रिया के माध्यम से सम्मिलित करने के लिए,

    • डेटाबेस में एक updatable दृश्य का निर्माण करने, सभी तीन तालिकाओं में शामिल होने, और देखने में डालने हैं, और
    • प्रत्येक तालिका में अलग से सम्मिलित करने के लिए
    • , जो मानता है कि पुस्तक का अस्तित्व महत्वपूर्ण है भले ही आप लेखक को नहीं जानते हैं, और इसके विपरीत। (शायद यह है कि मैं किताबों और लेखकों के लिए क्या करूंगा।)

    यदि आप किसी मौजूदा लेखक के लिए एक नई पुस्तक जोड़ रहे थे, तो आप थोड़ा अलग लेनदेन निष्पादित करेंगे।

    begin transaction; 
    insert into books values (2, 'Second book'); 
    insert into book_authors (book_id, author_id) values (2, 1); 
    commit; 
    

    मुझे लगता है कि डेल्फी किसी अन्य क्लाइंट-साइड भाषा की तरह है। शाब्दिक पूर्णांक के बजाय, आप डेटा-जागरूक नियंत्रण की कुछ संपत्ति, शायद "मान" या "टेक्स्ट" संपत्ति का संदर्भ लेंगे। और आप एक बटन के "क्लिक" ईवेंट में लेनदेन निष्पादित करेंगे।

    यदि डेल्फी पर्याप्त रूप से "डेटा जागरूक" है - डेटाबेस में कॉलम और पंक्तियों के लिए बाध्य होने वाले नियंत्रणों का उपयोग करना, जैसे एक्सेस के मूल नियंत्रण हैं - आपको किसी भी SQL को निष्पादित करने की आवश्यकता नहीं हो सकती है या किसी स्वचालित को सहेजने के लिए कुछ भी विशेष नहीं करना पड़ सकता है आईडी संख्या डीबीएमएस उत्पन्न करता है; यह नियंत्रण के गुणों में से एक के माध्यम से सुलभ होगा। (एक्सेस के फॉर्म और नियंत्रण अत्यधिक डेटा जागरूक हैं; इस प्रकार वे काम करते हैं।) लेकिन यदि आपको करना है, और आप एक्सेस के लिए माइक्रोसॉफ्ट के ओएलडीडीबी प्रदाता का उपयोग कर रहे हैं, तो आप अपने कनेक्शन के माध्यम से उपयोग की जाने वाली अंतिम आईडी संख्या प्राप्त करने के लिए select @@identity का उपयोग कर सकते हैं।

  • +0

    आपका उत्तर तब तक अच्छा है जब तक कि प्राथमिक कुंजी मानों को पता न हो। ओपी कहता है "सभी तीन तालिकाओं में प्राथमिक कुंजी के रूप में अद्वितीय आईडी, स्वत: जेनरेट की जाएगी।" आप यह जानने में असफल रहे कि किताबों और लेखकों के लिए किताबों और लेखकों के लिए नई किताबों या ऑटोहोर्स के लिए प्राथमिक प्राथमिक मूल्य कैसे प्राप्त किए जाएंगे। – crefird

    +0

    @crefird: संपादित उत्तर। –

    +0

    @Catcall: विचारशील और सहायक उत्तर। मेरे प्रश्न का जवाब देने के लिए समय निकालने के लिए धन्यवाद। –

    1

    एसक्यूएल का उपयोग कर रहे हैं, तो यह (स्यूडोकोड) की तरह कुछ

    startTransaction; 
    INSERT INTO Book VALUES('Book1'); 
    bookID:=SELECT LastAutoInc FROM #Dummy; 
    INSERT INTO Author VALUES('Author1'); 
    authorID:=SELECT LastAutoInc FROM #Dummy; 
    INSERT INTO BookAuthor VALUES(bookID, autherID); 
    commit; 
    

    कुंजी एक सौदे अंदर LastAutoInc समारोह (या अपने डेटाबेस में समकक्ष) के उपयोग है।

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