2010-01-31 9 views
11

मैं एक सेटअप को संकलित करना चाहता हूं जो उपयोगकर्ता द्वारा प्रदत्त प्रमाण-पत्रों का उपयोग कर रिमोट डेटाबेस से कनेक्ट होगा, फिर .sql स्क्रिप्ट का उपयोग करके कुछ डीबी घटक स्थापित करें।.sql स्क्रिप्ट का उपयोग कर डेटाबेस को अद्यतन करने के लिए इनो सेटअप का उपयोग कैसे करें

क्या यह इनो सेटअप का उपयोग करना संभव है?

अधिक विवरण:

मैं एक कस्टम फ़ॉर्म करना चाहते हैं,, डेटाबेस का पता और क्रेडेंशियल दर्ज करने के तो एक आदेश है कि एक एसक्यूएल स्क्रिप्ट कि दूरदराज के डेटाबेस सर्वर अद्यतन करेगा निष्पादित करेंगे चलाने उपयोगकर्ता पूछ।

यदि अद्यतन सफल है - सफलता के साथ स्थापना पूर्ण करें।

यह सामान्य प्रश्न है - मेरे पास बहुत से अनुकूलित सेटअप हैं जो विभिन्न सर्वरों से कनेक्ट होना चाहिए/अलग-अलग स्क्रिप्ट चलाएं - विचार एक सामान्य रूप बनाना है जो इस कार्यक्षमता को प्रदान करेगा।

+1

यह निश्चित रूप से संभव है, लेकिन बिना किसी जानकारी के एक सार्थक उत्तर देना मुश्किल है। क्या पूछते हैं? क्या आप पहले से ही ऐसा करने की कोशिश कर चुके थे? क्या डेटाबेस? कृपया स्पष्ट करें ... – mghie

+0

अच्छी तरह से, विचार एक सामान्य रूप है - ऊपर विवरण .. – ofer

उत्तर

11

मुझे नहीं लगता कि आपके पास एक पूरी तरह से सामान्य रूप हो सकता है, क्योंकि विभिन्न सर्वरों के लिए आपको एक कनेक्शन स्ट्रिंग या सर्वर नाम और एक (वैकल्पिक) पोर्ट की आवश्यकता हो सकती है; कुछ सर्वरों के लिए आप सिस्टम प्रमाणीकरण का उपयोग करेंगे, दूसरों के लिए उपयोगकर्ता नाम पासवर्ड टुपल।

यह कहकर कि मैं आपको एक छोटा डेमो इनो स्क्रिप्ट दूंगा जो सर्वर का नाम और बंदरगाह, उपयोगकर्ता नाम और पासवर्ड मांगता है, फिर कुछ परीक्षण करता है, फिर एक अनुप्रयोग निष्पादित करता है जो निकाला जाता है (कोड द्वारा) temp निर्देशिका में और इंस्टॉलर द्वारा हटा दिया जाएगा। आप इसे अपनी स्क्रिप्ट के लिए शुरुआती बिंदु के रूप में उपयोग कर सकते हैं। आवश्यक के रूप में अपनी स्क्रिप्ट में इस तरह के टुकड़े के कुछ ही बीत रहा है, और सहित उन्हें शायद सब हो जाएगा आप की जरूरत:

[Setup] 
AppID=DBUpdateTest 
AppName=Test 
AppVerName=Test 0.1 
AppPublisher=My Company, Inc. 
DefaultDirName={pf}\Test 
DefaultGroupName=Test 
DisableDirPage=yes 
DisableProgramGroupPage=yes 
OutputBaseFilename=setup 
PrivilegesRequired=none 

[Files] 
Source: "isql.exe"; DestDir: "{tmp}"; Flags: dontcopy 
Source: "update_V42.sql"; DestDir: "{tmp}"; Flags: dontcopy 

[Languages] 
Name: "english"; MessagesFile: "compiler:Default.isl" 

[Code] 
var 
    DBPage: TInputQueryWizardPage; 

procedure InitializeWizard; 
begin 
    DBPage := CreateInputQueryPage(wpReady, 
    'Database Connection Information', 'Which database is to be updated?', 
    'Please specify the server and the connection credentials, then click Next.'); 
    DBPage.Add('Server:', False); 
    DBPage.Add('Port:', False); 
    DBPage.Add('User name:', False); 
    DBPage.Add('Password:', True); 

    DBPage.Values[0] := GetPreviousData('Server', ''); 
    DBPage.Values[1] := GetPreviousData('Port', ''); 
    DBPage.Values[2] := GetPreviousData('UserName', ''); 
    DBPage.Values[3] := GetPreviousData('Password', ''); 
end; 

procedure RegisterPreviousData(PreviousDataKey: Integer); 
begin 
    SetPreviousData(PreviousDataKey, 'Server', DBPage.Values[0]); 
    SetPreviousData(PreviousDataKey, 'Port', DBPage.Values[1]); 
    SetPreviousData(PreviousDataKey, 'UserName', DBPage.Values[2]); 
    SetPreviousData(PreviousDataKey, 'Password', DBPage.Values[3]); 
end; 

function NextButtonClick(CurPageID: Integer): Boolean; 
var 
    ResultCode: Integer; 
begin 
    Result := True; 
    if CurPageID = DBPage.ID then begin 
    if DBPage.Values[0] = '' then begin 
     MsgBox('You must enter the server name or address.', mbError, MB_OK); 
     Result := False; 
    end else if DBPage.Values[2] = '' then begin 
     MsgBox('You must enter the user name.', mbError, MB_OK); 
     Result := False; 
    end else if DBPage.Values[3] = '' then begin 
     MsgBox('You must enter the user password.', mbError, MB_OK); 
     Result := False; 
    end else begin 
     ExtractTemporaryFile('isql.exe'); 
     ExtractTemporaryFile('update_V42.sql'); 
     if Exec(ExpandConstant('{tmp}') + '\isql.exe', '--user ' + DBPage.Values[2] 
     + ' --password ' + DBPage.Values[3] + ' --database ' + DBPage.Values[0] 
     + ':foo --script update_V42.sql', '', 
     SW_HIDE, ewWaitUntilTerminated, ResultCode) 
     then begin 
     // check ResultCode and set Result accordingly 
     Result := ResultCode = 0; 
     end else begin 
     MsgBox('Database update failed:'#10#10 + SysErrorMessage(ResultCode), 
      mbError, MB_OK); 
     Result := False; 
     end; 
    end; 
    end; 
end; 

सावधान: मैं पूरी तरह से इस परीक्षण नहीं किया है, इसलिए अधिक कोड हो सकता है सब कुछ ठीक से साफ करने के लिए आवश्यक अप। त्रुटि प्रबंधन निश्चित रूप से गायब है!

+0

या आप COM इंटरफ़ेस [जैसे ADODB'] का उपयोग कर सकते हैं (http://stackoverflow.com/a/12296113/960757) उदाहरण के लिए। – TLama

+0

@TLama: यदि आप अपना डेटाबेस सर्वर उस प्रकार का इंटरफ़ेस प्रदान करता है तो आप निश्चित रूप से कर सकते हैं। उदाहरण के ऊपर हालांकि उसी कोड से लिया गया था जिसे मैं फ़ायरबर्ड के लिए उपयोग करता हूं। – mghie

+0

इस कोड का उपयोग MSSQL 2008 के लिए किया गया था, लेकिन isql के बजाय sqlcmd.exe का उपयोग किया गया। –

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