Storing Objects in database

pls what steps must i take to store a user defined object in Mysql. thanks in anticipation.

Its better to store the data in an object into the database and not serialize the object and store it.
If you store the object, when you pull it out of the database, you have to know what version of the class was used in creating the object to recover it. If you have the raw data, you dont have to do that. ALso, with the raw data, any other programmer can run unique queries on the data and use it for their own purposes. Cant do so if the data is trapped in a serialized object in the database.

Similar Messages

  • Image not storing in SQLite Database

    Hi All
    I am creation an application in WPF C# in which i have created an Ink Canavs 
    now i want to insert the InkCanvas  Data or stockes in SQLite Database for that i hv created an folder in my application
    and on"btnSaveCanvasImg" button Clicked i am saving the image of InkCanvas in a folder and on "btnSaveImgInDatabase" button clicked The saved image stored in the database 
    But when i clicked on"btnSaveCanvasImg" button image saved in folder , but when clicked on "btnSaveImgInDatabase" button the image doesn't store in the database.
    following is my code
    XML:-
    <Window x:Class="InkCanvasInDatabase.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="800" Width="600">
        <Grid>
            <InkCanvas Name="MainInkCanvas" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="595">
                <InkCanvas.Background>
                    <ImageBrush ImageSource="C:\Testimonial_Project\Assets\Images\notePaper.png"/>
                </InkCanvas.Background>
            </InkCanvas>
            <Button x:Name="btnSaveCanvasImg" Content="Save Canvas Image" HorizontalAlignment="Left" Margin="33,599,0,0" VerticalAlignment="Top" Width="200" Height="51"
    FontSize="20" Click="btnSaveCanvasImg_Click"/>
            <Button x:Name="btnSaveImgInDatabase" Content="Save Image In Database" HorizontalAlignment="Left" Margin="281,599,0,0" VerticalAlignment="Top" Width="238" Height="51"
    FontSize="20" Click="btnSaveImgInDatabase_Click"/>
        </Grid>
    </Window>
    C# Code:-
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Ink;
    using System.Windows.Ink.AnalysisCore;
    using Microsoft.Win32;
    using System.IO;
    using System.Data.SQLite;
    namespace InkCanvasInDatabase
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
            string imagename;
            public MainWindow()
                InitializeComponent();
            public void loadInkAnalyzer()
                InkAnalyzer theInkAnalyzer = new InkAnalyzer();
                theInkAnalyzer.AddStrokes(MainInkCanvas.Strokes);
                AnalysisStatus status = theInkAnalyzer.Analyze();
                if (status.Successful)
                    saveInkCanvasBitmap();
                else
                    MessageBox.Show("Recognition Failed");
            public void saveInkCanvasBitmap()
                RenderTargetBitmap rtb = new RenderTargetBitmap((int)MainInkCanvas.Width, (int)MainInkCanvas.Height, 0,0, PixelFormats.Default);
                rtb.Render(MainInkCanvas);
                BmpBitmapEncoder encoder = new BmpBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(rtb));
               // FileStream fs = File.Open(@"C:\inkCanvas_Images\test.jpg", FileMode.Create);
                FileStream fs = File.Open(@"C:\Users\xeniun1\Desktop\24.02.2015 Xenium_Project\23.02.2015 InkCanvas\InkCanvasInDatabase\InkCanvasInDatabase\InkCanvas_Images\.jpg", FileMode.Create);
                encoder.Save(fs);
                fs.Close();
            public void insertImgInDatabase()
                byte[] signature;
                using (MemoryStream ms = new MemoryStream())
                    MainInkCanvas.Strokes.Save(ms);
                    signature = ms.ToArray();
                string stConn = @"Data Source=inkCanvas_DB.db;Version=3";
                SQLiteConnection sqliteConn = new SQLiteConnection(stConn);
                sqliteConn.Open();
                string sql = "INSERT INTO User_Details (User_Text) VALUES (@Sig)";
                SQLiteCommand comm = new SQLiteCommand(sql, sqliteConn);
                comm.Parameters.AddWithValue("@Sig", signature);
                comm.ExecuteNonQuery();
           private void btnSaveCanvasImg_Click(object sender, RoutedEventArgs e)
                loadInkAnalyzer();
                //MainInkCanvas.Strokes.Clear();
                MessageBox.Show("Ink Canvas Save as Image");
            private void btnSaveImgInDatabase_Click(object sender, RoutedEventArgs e)
                insertImgInDatabase();
                MainInkCanvas.Strokes.Clear();
                MessageBox.Show("Ink Canvas Image saved in Database");
    Plz provide solution for this 
    Regards

    Please close your previous threads by marking helpful posts as answer before you start a new one.
    The type of the image columns should be BLOB. And make sure that you are looking at the inkCanvas_DB.db in the output folder of your .exe ([your_project_foder]/bin/Debug or [your_project_foder]/bin/Debug) because it is this database that the data gets written
    to unless you specify an absolute path in the connection string:
    string stConn = @"Data Source=C:\Your_Project_Folder\inkCanvas_DB.db;Version=3";
    Please upload a reproducable sample of your issue to OneDrive and post the link to it here for further help.
    And please remember to close your threads by marking helpful posts as answer.

  • Invalid stored Object Types with Constructor Function

    hi folks,
    i created a stored object type on database 10.2. but it is invalid.
    it has a constructor function and a number of member functions.
    SQLPlus the only feddback is
    Warning: Type Body is compiled with errors.
    Toad 9.0.0 gives no error message.
    how can i find out what kind of error there is? and where?
    thx for help
    joerg

    In SQL*Plus, when you get a warning that you've created an object with compilation errors, you can type
    SQL> show errorsto see the list of errors.
    Justin

  • Can Discoverer have link to display documents stored outside the database?

    I posted a message some time ago called "Possible for Discoverer to display BLOB type documents stored in database?" and got great answer.
    Now our customers are asking if it is possible, from Discoverer, to link somehow to a file stored outside the database on the Unix file system and get their computer to display it? Can anyone tell me if this is possible please?
    The only thing I've seen in the documentation that may be related is in Oracle Business Intelligence Discoverer Configuration Guide, section 10.6 List of Discoverer user preferences. It says there that Discoverer preference ProtocolList can be set so that Discoverer hyperlinks can be set to use protocols such as telnet, but the default is HTTP, HTTPS, and FTP.
    THank you in advance if you can help.
    Regards,
    Julie.

    Hi Rod,
    I have tried the second method: "create a Oracle directory pointing to the Unix directory containing the files". I have had success with it, but I'd be grateful if you could advise me if you would have done this the same way as described below:
    I put two Word docs and two text docs called clob_test1.txt, clob_test2.txt, blob_test1.doc, blob_test2 in the Unix directory corresponding to an Oracle directory called 'EIF'. I thought an extrenal table was needed so that Discoverer would have an object to write a queruy against. So I created a file called lob_test_data.txt with the following contents:
    1,01-JAN-2006,text/plain,clob_test1.txt
    2,02-JAN-2006,text/plain,clob_test2.txt
    3,01-JAN-2006,application/msword,blob_test1.doc
    4,02-JAN-2006,application/msword,blob_test2.
    THen I created an external table using the following DDL:
    CREATE TABLE jum_temp_lob_tab (
    file_id NUMBER(10),
    date_content DATE,
    mime_type VARCHAR2(100),
    blob_content BLOB
    ORGANIZATION EXTERNAL
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY EIF
    ACCESS PARAMETERS
    RECORDS DELIMITED BY NEWLINE
    BADFILE EIF:'lob_tab_%a_%p.bad'
    LOGFILE EIF:'lob_tab_%a_%p.log'
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    file_id CHAR(10),
    date_content CHAR(11) DATE_FORMAT DATE MASK "DD-MON-YYYY",
    mime_type CHAR(100),
    blob_filename CHAR(100)
    COLUMN TRANSFORMS (blob_content FROM LOBFILE (blob_filename) FROM (EIF) BLOB)
    LOCATION ('lob_test_data.txt')
    PARALLEL 2
    REJECT LIMIT UNLIMITED
    then created a Discoverer End User Layer folder against this external table, and used exactly the same technique as we did for downloading the BLOB from the database table (creating a new folder item containing a URL calling a database procedure which calls the Oracle code to download the doc). THis worked, but sometimes my PC didn't seem to know that the Word docs were Word docs and it needed to launch Word. Other times it did manage to do this OK. It always displayed the two .txt files as HTML docs.
    Just wondered if you'd be good enough to critique this approach.
    THank you, Julie.

  • Using XSLT stored in the database

    Hi all,
    I have an XML file stored in the database as a CLOB. I also have a XSLT stored in the database as a CLOB. I want to apply the XSLT to the XML but the xslprocessor.newStylesheet requires that I provide a url for the stylesheet. Is there any other way of acheiving this transformation?
    Thanks
    Goel

    Use the XMLTYPE object.
    Fetch your XML and XSL into clobs and create an XMLType object of your XML using the constructor:
    declare
    xml_obj xmltype;
    xml_clob clob;
    xsl_clob clob;
    begin
    -- fetch the xml, xsl into your clobs
    xml_obj := xmltype.createxml(xml_clob);
    htp.p(xml_obj.transform(xmltype(xsl_clob)));
    end;
    XMLTYPE object (new in 9iR2) has a very handy API for manipulating XML.

  • JPA2 - downloading large objects from database

    Hi,
    I would like to enable user to download large (up to 20Mb) files, stored in Oracle database.
    I think I should use a stream, but I don't know how to get JPA to return a stream of Large Object. Can you help?
    I'm using EclipseLink.

    Hello,
    http://wiki.eclipse.org/EclipseLink/Examples/JPA/Pagination#Using_a_ScrollableCursor describes using a scrollable cursor to return entities. Since this is going through JPA (you didn't mention what api you are using to access EclipseLink) you will want to be careful to manage/clear your cache appropriately so it does not use all your available memory. You will probably want to make this query read-only, and clear the cache after a few iterations using em.clear().
    http://wiki.eclipse.org/Introduction_to_EclipseLink_Queries_(ELUG)#Stream_and_Cursor_Query_Results describes and has links to using streams and cursors with the native EclipseLink read queries.
    Best Regards,
    Chris

  • Enable-CsUser : The EXECUTE permission was denied on the object 'XdsPublishItems', database 'xds', schema 'dbo'

    I have created a PowerShell script that automates enabling users for Lync and setting policies based on group membership. I've successfully tested this script under my domain admin account and now I am working on getting it running as a scheduled task.
    Since all the script really does related to Lync is run the commands Enable-CsUser, Set-CsUser, and Grant-Cs<policy name>Policy, I elected to create a service account that only has Lync user administration permissions.  Initially, this user account
    was just a member of CSUserAdministration but this was not working so I added the user to RTCUniversalUserAdmins based on some other information I found.
    This change got me by the various access denied errors I was getting in the script, but now I am getting the following error when I run the Enable-CsUser part:
    Enable-CsUser : The EXECUTE permission was denied on the object 'XdsPublishItems', database 'xds', schema 'dbo'.
    At line:1 char:1
    + Enable-CsUser -Identity <redacted> -RegistrarPool <redacted> - ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Enable-CsUser], SqlException
    + FullyQualifiedErrorId : System.Data.SqlClient.SqlException,Microsoft.Rtc.Management.AD.Cmdlets.EnableOcsUserCmdl
    et
    This seems to be some sort of permission error related to the permissions on the SQL database "xds".  I checked, and RTCUniversalUserAdmins is a member of both CsUserAdministration and RTCUniversalReadOnlyAdmins.  This latter group does
    have permissions on the xds database.  It appears to be granted the "public" role on the database server.  The User Mapping shows the following users mapped to the login:
    cpsdyn: public,ReadOnlyRole
    lis: public,ReadOnlyRole
    rgsconfig: public,ReadOnlyRole
    rgsdyn: public,ReadOnlyRole
    rtcxds: public,ConsumerRole
    xds: public,ConsumerRole
    Even though I receive this error, the user is actually added to Lync. Follow-up Set-CsUser and Grant-Cs<policy name>Policy cmdlets succeed just fine.
    What do I need to do to fix this error message?

    The issue is not related to UAC / Run As Administrator / Run With Highest Privileges.  I have verified that accounts granted only the CS User Administrator role simply do not have access to the XdsPublishItems stored procedure in the Lync xds database,
    even if they are members of RTCUniversalUserAdmins.
    Also, it does not have anything to do with my script.  Even if I grant my service account that local Administrator rights on the Lync front-end server, log into the server with that account, and run the Lync Server Management Shell as administrator
    and then do just the Enable-CsUser cmdlet (not my whole script), I get the same error.
    I ended up opening a Microsoft support case (#114040311332658) and it has been going on for weeks now.  Eventually they just told me that I needed to either have my script establish a remote PowerShell session to Lync or install the Lync management
    tools on another server and have the script call the Lync Server Management Shell from that server.  They say this because the Planning for Role-Based Access Control documentation (http://technet.microsoft.com/en-us/library/gg425917.aspx)
    has the following tip:
    "RBAC restrictions work only on administrators working remotely, using either the Lync Server Control Panel or Lync Server Management Shell. A user sitting at a server running Lync Server is not restricted by RBAC. Therefore, physical security of your
    Lync Server is important to preserve RBAC restrictions."
    I did attempt to run a PowerShell instance on my workstation as the service account, establish a remote PowerShell session to the Lync front-end server, and then run Enable-CsUser and I can confirm that it does run successfully and I do not receive an error
    of any kind.
    I told the support personnel that the tip stating that RBAC doesn't actually restrict permissions if running PowerShell on the server itself doesn't mean that you simply cannot run PowerShell cmdlets and scripts on the server, it just means that the user
    running the cmdlet or script won't have their accessible cmdlets limited to only those granted to the role assigned.  I told them I want a description of what the XdsPublishItem stored procedure does at a high level so I can determine if the error can
    just be simply ignored in this case.  I'm still waiting for them to get back to me on that.
    They did say they tested it on their end and confirm the same behavior in their test environment.  They also said that it doesn't seem to have any sort of negative impact on the functionality of the enabled Lync user or the consistency of the SQL database. 
    That said, I don't want to just take their word for it without them knowing what XdsPublishItem does.

  • Insert large Image object into Database

    Hello
    I have a large (!MB) image which needs to be stored in a database BLOB column, and I'm running out of memory with my naive code..
    Nothing other than the code is within my control. I cannot change my heap size; I have no file-system, so cannot write the image.
    The awt.Image is created and drawn elsewhere in the application. My thought was to create a byte stream and have that inserted chunk-by-chunk, but I just can't find out how to do this in a limited time.
    Any help would be much appreciated.
    Lee

    leegee23 wrote:
    Thanks for your help. Have tried this:
    ImageInputStream is = ImageIO.createImageInputStream(gif);But got null. The docs read:
    Returns an ImageInputStream that will take its input from the given Object. The set of ImageInputStreamSpis registered with the IIORegistry class is queried and the first one that is able to take input from the supplied object is used to create the returned ImageInputStream. If no suitable ImageInputStreamSpi exists, null is returned.
    Am I barking up the wrong tree?I think you're on the right track. A quick browse found that an ImageWriter (GIFImageWriter) can be used to write an image to an output stream (use ImageIO.createImageOutputStream()), and then you can probably use PipedInputStream/PipedOutputStream to obtain an inputStream that you can pass to your JDBC driver to store the blob.
    That's just from reading Javadocs though, I'm not sure how to connect the dots.
    And also, make sure you post a reference to this thread on the new one you created. You wouldn't want people to waste time answering that thread if there's an answer here already, or vice versa.
    Edit: I was thinking specifically of using a GifImageWriter constructed with a OutputStreamImageOutputStreamSpi that was passed in a PipedOutputStream which you would in turn connect to a PipedInputStream which you would pass in to the JDBC method.
    But I'm not sure, it looks like even then it either uses a memory cache or a file cache. When you have compression, the writer will typically need to have access to all the bytes of the image before starting to write. It would be a two-pass algorithm, most likely. Which basically means you might have memory issues anyway.
    Edited by: endasil on 22-Sep-2009 1:12 PM

  • How to pass xml data as objects into Database using store procedures

    Hi All,
         I don't have much knowledge on store procedure,can anybody help how to pass the xml as objects in Database using store procedure.
    My Requirement is I have a table with three fields EMPLOYEE is table name and the fields are EMP_ID,EMP_TYPE AND EMP_DET,I have to insert the employees xml data into corresponding fields in the table.
    Input Data
    <ROWSET>
       <ROW>
         <EMP_ID>7000</EMP_ID>
          <EMP_TYPE>TYPE1</EMP_TYPE>
         <EMP_DET>DEP</EMP_DET>
      <ROW>
      <ROW>
         <EMP_ID>7000</EMP_ID>
         <EMP_TYPE>TYPE2</EMP_TYPE>
        <EMP_DET>DEP2</EMP_DET>
    <ROW>
    <ROW>
         <EMP_ID>7000</EMP_ID>
         <EMP_TYPE>TYPE3</EMP_TYPE>
        <EMP_DET>DEP3</EMP_DET>
    <ROW>
    <ROWSET>
    So each row values has to inserted into resp fields in the table.
    Regards
    Mani

    Do you have a similar structure in your stored procedure ?
    In that case you can simply call the procedure from soa using db adapter and do a mapping to assign the values.

  • Storing Objects

    Hello All
    How can I store objects in database. For example, I am using Visual C++ to access Oracle database 9i. I have a custom struct/class defined and want to store its objects in the database. Is there any option to do this?

    If you want to store a real object, you would have to write a method that created a binary representation of the object and store that in a BLOB column. If you're familiar with Java, you'd need to write a serialize method.
    I would strongly suggest that you consider the implications of doing this, however. If your data is stored in binary columns, only your application will ever be able to access it, you won't be able to use database features like referential integrity, etc. Your application will also be responsible for enforcing data integrity, etc.
    I would be willing to wager that everyone will be happier in the future if you create a reasonable relational data model and spend the time now to develop the object-relational data maps. There are tools on the market that will help you develop the O-R mapping if that is the stumbling block.
    Justin
    Distributed Database Consulting, Inc.
    http://www.ddbcinc.com/askDDBC

  • Firing Stored Procedure Into Database At Runtime

    HI All,
    I need a help !. I have created a stored procedure that creates a dynamic SP at runtime depending upon certain values stored in my database. Now I want that as soon as the dynamic SP is written in a flat file on the database server it should be compiled into database.
    What I am doing right now is :
    step1: create a SP
    step2: fetch values from database
    step3: create a string from it which actually contains syntax for creating another SP
    step4: open a new file "test.sql" on the database server
    step5: write this string into "test.sql"
    step6: close the file "test.sql"
    step7: exit SP
    This creates a file named "test.sql" on oracle database server.
    Now my requirement is to include another step after step6 say
    step6.1: compile "test.sql" into the database.
    Does any one have idea how to achieve this using SP.
    Thanks & regards
    Vivek Verma

    I don't know which solution you're attempting, but here goes.
    You cannot build a procedure using objects (e.g. tables, views) etc when you have been granted rights to them via role. Similarly you cannot use execute immediate to use a system privilege (e.g. CREATE PROCEDURE) if you have been granted it through a role (e.g. CONNECT).
    In both cases the relevant solution is to get the grantor (table owner, dba user) to grant the privilege to your account by name.
    Cheers, APC

  • Error in wrting object to database

    Hi,
    When I go to "persistent.xml-><EJBname>->cmr-field-><fieldName>", on right hand side, in additional information section it shows "ERROR:
    The class of this dependent value has no public fields. Because of this it can only be mapped to a single column".
    That field is an object of some other class. So, whereever I have any column storing object of some class, I have the same message.
    Due to his, its giving deployment error.
    "Cannot obtain an appropriate JDBC type for class com.bea.medrec.entities.RecordLocal. To store the field with this class in the database, the class must implement java.io.Serializable."
    Please suggest what could be the solution.
    Thanks!

    Hi Dhamandheep ,
    which is the data type of the field u have  created?.
    is it your own  class type (Custom class).
    if u r using your own class as data type , u have to implement java.io.Serializable to that class.
                                        regards
                                        Kishor Gopinathan

  • Error in writing object to database

    Hi,
    When I go to "persistent.xml-><EJBname>->cmr-field-><fieldName>", on right hand side, in additional information section it shows "ERROR:
    The class of this dependent value has no public fields. Because of this it can only be mapped to a single column".
    That field is an object of some other class. So, whereever I have any column storing object of some class, I have the same message.
    Due to his, its giving deployment error.
    "Cannot obtain an appropriate JDBC type for class com.bea.medrec.entities.RecordLocal. To store the field with this class in the database, the class must implement java.io.Serializable."
    Please suggest what could be the solution.
    Thanks!

    Hi Dhamandheep ,
    which is the data type of the field u have  created?.
    is it your own  class type (Custom class).
    if u r using your own class as data type , u have to implement java.io.Serializable to that class.
                                        regards
                                        Kishor Gopinathan

  • When I select from the LOV, it is not storing in the database

    Have a field (Manager) where the user selects their manager from the select list(generated from the query below)
    select FIRST_NAME || LAST_NAME d, MANAGER_ID r
    from PERSONNEL
    where TITLE = 'MGR'
    order by 1
    After the manager is selected and Apply changes is clicked, nothing is stored to the database.
    Have the Manager field specifications set as:
    Source Used: Only when current value is session state is null
    Source Type: Database column
    Maintain Session State: Per Session
    Source Value or Expression: MANAGER_ID

    Well, how have you created this form... manually or using wizard. If you have used wizard, then it would have asked you to select the table and it would have created process to update the same.
    If you have created this form manually then you need to add a processs to update this to database...
    Regards,
    Shijesh

  • Can a Servlet be used for Storing Objects with both JSP and JSF used on it?

    Hi,
    Pages I have:
    SearchEmployee.jsp
    This page has a search engine that search out the Employee. This Employee Object will be stored inside a Servlet(controller) for future references by other pages. I used JSP, html tags for forms, and request.getParameter() to built this search engine.
    Problem:
    I have a JSF Form that wants to DISPLAY the employee which I have found in my Search Engine. How can I get the JSF's value="#{Controller.employeeObj.name}" to get the value from the object?
    This seems logical as my JSF form is just retrieving the stored object in the Controller. I currently cant seem to output it

    The servlet shouldn't be used to store ANY data, let alone data to be accessed by other sevlets. Put the object into the Session object.

Maybe you are looking for

  • Can not complete install of elements 13

    Exit Code: 7 Please see specific errors below for troubleshooting. For example, ERROR: -------------------------------------- Summary -------------------------------------- - 0 fatal error(s), 2 error(s) ERROR: This installer does not support install

  • External Hard Drive not being recognized

    I made a topic some time ago but it never got answered. http://discussions.apple.com/thread.jspa?threadID=1906969&tstart=0&messageID=906 6822#9066822 This hard drive has never worked on this computer and I am still not sure why. It does not show up i

  • I just upgraded OS X to 10.6.7 and now Aperture (3.1.2) won't launch.  Any troubleshooting suggestions (short of re-installing Aperture)?

    Help!  I just upgraded my early 2008 MacBook Pro 4,1 from OS X 10.5.8 to 10.6.7.  Everything appears to be working fine, except for Aperture 3.1.2, which won't launch - gives an error message which states that "there is a problem" and to "check with

  • Display Photo in Employee Who is who search

    Hi, We are planning to display the photo of an employee in the employee Who is Who search Please let me know the procedure to do the same and points will be rewarded for sure Thanks Bala Duvvuri

  • A new thought on Archiving

    I have always used and advocated sharing to tape as the best means of preserving the iMovie projects which make up an iDVD. It now occurs to me that I can buy about a dozen DVD-Rs for the price of a tape. Is there a (hopefully freeware) utility that