1,首先要产生链接操作的表,如果这两个表在同一个数据库中我想应该直接用sql语句就可以了,没有必要先拿到本地再进行链接操作;如果不在同一个数据库中(比如excel的两个文件中,这两个文件就等价于两个数据库),那么只好从每个数据库中先把感兴趣的数据表提取出来,放到本地的datase中,让它们形成一个本地数据库

2,c#的datatable对象是不允许同时隶属于多个dataset的。所以要将一个datatable从一个dataset转移到另一个dataset需要一定的技巧。一方面可以利用clone或者copy方法产生一个完全相同的datatable对象,但是在数据表比较大的情况下,复制数据既浪费时间又浪费空间;另一方面我们可以舍弃一个不太感兴趣的dataset来支持我们感兴趣的dataset。下面就是具体的处理方法:

public DataTable GetTable(string pPath, string pSql, string pName)
{
            try
            {
                string sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pPath + ";Extended Properties='Excel 8.0;'";
                DataSet sSet = new DataSet();
                OleDbDataAdapter sAdapter = new OleDbDataAdapter(pSql, sCon);
                sAdapter.Fill(sSet, pName);
                DataTable sTable = sSet.Tables[pName];
                sSet.Tables.Remove(pName);//必须移除,同一个table不能同时存在两个set中
                sSet.Dispose();
                return sTable;
               
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                return null;
            }
}

3,将感兴趣的表加入dataset后就构造好了本地数据库了,下一步应该建立两表之间的链接了。首先c#中的表间关系被定义为父子关系或者主从关系,这里的父和主对应于sql中含主键的表,而子和从则对应sql中含外键的表。其次这里容易发生于首先中提到的相对应的两个问题,一个是指定为父键的列中不能有重复值,否则会抛出异常,这个在framework中是坚决不允许的;另一个是指定为父键的列如果因为过滤而不包括子键列中的某些值,这时也会抛出异常,这个可在framework中是可以变通解决的。下面是具体的处理方法:

sDataSet.Relations.Add(sRelationName, sBaseInfoTable.Columns["资源ID"], sMemberResTable.Columns["资源ID"], false);

第一个参数是关系的名称,方便以后引用;第二个是父键列,第三个是子键列,第四个指定为false可以解决父键列不能全部包含子键列的问题。

具体的链接查询方法有两种,一种是站在父表的立场上,通过遍历每一个行对象,调用行对象的GetChildrenRow(s)函数得到子表中的感兴趣信息;另一种是站在子表的立场上,通过遍历每一个行对象,调用行对象的GetParentRow(s)函数得到父表中的感兴趣信息。这里给出子表立场上的访问方法:

foreach (DataRow sRow in sDataSet.Tables[sName].Rows)
{
                    if (sRow["资源ID"].ToString() == "")
                    {
                        MessageBox.Show("共有:" + count + "个资源库");
                        break;
                    }

DataRow[] sParent = sRow.GetParentRows(sRelationName);
                    foreach (DataRow sProw in sParent)
                    {
                        ++count;
                        sWriter.WriteLine("<ResDbInfo>");

sWriter.Write("<ResId>"); sWriter.Write(sProw["资源ID"]); sWriter.WriteLine("</ResId>");
                        sWriter.Write("<IsConfiged>"); sWriter.Write("1"); sWriter.WriteLine("</IsConfiged>");
                        sWriter.Write("<IsHot>"); sWriter.Write("0"); sWriter.WriteLine("</IsHot>");

sWriter.Write("<ResSub>");
                        string sSub = "";
                        for (int i = 1; i <= 4; ++i)
                        {
                            if (sProw["所属分类" + i].ToString() != "")
                            {
                                sSub = sSub + sProw["所属分类" + i].ToString() + ",";
                            }
                        }
                        sWriter.Write(sSub.Trim(new char[] { ','}));
                        sWriter.WriteLine("</ResSub>");

sWriter.Write("<Name>"); sWriter.Write(sRow["资源名"].ToString().Replace("&", "&amp;")); sWriter.WriteLine("</Name>");//用成员馆信息表中的资源名称作为资源名
                        //sWriter.Write("<Name>"); sWriter.Write(sProw["显示标题"].ToString().Replace("&", "&amp;")); sWriter.WriteLine("</Name>");用基本信息表中的显示标题字段作为资源名
                        sWriter.Write("<Homepage>"); sWriter.Write(sRow["链接URL地址"].ToString().Replace("&", "&amp;")); sWriter.WriteLine("</Homepage>");

sWriter.Write("<Description>");
                        sWriter.Write(sProw["资源库介绍"].ToString().Replace("&", "&amp;"));
                        sWriter.WriteLine("</Description>");

sWriter.WriteLine("</ResDbInfo>");
                    }
}

