如何使多个数据库的表格合并成一张表并显示在一个gridview中
篇一:DataSet多表关联实现本地数据复杂的查询
如果要显示两张数据库表的记录,最简单的
是检索时
将两张表中你要的数据一次检索出来,放入同一个
DataTable来显示。
如果要显示两个以上DataTable中的数据,则需要将
DataTable放入DataSet并建立relation就可以显示了。
下面是刚做的一个例子。另外,父表一定要有主键。建
立关联时要用主键。
private void button1_Click(object sender, System.EventArgs e)
{
DataTable dtName = new DataTable(NameDt);
dtName.Columns.Add(ID, typeof(string));
dtName.Columns.Add(Name, typeof(string));
dtName.PrimaryKey = new DataColumn[]
1
{dtName.Columns[ID] }; dtName.Rows.Add(1, Name1);
DataTable dtAddress = new DataTable(AddressDt);
dtAddress.Columns.Add(ID, typeof(string));
dtAddress.Columns.Add(Address, typeof(string));
dtAddress.Rows.Add(1, Address1);
dtAddress.Rows.Add(1, Address2);
DataSet ds = new DataSet();
ds.Tables.Add(dtName);
ds.Tables.Add(dtAddress);
// 关键~建立表之间的关联
ds.Relations.Add(ForName, dtName.Columns[ID],
dtAddress.Columns[ID]);
// 在子表中添加计算列,引用父表的数据。
dtAddress.Columns.Add(Name, typeof(string), Parent(ForName).Name);
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = ds;
dataGridView1.DataMember = AddressDt;
}
DataSet多表关联实现本地数据复杂的查询
[c-sharp] view plaincopy 1. DataSet ds = new DataSet();
2.
2
3. //提取第一个表 放在ds中
4. dp.CommandText = SELECT * FROM
ss_RolesInAction;
5.
ds.Tables.Add(dp.ExecuteDataTable(ss_RolesInAction));6.
7. //提取第二个表 放在ds中
8. dp.CommandText = SELECT * FROM ss_Action;
9. ds.Tables.Add(dp.ExecuteDataTable(ss_Action));
10.
11. //提取第三个表 放在ds中
12. dp.CommandText = SELECT * FROM as_SiteMap;
13. ds.Tables.Add(dp.ExecuteDataTable(as_SiteMap));
14.
15. //建立关系 ss_Action.FID =
ss_RolesInAction.FActionID ,ss_RolesInAction.FActionID为外键
16. ds.Relations.Add(relation1,
ds.Tables[1].Columns[FID],
ds.Tables[0].Columns[FActionID]);
17. //建立关系 as_SiteMap.ID =
ss_RolesInAction.FNodeID ,
ss_RolesInAction.FNodeID 为外键
3
18. ds.Relations.Add(relation2, ds.Tables[2].Columns[ID],
ds.Tables[0].Columns[FNodeID]);
19.
20.
21. //查询条件测试1:对父表查询获取子表测试
22. //条件为 ss_Action.FID 等
于 6E7BB6B5-4DDA-4BB9-A156-71288CEF16B2 的或
是 ss_RolesInAction.FActionID 等于
DB893F4E-B411-4FC0-9735-D5E9B7823083 或是
as_SiteMap.id 等于7的
23. //因为已经建立三个表的关系,所以,无论查询条件是
什么 都会跟上 关系中的条件 即:
24. //ss_Action.FID = ss_RolesInAction.FActionID AND as_SiteMap.ID = ss_RolesInAction.FNodeID
25. //当我们指定的查询条件为空时会 根据 关联关系查
询 以下条件中的 完整关联关系是这样的
26. //(ss_Action.FID = ss_RolesInAction.FActionID AND as_SiteMap.ID = ss_RolesInAction.FNodeID ) and ss_Action.FID='6E7BB6B5-4DDA-4BB9-A156-71288CEF16B2' or ss_RolesInAction.FActionID= 'DB893F4E-B411-4FC0-9735-D5E9B7823083' or as_SiteMap.id=7
4
27. DataView dv = ds.Tables[0].DefaultView;
28. dv.RowFilter =
parent(relation1).FID='6E7BB6B5-4DDA-4BB9-A156-7
1288CEF16B2' or FActionID=
'DB893F4E-B411-4FC0-9735-D5E9B7823083' or parent(relation2).id=7;
29.
30. //查询条件测试2:对子表查询获取父表测试
31. //因为子表与父表是 多对一 的关系所以 我们对子表
查询时 会返回多个值所
以 使用 MAX
32. DataView dv = ds.Tables[1].DefaultView;
33. dv.RowFilter = max(child(relation1).FActionID) in ('FFD953C4-09
20-4558-B87F-3A25CFB15754','FC5C91F5-45ED-4B3E-8E14-C2391B9A6B14') ;//这个查询条件中无
法关联 as_SiteMap查询条件 因为没有 查询表
as_SiteMap和返回
表 ss_Action 的条件
34.
5
35. this.GridView1.DataSource = dv;
36. this.GridView1.DataBind();
在Winform中将数据库中的多张表同时显示在多个
DataGridView中的方法
2009-08-28 12:11:05| 分类: |举报|字号 订阅
方法一:
使用SqlDataAdapter向DataGridView添加数据时,可
以在其参数中添加多条SQL语句,查询出的结果分别保存
在
多个DataSet中,在为多个DataGridView指定数据源时,
将DataSet中的多张表依次赋给每个DataGridVie即可。
关键代码:
private void Form1_Load(object sender, EventArgs e)
{
using (SqlDataAdapter da = new SqlDataAdapter(select *
from
Product;select * from Product,
DBService.Conn))
{
DataSet ds = new DataSet();
da.Fill(ds);
this.dataGridView1.DataSource = ds.Tables[0];
6
this.dataGridView2.DataSource = ds.Tables[1];
}
}
方法二:
在使用SqlDataReader向DataGridView添加数据时,也
是在其参数中添加多条SQL语句,但不同的是,在为
DataGridView指定数据源时,可以利用DataReader对象
的Read()和NextResult()方法,并且以for循环的方式来
显示在多个DataGridView中;
关键代码:
private void button1_Click(object sender, EventArgs e)
{
using (SqlCommand cmd = new SqlCommand(select * from jobs;select * from sales,
DBconnection.Conection))
{
using (SqlDataReader dr =
cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
do
{
7
while (dr.Read())
{
Console.WriteLine(dr[0].ToString());
}
}
while (dr.NextResult());
}
}}
? Writer:cheng ?
篇二:海量(大量)数据GridView显示高效率分页实现方法
问
:
GridView显示海量数据时效率极其低,每次要从数据库从取出海量数据,这明显不现实。
解决
:
显示多少,就从数据库中读取多少数据,即每次取GridView显示的一个页面数据,点击下一页是,再取下一页相应的数据。
真的是很简单,但如果对asp.net不熟悉的人来说,还是有点难度。
就比如说:当页面刷新时,怎样使一个变量的值保持不变呢,很晕是吧
下面我们说分析实现方法:
8
1、刷新页面,保持变量值不变
先讲怎样在刷新页面是使一个变量值保持不变,以前我都采用页面传值法,总觉得有点怪,本来就是本页的数据还要通过页面传值来保存。
后来在网上发现VewState这东东,有点像Session,用法基本上一样。
他们的区别是:Session是在页面之间,而ViewState是在它自己的页面保持一个值。 用法:
ViewState[PageCounts] = 3;
下次要用时直接取出来就OK了。
2、GridView海量数据高效分页实现代码
下面代码来自互联网
const int PageSize=20;//定义每页显示记录
int PageCount,RecCount,CurrentPage,Pages,JumpPage;//
定义几个保存分页参数变量
private void Page_Load(object sender,
System.EventArgs e)
{
if(!IsPostBack)
{
RecCount = Calc();//通过Calc()函数获取总记录数
PageCount = RecCount/PageSize + OverPage();
9
//计算总页数(加上OverPage()函数防止有余数造成显示
数据不完整)
ViewState[PageCounts] = RecCount/PageSize -
ModPage();
//保存总页参数到ViewState(减去ModPage()函数防止
SQL语句执行时溢出查询范围,可以用存储过程分页算法来
理解这句)
ViewState[PageIndex] = 0;//保存一个为0的页面索引值到
ViewState ViewState[JumpPages] = PageCount;
//保存PageCount到ViewState,跳页时判断用户输入数是
否超出页码范围 //显示LPageCount、LRecordCount的状
态
LPageCount.Text = PageCount.ToString();
LRecordCount.Text = RecCount.ToString();
//判断跳页文本框失效
if(RecCount <= 20)
gotoPage.Enabled = false;
TDataBind();//调用数据绑定函数TDataBind()进行数据
绑定运算
}
}
//计算余页
10
public int OverPage()
{
int pages = 0;
if(RecCount%PageSize != 0)
pages = 1;
else
pages = 0;
return pages;
}
//计算余页,防止SQL语句执行时溢出查询范围
public int ModPage()
{
int pages = 0;
if(RecCount%PageSize == 0 && RecCount != 0)
pages = 1;
else
pages = 0;
return pages;
}
/*
*计算总记录的静态函数
*本人在这里使用静态函数的理由是:如果引用的是静态
11
数据或静态函数,连接器会优化生成代码,去掉动态重定位
项(对
海量数据表分页效果更明显)。
*希望大家给予意见、如有不正确的地方望指正。
*/
public static int Calc() //Calc()函数获取总记录数
{
int RecordCount = 0;
SqlCommand MyCmd = new SqlCommand(select count(*)
as co from redheadedfile,MyCon());
SqlDataReader dr = MyCmd.ExecuteReader();
if(dr.Read())
RecordCount = Int32.Parse(dr[co].ToString());
MyCmd.Connection.Close();
return RecordCount;
}
//数据库连接语句(从Web.Config中获取)
public static SqlConnection MyCon()
{
SqlConnection MyConnection = new
SqlConnection(ConfigurationSettings.AppSettings[DSN]);
MyConnection.Open();
12
return MyConnection;
}
//对四个按钮(首页、上一页、下一页、尾页)返回的CommandName值进行操作private void Page_OnClick(object sender, CommandEventArgs e)
{
CurrentPage = (int)ViewState[PageIndex];
//从ViewState中读取页码值保存到CurrentPage变量中进行参数运算
Pages = (int)ViewState[PageCounts];//从ViewState中读取总页参数运算 string cmd = e.CommandName;
switch(cmd)//筛选CommandName
{
case next:
CurrentPage++;
break;
case prev:
CurrentPage--;
break;
case last:
CurrentPage = Pages;
break;
13
default:
CurrentPage = 0;
break;
}
ViewState[PageIndex] = CurrentPage;
//将运算后的CurrentPage变量再次保存至ViewState
TDataBind();//调用数据绑定函数TDataBind()
}
private void TDataBind()
{
CurrentPage = (int)ViewState[PageIndex];
//从ViewState中读取页码值保存到CurrentPage变量中进行按钮失效运算 Pages = (int)ViewState[PageCounts];
//从ViewState中读取总页参数进行按钮失效运算
//判断四个按钮(首页、上一页、下一页、尾页)状态
if (CurrentPage + 1 1)
{
Fistpage.Enabled = true;
Prevpage.Enabled = true;
}
else
{
14
Fistpage.Enabled = false;
Prevpage.Enabled = false;
}
if (CurrentPage == Pages)
{
Nextpage.Enabled = false;
Lastpage.Enabled = false;
}
else
{
Nextpage.Enabled = true;
Lastpage.Enabled = true;
}
//数据绑定到DataList控件
DataSet ds = new DataSet();
//核心SQL语句,进行查询运算(决定了分页的效率:)
SqlDataAdapter MyAdapter = new SqlDataAdapter(Select Top +PageSize+ * from
redheadedfile where id
not in(select top +PageSize*CurrentPage+ id from
redheadedfile order by id asc) order by id asc,MyCon());
MyAdapter.Fill(ds,news);
15
篇三:C#如何读取Excel表格数据并显示到GridView控
件
C#如何读取Excel表格数据并显示到GridView控件
2008/05/06 00:36
近日,有个项目,需要用 Web 形式将 Excel 表格中的
数据导入到数据库中,为了简化问题的解决,现在先将表中
数据导入到 GridView 控件上(
代码如下:
protected void Button1_Click(object sender, EventArgs e)
...{
string filepath=FileUpload1.PostedFile.FileName;
ReadExcel(filepath, gdBom);
}
public void ReadExcel(string sExcelFile,GridView dgBom)
...{
DataTable ExcelTable;
DataSet ds = new DataSet();
//Excel的连接
OleDbConnection objConn = new
OleDbConnection(Provider=Microsoft.Jet.OLEDB.4.0;Data Source= + sExcelFile + ; + Extended Properties=Excel 8.0;);
16
objConn.Open();
DataTable schemaTable =
objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
string tableName =
schemaTable.Rows[0][2].ToString().Trim();//获取 Excel 的
表名,默认值是sheet1
string strSql = select * from [ + tableName + ];
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);OleDbDataAdapter myData = new
OleDbDataAdapter(strSql, objConn);
myData.Fill(ds, tableName);//填充数据
dgBom.DataSource =ds;
dgBom.DataBind();
objConn.Close();
ExcelTable = ds.Tables[tableName];
int iColums = ExcelTable.Columns.Count;//列数
int iRows = ExcelTable.Rows.Count;//行数
//定义二维数组存储 Excel 表中读取的数据
string[,] storedata = new string[iRows, iColums];
for(int i=0;i<ExcelTable.Rows.Count;i++)
17
for (int j = 0; j < ExcelTable.Columns.Count; j++) ...{
//将Excel表中的数据存储到数组
storedata[i, j] = ExcelTable.Rows[i][j].ToString();
}
int excelBom = 0;//记录表中有用信息的行数,有用信息是
指除去表的标题和表的栏目,本例中表的用用信息是从第三
行开始
//确定有用的行数
for (int k = 2; k < ExcelTable.Rows.Count; k++)
if (storedata[k, 1] != )
excelBom++;
if (excelBom == 0)
...{
Response.Write(<script language=javascriptalert('
您导入的表格不合
~')</script);
}
else
...{
//LoadDataToDataBase(storedata,excelBom)//该函数主要
负责将 storedata 中有用的数据写入到数据库中,在此不是
问题的关键省略 }
}
18
运行效果如下图:选择,,,表的路径,点确定后
类别:c# |
上一篇:验证文件上传有效类型的正则表达... 下一篇:C#数值结果表(格式化字符串)
相关文章:
? sun:将gridview控件中数据以指? 怎样将Gridview控件的内容导出| 添加到搜藏 | 分享到i贴吧 | 浏览(1391) | 评论
(7)
定... 为...
用户控件上的GridView如何导? 类型GridView的控件 必须放在... ? 入,...
?
? 使用Gridview空间导出到Excel,Gr... ? ? ASP.net的GridView控件中的数据... ASP.NET 2.0,C#----利用
GridView...
GridView 不使用数据源控件,导? 出...
更多
使用C#读取Word表格数据
读取Word表格数据的方法
1//将读取Word表格封装与方法中。 扩展GridView 控件—支持 Excel ... VB,C# GridView导出到? excel,data...
19
2public string ReadWord(string fileName, int rowIndex, int colIndex)
3{
4 ApplicationClass cls = null;
5 Document doc = null;
6
7 Table table = null;
8 object missing = Missing.Value;
9
10 object path = fileName;
11 cls = new ApplicationClass();
12
13 try
14 {
15 doc = cls.Documents.Open
16(ref path, ref missing, ref missing, ref missing,
17ref missing, ref missing, ref missing, ref missing,
18ref missing, ref missing, ref missing, ref missing,
19ref missing, ref missing, ref missing, ref missing);
20 table = doc.Tables[1];
21 string text = table.Cell(rowIndex,
colIndex).Range.Text.ToString(); 22 text = text.Substring(0,
20
text.Length - 2); //去除尾部的mark
23
24
25
26 return text; } catch (Exception ex) {
27
28
29
30
31 return ex.Message; } finally {
32 if (doc != null)
33doc.Close(ref missing, ref missing, ref missing);
34 cls.Quit(ref missing, ref missing, ref missing);
35 }
36}
这个方法用于读取Word表格中某个单元格的数据。其中
的参数分别为文件名(包括路径),行号,列号。
============================================
由于考虑到代码复用,我将代码写成了一个类。此外,通
过审视代码可以发现,如果要多次读取同一文件中的不同的
单元格数据会造成频繁的打开、关闭Word程序;因此,我
21
将代码进行优化。在我做优化的时候突然想起来ADO.NET的SqlConnection和SqlCommand类。这两个类我常常用做数据库操作,一般用到的方法顺序都是:打开数据库连接,执行数据库查询,关闭数据库连接。我没有使用到两个类,我将这段代码封装于一个类中。使用Open、Close控制Word文档的打开和关闭,使用WordTableRead方法读取表格中的数据。这样对于读取多个单元格中的数据,每次只需要打开、关闭一次Word程序即可,大大的节约了资源的开销和节省了时间,提高的读取效率。此外,对于代码的优化还有可以读取指定表格中数据。下图显示了这个类的结构,代码及相应注释附在图的下方:
class WordTableRead
2{
3 private string fileName;
4 private ApplicationClass cls = null;
5 private Document doc = null;
6 private Table table = null;
7 private object missing = Missing.Value;
8 //Word是否处于打开状态
9 private bool openState;
10
11
22
12 /**//// <summary
13 /// 自定义构造方法
14
15
16
17 /// </summary /// <param name=fileName包含路径的文件名</param public WordTableRead(string
fileName) {
18 this.fileName = fileName;
19 }
20
21
22
23/**//// <summary /// 打开Word文档 /// </summary
24 public void Open()
25 {
26 object path = fileName;
27 cls = new ApplicationClass();
28 try
29 {
30doc = cls.Documents.Open
23
31 (ref path, ref missing, ref missing, ref missing,
32 ref missing, ref missing, ref missing, ref missing,
33 ref missing, ref missing, ref missing, ref missing,
34 ref missing, ref missing, ref missing, ref missing);
35openState = true;
36 }
37 catch
38 {
39openState = false;
40
41
42
43 } } /**//// <summary
44 /// 返回指定单元格中的数据
45 /// </summary
46 /// <param name=tableIndex表格号</param
47 /// <param name=rowIndex行号</param
48 /// <param name=colIndex列号</param
49 /// <returns单元格中的数据</returns
50 public string ReadWord(int tableIndex, int rowIndex, int colIndex)
51 {
24
52 //Give the value to the tow Int32 params.
53
54 try
55 {
56if (openState == true)
57{
58 table = doc.Tables[tableIndex];
59 str
ing text = table.Cell(rowIndex,
colIndex).Range.Text.ToString(); 60 text = text.Substring(0,
text.Length - 2); //去除尾部的mark 61 return text;
62}
25