DataSet本地化数据的二表链接操作
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("&", "&")); sWriter.WriteLine("</Name>");//用成员馆信息表中的资源名称作为资源名
//sWriter.Write("<Name>"); sWriter.Write(sProw["显示标题"].ToString().Replace("&", "&")); sWriter.WriteLine("</Name>");用基本信息表中的显示标题字段作为资源名
sWriter.Write("<Homepage>"); sWriter.Write(sRow["链接URL地址"].ToString().Replace("&", "&")); sWriter.WriteLine("</Homepage>");
sWriter.Write("<Description>");
sWriter.Write(sProw["资源库介绍"].ToString().Replace("&", "&"));
sWriter.WriteLine("</Description>");
sWriter.WriteLine("</ResDbInfo>");
}
}
DataSet本地化数据的二表链接操作相关推荐
- 漫谈程序员(二十)炉石传说罕见数据库事故!丢失30%数据,疑似误操作?
#漫谈程序员(二十)炉石传说罕见数据库事故!丢失30%数据,疑似误操作? ##引言 最近看到一篇关于"炉石传说数据库事故"的文章,分享给大家,并简要谈一下自己的心得体会. ...
- 数据存储之 SQLite 数据库操作(二)
上一讲我们讲解了SQLite数据库的创建[数据存储之 SQLite 数据库操作(一)],还有更新的操作,这一讲我们来讲解一下数据库的增删改查,这边的程序是对上一个程序进行修改,建议结合上一讲内容进行学 ...
- 杭电Matlab与仿真-MATLAB基本语法(二)-数据文件的读/写操作
数据文件的读/写操作 实验目的 实验内容与要求 实验程序与结果 实验目的 学会matlab数据输入与输出基本操作: 熟悉matlab各种文件的输入输出方法,了解常用的图片及音频文件的输入输出: 掌握用 ...
- 【数据库基础知识二】数据库DataBase(简称DB),数据库基本概念、DDL:数据定义语言,用来操作数据库对象、DML:数据操作语言,用来操作表中的数据
14天阅读挑战赛 目录 数据库基本概念 数据库DataBase(简称DB) 数据库管理系统Database management system(简称DBMS) 如何操作DBMS? 连接数据库的方式: ...
- python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解
python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...
- 如何将DATASET的数据导出到XML文件,并直接下载
如何将DATASET的数据导出到XML文件,并直接下载 转成其他格式可以使用诸如 Dim Temp As String = String.Format("att ...
- 【DBMS 数据库管理系统】数据仓库特征 ( 特征一 : 面向主题组织数据 | 特征二 : 数据集成 | 特征三 : 数据不可更新 | 特征四 : 随时间不断变化 )
文章目录 一.特征一 : 面向主题 数据组织方式 二.特征二 : 数据集成 三.特征三 : 数据不可更新 四.特征四 : 数据仓库中的数据 随时间不断变化 一.特征一 : 面向主题 数据组织方式 主题 ...
- 数据存储之 SQLite 数据库操作(三)
上一讲中我们讲到了SQLite数据库的操作方法 [数据存储之SQLite数据库操作(二)],我们主要是以SQL语句对数据库进行增删改查,这一讲我们来学习一下 Android 建议的对数据库的操作方法 ...
- 在pytorch中自定义dataset读取数据2021-1-8学习笔记
在pytorch中自定义dataset读取数据 utils import os import json import pickle import randomimport matplotlib.pyp ...
- C++读取txt数据为二维数组 将数据保存到txt文本中
C++读取txt数据为二维数组 保存txt文本数据 C++文件读写操作有:ofstream,ifstream,fstream: #include <fstream> ofstr ...
最新文章
- 网站安全--又一种防盗链的措施!
- 九度OJ 区间问题 10000个随机正负数生成
- java 枚举类 扑克牌_Java中的枚举和多态,扑克牌示例
- linux基本安全配置手册
- 【C++ Priemr | 15】虚函数表剖析(三)
- 用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图
- 38动感菜单 38 jQuery And CSS Drop Down Multi Level Menu Solutions
- socket是什么?
- 一起谈.NET技术,在ASP.NET MVC3 中利用JSONP跨域登录WEB系统
- 数据库查询-模糊查询
- php输入指定文字转换成图片的简单例子
- 阿里云商标注册流程步骤
- matlab中龙贝格公式,龙贝格求积公式matlab
- Conflicting order. Following module has been added:
- 太原理工大学数据科学与计算机学院,谢珺-太原理工大学信息与计算机学院
- Android Alarm定时任务基础
- pda扫码相关的打印机,用蓝牙连接打印,斑马打印机,zsu
- request.setAttribute的用法
- VC.PE.天使等解释
- v18.02 鸿蒙内核源码分析(源码结构) | 内核文件各自含义 | 百篇博客分析HarmonyOS源码