DataSet本地化数据的二表链接操作相关推荐

  1. 漫谈程序员(二十)炉石传说罕见数据库事故!丢失30%数据,疑似误操作?

    #漫谈程序员(二十)炉石传说罕见数据库事故!丢失30%数据,疑似误操作? ##引言   最近看到一篇关于"炉石传说数据库事故"的文章,分享给大家,并简要谈一下自己的心得体会.    ...

  2. 数据存储之 SQLite 数据库操作(二)

    上一讲我们讲解了SQLite数据库的创建[数据存储之 SQLite 数据库操作(一)],还有更新的操作,这一讲我们来讲解一下数据库的增删改查,这边的程序是对上一个程序进行修改,建议结合上一讲内容进行学 ...

  3. 杭电Matlab与仿真-MATLAB基本语法(二)-数据文件的读/写操作

    数据文件的读/写操作 实验目的 实验内容与要求 实验程序与结果 实验目的 学会matlab数据输入与输出基本操作: 熟悉matlab各种文件的输入输出方法,了解常用的图片及音频文件的输入输出: 掌握用 ...

  4. 【数据库基础知识二】数据库DataBase(简称DB),数据库基本概念、DDL:数据定义语言,用来操作数据库对象、DML:数据操作语言,用来操作表中的数据

    14天阅读挑战赛 目录 数据库基本概念 数据库DataBase(简称DB) 数据库管理系统Database management system(简称DBMS) 如何操作DBMS? 连接数据库的方式: ...

  5. python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解

    python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...

  6. 如何将DATASET的数据导出到XML文件,并直接下载

    如何将DATASET的数据导出到XML文件,并直接下载 转成其他格式可以使用诸如      Dim   Temp   As   String   =   String.Format("att ...

  7. 【DBMS 数据库管理系统】数据仓库特征 ( 特征一 : 面向主题组织数据 | 特征二 : 数据集成 | 特征三 : 数据不可更新 | 特征四 : 随时间不断变化 )

    文章目录 一.特征一 : 面向主题 数据组织方式 二.特征二 : 数据集成 三.特征三 : 数据不可更新 四.特征四 : 数据仓库中的数据 随时间不断变化 一.特征一 : 面向主题 数据组织方式 主题 ...

  8. 数据存储之 SQLite 数据库操作(三)

    上一讲中我们讲到了SQLite数据库的操作方法 [数据存储之SQLite数据库操作(二)],我们主要是以SQL语句对数据库进行增删改查,这一讲我们来学习一下 Android 建议的对数据库的操作方法 ...

  9. 在pytorch中自定义dataset读取数据2021-1-8学习笔记

    在pytorch中自定义dataset读取数据 utils import os import json import pickle import randomimport matplotlib.pyp ...

  10. C++读取txt数据为二维数组 将数据保存到txt文本中

      C++读取txt数据为二维数组 保存txt文本数据     C++文件读写操作有:ofstream,ifstream,fstream: #include <fstream> ofstr ...

最新文章

  1. 网站安全--又一种防盗链的措施!
  2. 九度OJ 区间问题 10000个随机正负数生成
  3. java 枚举类 扑克牌_Java中的枚举和多态,扑克牌示例
  4. linux基本安全配置手册
  5. 【C++ Priemr | 15】虚函数表剖析(三)
  6. 用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图
  7. 38动感菜单 38 jQuery And CSS Drop Down Multi Level Menu Solutions
  8. socket是什么?
  9. 一起谈.NET技术,在ASP.NET MVC3 中利用JSONP跨域登录WEB系统
  10. 数据库查询-模糊查询
  11. php输入指定文字转换成图片的简单例子
  12. 阿里云商标注册流程步骤
  13. matlab中龙贝格公式,龙贝格求积公式matlab
  14. Conflicting order. Following module has been added:
  15. 太原理工大学数据科学与计算机学院,谢珺-太原理工大学信息与计算机学院
  16. Android Alarm定时任务基础
  17. pda扫码相关的打印机,用蓝牙连接打印,斑马打印机,zsu
  18. request.setAttribute的用法
  19. VC.PE.天使等解释
  20. v18.02 鸿蒙内核源码分析(源码结构) | 内核文件各自含义 | 百篇博客分析HarmonyOS源码

热门文章

  1. webService的使用-----Eclipse
  2. 使用python中正则表达式匹配linux ifconifg命令中的具体信息
  3. 使用pythonping检查设备的连通性并记录可达设备(eNSP模拟器)
  4. HCIE Security 防火墙NAT技术 备考笔记(幕布)
  5. IS-IS详解(九)——IS-IS 骨干区域与非骨干区域访问基础
  6. OSPFv3中LSA详解(三)——Network LSA变化
  7. IPv6中NDP协议简介
  8. 华三 h3c Ftp、Telnet配置
  9. 带宽和最高速率之间的换算
  10. 178. Rank Scores