65.9K
CodeProject 正在变化。 阅读更多。
Home

ADO.NET 断开连接的数据

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.82/5 (4投票s)

2006 年 5 月 11 日

3分钟阅读

viewsIcon

45957

downloadIcon

453

展示了使用 ADO.NET 断开连接的数据的基本知识。

引言

ADO.NET 库具有一个简洁的断开连接的数据功能,当您希望移动用户使用笔记本电脑或 PDA 在旅途中使用应用程序时,此功能非常方便。特别适用于用户无法随时访问 Internet 的情况。断开连接的数据的应用程序可以根据贵公司的需求进行应用。

背景(可选)

我一直是 DataSet 类的粉丝,因为它使我能够断开连接地处理数据,非常适合 3 层实现。另外的好处是,从理论上讲,可以将常用数据持久化到本地磁盘,供移动用户使用。最近,我用 dotnet Compact Compact 1.1(“CF”)创建了一个小型 Smartphone 2003 业余项目。这个想法是在 Smartphone 2003 设备上创建一个应用程序,使我能够在离开城镇时像 MS Money 2003 一样输入交易。输入的交易必须能够导入到 MS Money 2003 中。在 dotnet framework 1.1 上,我构建了一个应用程序,可以将我的移动交易转换为 MS Money 2003 接受的导入数据格式——在这种情况下为 Quicken QIFs。

我选择了一种常用的数据格式,Dotnet 和 CF 都很好地支持它:断开连接的 Dataset。

先决条件

在本文中,我将假设您对 dotnet framework 1.1、VS2003.NET 和 ADO.NET 总体上有所了解。这个例子应该也适用于 dotnet framework 2.0,尽管尚未经过测试。

使用代码

基本上,要使用断开连接的记录以及 XML 模式,您需要有一个单独的 XML 文件,其中包含断开连接的数据。不用担心;您可以让 ADO.NET 为您生成模式文件。

有 3 种方法可以为 ado.net 生成 XML 模式
· 您是一位大师,所以您知道如何自己制作一个。
· 使用现有的数据库查询,返回一个 DataSet,并使用 WriteXmlSchema 方法保存模式。
· 以编程方式创建一个 DataTable,向其添加 DataColumn,然后将其 DataSet 保存为新的 XML 模式。

要实际使用断开连接的数据,您应该
· 实例化一个新的 DataSet 对象。
· 首先使用 ReadXmlSchema 方法获取模式,然后使用 DataSetReadXml 方法获取断开连接的数据。

让我详细介绍一下代码
· InitializeNewDisconnectedData() 手动为您创建一个断开连接的 DataSet 以供您试验。
· 使用 GetMusicLibrary(),您可以获取在应用程序中使用的断开连接的数据。我返回一个 dataview,这是我最喜欢的 ADO.NET 对象之一。
· RefreshLibraryGrid() 用于刷新您的音乐库的显示网格。
· 辅助函数 GetAssemblyPath() 允许您将模式和数据 XML 保存在应用程序的可执行路径中。
· SaveLibrary() 用于将更改提交回断开连接的 DataSet。

示例代码片段 InitializeNewDisconnectedData()

/// <summary>
/// Initializes a new disconnected data source to file.
/// This initilizes a new disconnected dataset, saves it to local storage.
/// 
/// This is code for a example useage of disconnected data.
/// Example article is on http://codeproject.com, author Michiel Erasmus.
/// </summary>
private void InitializeNewDisconnectedData()
{
    try
    {
        DataSet dsDisconnectDS1;
        DataTable dtDisconnectInit1 = 
                  new DataTable("tblArtistSongs");

        DataColumn dcColumn1 = new DataColumn("ArtistSongID", 
                        System.Type.GetType("System.Int32"));
        dcColumn1.Unique = true;
        dcColumn1.AutoIncrement = true;
        dcColumn1.AutoIncrementStep = 1;
        dcColumn1.AutoIncrementSeed = 1;
        dtDisconnectInit1.Columns.Add(dcColumn1);

        dcColumn1 = new DataColumn("Artist", 
                    System.Type.GetType("System.String"));
        dtDisconnectInit1.Columns.Add(dcColumn1);
        dcColumn1 = new DataColumn("Albumname", 
                    System.Type.GetType("System.String"));
        dtDisconnectInit1.Columns.Add(dcColumn1);
        dcColumn1 = new DataColumn("Song", 
                    System.Type.GetType("System.String"));
        dtDisconnectInit1.Columns.Add(dcColumn1);

        if(dtDisconnectInit1.DataSet == null)
        {
            string strOuptPathSchema = 
               GetAssemblyPath() + @"\MyMusicLibrary.xsd";
            string strOuptPathData = 
               GetAssemblyPath() + @"\MyMusicLibrary.xml";

            dsDisconnectDS1 = new DataSet("MusicLibrary");
            dsDisconnectDS1.Tables.Add(dtDisconnectInit1);
            dsDisconnectDS1.WriteXmlSchema(strOuptPathSchema);
            dsDisconnectDS1.WriteXml(GetAssemblyPath() + 
                                     @"\MyMusicLibrary.xml");
        }

    }
    catch(Exception ex1)
    {
        throw new Exception(ex1.Message + " " + ex1.StackTrace, ex1);
    }
}

使用 GetMusicLibrary(),您可以从存储设备中检索持久化的断开连接的数据。

/// <summary>
/// Gets the music library.
/// </summary>
/// <returns>the music library</returns>
private DataView GetMusicLibrary()
{
    DataView dvData1 = null;

    try
    {
        string strOuptPathSchema = GetAssemblyPath() + 
                                   @"\MyMusicLibrary.xsd";
        string strOuptPathData = GetAssemblyPath() + 
                                 @"\MyMusicLibrary.xml";

        // if the schema wasnt created then make it now.
        if(!System.IO.File.Exists(strOuptPathSchema))
        {
            this.InitializeNewDisconnectedData();
        }

        DataSet dsDisconnectDS1 = new DataSet("MusicLibrary");
        dsDisconnectDS1.ReadXmlSchema(strOuptPathSchema);
        dsDisconnectDS1.ReadXml(strOuptPathData);

        dvData1 = dsDisconnectDS1.Tables[0].DefaultView;
    }
    catch(Exception ex1)
    {
        throw new Exception(ex1.Message + " " + 
                            ex1.StackTrace, ex1);
    }

    return dvData1;
}

如果您有 GUI,您可以刷新显示(可选)。

/// <summary>
/// Refreshes the library grid.
/// </summary>
private void RefreshLibraryGrid()
{
    try
    {
        grdLibrary.DataSource = null;
        Application.DoEvents();
        grdLibrary.DataSource = GetMusicLibrary();
    }
    catch(Exception ex1)
    {
        MessageBox.Show(ex1.Message + " " + ex1.StackTrace, 
                        "run in debug mode!", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Error);
    }
}

关注点

这个例子可以扩展得很大;您可以构建关系等,然后为您的移动用户提供一个相当完整的断开连接的数据库应用程序。正如我之前所说,一切都取决于贵公司的需求。

历史

2006 年 5 月 11 日:本文的第一个版本。

© . All rights reserved.