Save and Open Methods Example (VJ++)

Microsoft ActiveX Data Objects (ADO)

Save and Open Methods Example (VJ++)

These three examples demonstrate how the Save and Open methods can be used together.

Assume you are going on a business trip and want to take along a table from a database. Before you go, you access the data as a Recordset and save it in a transportable form. When you arrive at your destination, you access the Recordset as a local, disconnected Recordset. You make changes to the Recordset, then save it again, along with your changes. Finally, when you return home, you connect to the database again and update it with the changes you made on the road.

import com.ms.wfc.data.*;
import java.io.* ;

public class SaveX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        SaveX1();
        SaveX2();
        SaveX3();
        System.exit(0);
    }

    // First, access and save the Authors table.

    // SaveX1 function

    static void SaveX1()
    {
        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        BufferedReader in = 
            new BufferedReader(new InputStreamReader(System.in));
        File file;

        try
        {
            rstAuthors = new Recordset();
            rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstAuthors.open("SELECT * FROM Authors",
                                strCnn,
                                AdoEnums.CursorType.DYNAMIC,
                                AdoEnums.LockType.OPTIMISTIC,
                                AdoEnums.CommandType.TEXT);

            // For the sake of illustration, save the recordset to a 
            //diskette in XML format.
            file = new File("a:\\Pubs.xml");
            if(!file.exists())
                rstAuthors.save("a:\\Pubs.xml",AdoEnums.PersistFormat.XML);
            else
            {
                System.out.println("\nFile already exists.");
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();
                System.exit(0);
            }
            // Cleanup objects before exit.
            rstAuthors.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // At this point, you have arrived at your destination. You will
    // access the Authors table as a local, disconnected Recordset.
    // Don't forget you must have the MSPersist provider on the machine
    // you are using in order to access the saved file, a:\Pubs.xml.

    // SaveX2 function

    static void SaveX2()
    {
        // Define ADO Objects.
        Recordset rstAuthors = null;

        // Declarations.
        BufferedReader in = 
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            rstAuthors = new Recordset();

            // For sake of illustration, we specify all parameters.
            rstAuthors.open("a:\\Pubs.xml",
                    "Provider=MSPersist;",
                    AdoEnums.CursorType.FORWARDONLY,
                    AdoEnums.LockType.OPTIMISTIC,
                    AdoEnums.CommandType.FILE);

            // Now you have a local, disconnected recordset.
            // Edit it as you desire.
            // (In this example, the change makes no difference).
            rstAuthors.find("au_lname = 'Carson'");
            if(rstAuthors.getEOF())
            {
                System.out.println("Name not found.");
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();
                return;
            }
            rstAuthors.getField("city").setString("Berkeley");
            rstAuthors.update();

            // Save changes in ADTG format this time, for illustration.
            // Note that previous version on the diskette, as a:\Pubs.xml.
            rstAuthors.save("a:\\Pubs.adtg",AdoEnums.PersistFormat.ADTG);

            // Cleanup objects before exit.
            rstAuthors.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // Finally, update the database with your changes.

    // SaveX3 function

    static void SaveX3()
    {
        // Define ADO Objects.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;

        // Declarations.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            // If there is no ActiveConnection, you can open with defaults.
            rstAuthors = new Recordset();
            rstAuthors.open("c:\\Pubs.adtg");

            // Connect to the database, associate the Recordset with
            // connection, then update the database table with the changed
            // Recordset.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors.setActiveConnection(cnConn1);
            rstAuthors.updateBatch();

            // Cleanup objects before exit.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
    }

    // PrintProviderError Function

    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connection’s Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError Function

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}