2012-12-19 20 views
5

मैं डेस्कटॉप application.I में सी # में एमएसआई के गुणों में पढ़ना चाहते हैं निम्नलिखित कोड का उपयोग कर रहा बिना क्रिया।सी # में कैसे पढ़ने के लिए एमएसआई गुण

sqlncli.msi फ़ाइल शारीरिक रूप से सी में रखा गया है: \ DataP स्थान। डीबगिंग करते समय मैंने पाया कि डेटाबेस में इंस्टॉलर के बाद डेटा नहीं है। ओपनडेटाबेस() कथन।

कृपया मुझे सुझाव है कि इस समस्या का समाधान और ग # में एमएसआई गुण प्राप्त करने के।

अग्रिम धन्यवाद।

+0

जो लाइन पर अपवाद फेंक दिया जाता है? –

+0

आपकी क्वेरी संपत्ति नाम के आसपास कुछ अजीब उद्धरण कैरेक्टर हैं: 'कहां संपत्ति = '{0}'' 'होना चाहिए जहां संपत्ति = '{0}''। –

+0

दृश्य दृश्य = डेटाबेस पर अपवाद फेंक दिया गया है। ओपन व्यू (एसक्यूएल); –

उत्तर

1

एसक्यूएल स्ट्रिंग सही नहीं है। यह होना चाहिए:

SELECT `Value` FROM `Property` WHERE `Property`.`Property` = ’{0}’ 
1

मैं निम्नलिखित तरीके से किया था:

String inputFile = @"C:\\Rohan\\sqlncli.msi"; 

// Get the type of the Windows Installer object 
Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer"); 

// Create the Windows Installer object 
WindowsInstaller.Installer installer = (WindowsInstaller.Installer)Activator.CreateInstance(installerType); 

// Open the MSI database in the input file 
Database database = installer.OpenDatabase(inputFile, 0); 

// Open a view on the Property table for the version property 
View view = database.OpenView("SELECT * FROM _Tables"); 

// Execute the view query 
view.Execute(null); 

// Get the record from the view 
Record record = view.Fetch(); 

while (record != null) 
{ 
    Console.WriteLine(record.get_StringData(0) + '=' + record.get_StringData(1) + '=' + record.get_StringData(2) + '=' + record.get_StringData(3)); 
    record = view.Fetch(); 
} 

और इसकी मेरे लिए काम कर।

+1

के लिए डाउनवॉटेड: 1) @ और बैकस्लाश से बचने (अनावश्यक) 2) COM इंटरऑप का उपयोग करते समय जब एक क्लीनर इंटरऑप लाइब्रेरी मौजूद होती है जो पी/Invoke 3 पर आधारित होती है) आपके किसी भी अप्रबंधित हैंडल को बंद करने में विफल। –

+1

@ क्रिस्टोफरपेन्टर, डाउनवोट के बजाय उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें, क्योंकि मुझे लगता है कि यह समुदाय के लिए अधिक मूल्य जोड़ता है। –

+0

वह 3 साल पहले था। COM इंटरऑप की बजाय एक इंटरऑप लाइब्रेरी का उपयोग करने के उत्तर को फिर से लिखना थोड़ा और अधिक 'संपादन' है। –

12

Windows इंस्टालर XML के तैनाती उपकरण फाउंडेशन (WiX DTF) जो Microsoft.Deployment.WindowsInstaller एमएसआई इंटरॉप पुस्तकालय भी शामिल है Microsoft से एक खुला स्रोत परियोजना है। इस तरह के प्रश्नों को करने के लिए इसका उपयोग करना कहीं अधिक आसान और अधिक विश्वसनीय है। इसमें एमएसआई प्रदाता के लिए एक LINQ भी है जो आपको एमएसआई टेबल को संस्थाओं के रूप में और उनके खिलाफ प्रश्न लिखने की अनुमति देता है।

string sql = String.Format("SELECT `Value` FROM `Property` WHERE `Property`='{0}'", msiProperty); 

एकल से सावधान रहें:

using System; 
using System.Linq; 
using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Deployment.WindowsInstaller.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using(var database = new QDatabase(@"C:\tfs\iswix.msi", DatabaseOpenMode.ReadOnly)) 
      { 
       var properties = from p in database.Properties 
           select p; 

       foreach (var property in properties) 
       { 
        Console.WriteLine("{0} = {1}", property.Property, property.Value); 
       } 
      } 

      using (var database = new Database(@"C:\tfs\iswix.msi", DatabaseOpenMode.ReadOnly)) 
      { 
       using(var view = database.OpenView(database.Tables["Property"].SqlSelectString)) 
       { 
        view.Execute(); 
        foreach (var rec in view) using (rec) 
        { 
         Console.WriteLine("{0} = {1}", rec.GetString("Property"), rec.GetString("Value")); 
        } 
       } 
      } 

      Console.Read(); 
     } 
    } 
} 
1

मैं इस कोड है, और केवल परिवर्तन मैं कोड Devashri द्वारा पोस्ट की काम करने के लिए प्राप्त करने के लिए करना था फिर से उपयोग करने के लिए कोशिश कर रहा था इस लाइन है उद्धरण!

+0

यही कारण है कि SqlSelectString संपत्ति और लिंक 2 एमएसआई इकाइयां इतनी उपयोगी हैं। एसक्यूएल छुपाएं और कोडिंग पर ध्यान केंद्रित करें। –