多表查询返回多个DataTable,合并到一个Table中.
??? 本文意在說明一下DataSet.Merge(Table)和多個Table合并到一個里面的操作.因為是新手,代碼肯定有很多問題,歡迎大家批評指正.??? 如果你有更好的解決方案,請告訴我.謝謝.
先說一下需求:ASP.NET+MYSQL
???
??? 查詢連續N天的郵件發送日志.在庫里,表是按天存放的,表名也是按天命名的.例如:mailsend20090302,mailstatus20090302,兩張表有ID關聯.為了調試簡單,我把日期直接寫死.在點查詢按鈕之后,首先根據得到的日期拼湊表名,得到兩個表名數組,然后調用MySqlHelper類里的方法,下面是數據庫操作的代碼.因為用的是MySql,所以需要添加一個MySql.Data.dll引用.另外前兩天看過string 與stringbuilder之間的區別,所以拼sql 時用了stringbuilder,然后用其ToString()賦給數組.
對數據做點說明:
mstatus:all,success,failure
mtype:jobs,email
pageindex,pagesize為分頁控件的屬性,分別表示第N頁,和每頁顯示多少數據.
拼表名的方法:
?
Code?1?//數據庫表名
?2????????string[]?sendTables;
?3????????string[]?statusTables;
?4
?5????????//拼表名
?6????????void?GetTableName()
?7????????{
?8????????????string?dateFrom?=?"2009-01-07";
?9????????????string?dateTo?=?"2009-01-10";
10????????????TimeSpan?ts?=?Convert.ToDateTime(dateTo)?-?Convert.ToDateTime(dateFrom);
11????????????int?counter?=?ts.Days?+?1;
12????????????sendTables?=?new?string[counter];
13????????????statusTables?=?new?string[counter];
14???????????
15????????????for?(int?i?=?0;?i?<?counter;?i++)
16????????????{
17????????????????sendTables[i]?=?"mailsend"?+?Convert.ToDateTime(dateFrom).AddDays(i).ToString("yyyyMMdd");
18????????????????statusTables[i]?=?"mailstatus"?+?Convert.ToDateTime(dateFrom).AddDays(i).ToString("yyyyMMdd");
19????????????}
20????????????
21????????}
22
?
Code??1using?System;
??2using?System.Data;
??3using?System.Configuration;
??4using?System.Web;
??5using?System.Web.Security;
??6using?System.Web.UI;
??7using?System.Web.UI.WebControls;
??8using?System.Web.UI.WebControls.WebParts;
??9using?System.Web.UI.HtmlControls;
?10using?MySql.Data.MySqlClient;
?11using?System.Text;
?12
?13namespace?MultiTable
?14{
?15????public?class?MySqlHelper
?16????{
?17????????private?static?string?strConn?=?ConfigurationManager.AppSettings["connStr"].ToString();
?18????????//多天查?詢?sendTables,statusTables,muser,mdomain,mstatus,pageindex,pagesize?
?19????????private?static?string[]?PrepareSelectString2(string[]?sendTables,?string[]?statusTables,?string?muser,?string?mdomain,?string?mstatus,?string?mtype,?int?pageindex,?int?pagesize)
?20????????{
?21????????????string[]?strSelect?=?new?string[sendTables.Length];
?22????????????StringBuilder?sbCommand2?=?new?StringBuilder();
?23????????????for?(int?i?=?0;?i?<?sendTables.Length;?i++)
?24????????????{
?25????????????????StringBuilder?sbCommand?=?new?StringBuilder(@"select?d.rundate,d.runtime,s.status,s.failcode?from?"?+?sendTables[i]?+?"?as?d,"?+?statusTables[i]?+?"?as?s?"?+
?26????????????????????????????????????"where?d.id=s.id?and?d.maildomain="?+?"\""?+?mdomain?+?"\""?+?"?and?d.mailuser="?+?"\""?+?muser?+?"\"");
?27????????????????if?(mstatus?!=?"all")
?28????????????????{
?29????????????????????sbCommand.Append("?and?s.status="?+?"\""?+?mstatus?+?"\"");
?30????????????????}
?31????????????????if?(mtype?==?"jobs")
?32????????????????{
?33????????????????????sbCommand.Append("?and?(d.host!='quickmail6'?and?d.host!='quickmail7')");
?34????????????????}
?35????????????????else
?36????????????????{
?37????????????????????sbCommand.Append("?and?(d.host='quickmail6'?or?d.host='quickmail7')");
?38????????????????}
?39????????????????sbCommand.Append("order?by?d.runtime??asc");
?40????????????????strSelect[i]?=?sbCommand.ToString();
?41????????????}
?42????????????return?strSelect;
?43????????}
?44????????private?static?string[]?PrepareExportString2(string[]?sendTables,?string[]?statusTables,?string?muser,?string?mdomain,?string?mstatus,?string?mtype)
?45????????{
?46????????????string[]?strSelect?=?new?string[sendTables.Length];
?47????????????StringBuilder?sbCommand2?=?new?StringBuilder();
?48????????????for?(int?i?=?0;?i?<?sendTables.Length;?i++)
?49????????????{
?50????????????????StringBuilder?sbCommand?=?new?StringBuilder(@"select?cast(d.rundate?as?char(10))?as?rundate,d.runtime,s.status,s.failcode?from?"?+?sendTables[i]?+?"?as?d,"?+?statusTables[i]?+?"?as?s?"?+
?51????????????????????????????????????"where?d.id=s.id?and?d.maildomain="?+?"\""?+?mdomain?+?"\""?+?"?and?d.mailuser="?+?"\""?+?muser?+?"\"");
?52????????????????if?(mstatus?!=?"all")
?53????????????????{
?54????????????????????sbCommand.Append("?and?s.status="?+?"\""?+?mstatus?+?"\"");
?55????????????????}
?56????????????????if?(mtype?==?"jobs")
?57????????????????{
?58????????????????????sbCommand.Append("?and?(d.host!='quickmail6'?and?d.host!='quickmail7')");
?59????????????????}
?60????????????????else
?61????????????????{
?62????????????????????sbCommand.Append("?and?(d.host='quickmail6'?or?d.host='quickmail7')");
?63????????????????}
?64????????????????sbCommand.Append("?order?by?d.rundate,d.runtime?asc?");
?65????????????????strSelect[i]?=?sbCommand.ToString();
?66????????????}?????????
?67????????????return?strSelect;
?68????????}
?69????????//多天
?70????????//統計數量?
?71????????private?static?string[]?PrepareCountString2(string[]?sendTables,?string[]?statusTables,?string?muser,?string?mdomain,?string?mstatus,?string?type)
?72????????{
?73????????????string[]?strCount?=?new?string[sendTables.Length];
?74????????????for?(int?i?=?0;?i?<?sendTables.Length;?i++)
?75????????????{
?76????????????????StringBuilder?sbCommand?=?new?StringBuilder(@"select?count(d.id)?from?"?+?sendTables[i]?+?"?as?d,"?+?statusTables[i]?+?"?as?s?where?d.id=s.id?and?d.maildomain="?+?"\""?+?mdomain?+?"\""?+?"?and?d.mailuser="?+?"\""?+?muser?+?"\"");
?77????????????????if?(mstatus?!=?"all")
?78????????????????{
?79????????????????????sbCommand.Append("?and?s.status="?+?"\""?+?mstatus?+?"\"");
?80????????????????}
?81????????????????if?(type?==?"jobs")
?82????????????????{
?83????????????????????sbCommand.Append("?and?(d.host!='quickmail6'?and?d.host!='quickmail7')");
?84????????????????}
?85????????????????else
?86????????????????{
?87????????????????????sbCommand.Append("?and?(d.host='quickmail6'?or?d.host='quickmail7')");
?88????????????????}
?89????????????????strCount[i]?=?sbCommand.ToString();
?90????????????}
?91????????????return?strCount;
?92????????}
?93????????//多天數量統計string[]?PrepareCountString(string[]?sendTable,?string[]?statusTables,?string?muser,?string?mdomain,?string?mstatus,?string?type)
?94
?95????????public?static?int?GetCount2(string[]?sendTables,?string[]?statusTables,?string?user,?string?domain,?string?status,?string?type)
?96????????{
?97????????????MySqlConnection?MyConn?=?new?MySqlConnection(strConn);
?98????????????try
?99????????????{
100????????????????OpenConnection(MyConn);
101????????????????MySqlCommand?MyCommand?=?new?MySqlCommand();
102????????????????MyCommand.Connection?=?MyConn;
103????????????????MyCommand.CommandType?=?CommandType.Text;
104????????????????string[]?strCount?=?PrepareCountString2(sendTables,?statusTables,?user,?domain,?status,?type);
105????????????????int?count?=?0;
106????????????????//將每個表里數據的數量加起來得到總數.
107????????????????for?(int?i?=?0;?i?<?strCount.Length;?i++)
108????????????????{
109????????????????????MyCommand.CommandText?=?strCount[i];
110????????????????????count?+=?Convert.ToInt32(MyCommand.ExecuteScalar().ToString());
111????????????????}
112????????????????return?count;
113????????????????CloseConnection(MyConn);
114????????????}
115????????????catch?(Exception)
116????????????{
117????????????????return?0;
118????????????}
119????????}
120????????//多天導出數據.
121????????public?static?DataTable?ExportData2(string[]?sendTables,?string[]?statusTables,?string?user,?string?domain,?string?status,?string?type)
122????????{
123????????????DataSet?MyDS?=?new?DataSet();
124????????????DataTable?MyTable;
125????????????try
126????????????{
127????????????????MySqlConnection?MyConn?=?new?MySqlConnection(strConn);
128????????????????OpenConnection(MyConn);
129????????????????MySqlCommand?MyCommand?=?new?MySqlCommand();
130????????????????MyCommand.Connection?=?MyConn;
131????????????????MyCommand.CommandType?=?CommandType.Text;
132????????????????MyCommand.CommandTimeout?=?180;
133????????????????MySqlDataAdapter?MyAdapter?=?new?MySqlDataAdapter();
134????????????????string[]?strCommand?=?PrepareExportString2(sendTables,?statusTables,?user,?domain,?status,?type);
135????????????????string[]?tableName?=?new?string[sendTables.Length];
136
137????????????????//按日期取出數據,分別存放到DataSet的表中.
138????????????????for?(int?i?=?0;?i?<?strCommand.Length;?i++)
139????????????????{
140????????????????????MyCommand.CommandText?=?strCommand[i];
141????????????????????MyAdapter.SelectCommand?=?MyCommand;
142????????????????????tableName[i]?=?"Log"?+?i.ToString();
143????????????????????MyAdapter.Fill(MyDS,?tableName[i]);
144????????????????????MyDS.Merge(MyDS.Tables[i]);
145????????????????}???????????????
146????????????????//復制表結構.
147????????????????MyTable?=?new?DataTable();
148????????????????MyTable?=?MyDS.Tables[0].Clone();
149????????????????
150????????????????//將DataSet中多個表的數據合并到一個新表里.
151????????????????for?(int?count?=?0;?count?<?MyDS.Tables.Count?;?count++)
152????????????????{
153????????????????????for?(int?i?=?0;?i?<?MyDS.Tables[count].Rows.Count;?i++)
154????????????????????{
155????????????????????????DataRow?dr?=?MyTable.NewRow();
156????????????????????????for?(int?j?=?0;?j?<?MyDS.Tables[count].Columns.Count;?j++)
157????????????????????????{
158????????????????????????????dr[j]?=?MyDS.Tables[count].Rows[i][j];
159????????????????????????}
160????????????????????????MyTable.Rows.Add(dr);????????????????????????
161????????????????????}????????????????????
162????????????????}
163????????????????CloseConnection(MyConn);
164????????????????return?MyTable;
165????????????}
166????????????catch?(Exception)
167????????????{
168????????????????return?new?DataTable();
169????????????}
170????????}
171????????//多天查詢數據.
172????????public?static?DataTable?GetData2(string[]?sendTables,?string[]?statusTables,?string?user,?string?domain,?string?status,?string?type,?int?pageindex,?int?pagesize)
173????????{
174????????????DataTable?MyTable?;
175????????????DataTable?MyTable2?=?new?DataTable();
176????????????try
177????????????{
178????????????????//取出所有數據到一張表里.
179????????????????MyTable?=?new?DataTable();
180????????????????MyTable?=?ExportData2(sendTables,?statusTables,?user,?domain,?status,?type);
181
182????????????????//拿出(pageindex-1)*pagesize--pageindex*pagesize的數據.
183????????????????MyTable2=?MyTable.Clone();
184????????????????for?(int?i?=?0;?i?<?pagesize;?i++)
185????????????????{
186????????????????????int?index?=?i?+?pagesize?*?(pageindex?-?1);
187????????????????????DataRow?dr?=?MyTable2.NewRow();
188????????????????????//MyDS.Tables[0].NewRow();
189????????????????????for?(int?j?=?0;?j?<?MyTable.Columns.Count;?j++)
190????????????????????{
191????????????????????????dr[j]?=?MyTable.Rows[index][j];
192????????????????????}
193????????????????????MyTable2.Rows.Add(dr);
194?????????????????}
195????????????????return?MyTable2;
196????????????}
197????????????catch?(Exception)
198????????????{
199????????????????return?new?DataTable();
200????????????}
201????????}
202????????private?static?void?CloseConnection(MySqlConnection?MyConn)
203????????{
204????????????if?(MyConn.State?==?ConnectionState.Open)
205????????????????MyConn.Close();
206????????}
207????????private?static?void?OpenConnection(MySqlConnection?MyConn)
208????????{
209????????????if?(MyConn.State?==?ConnectionState.Closed)
210????????????????MyConn.Open();
211????????}
212????}
213
214}
215
?
?
轉載于:https://www.cnblogs.com/zhangkun-w/archive/2009/03/11/1408697.html
總結
以上是生活随笔為你收集整理的多表查询返回多个DataTable,合并到一个Table中.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dubbo 注册中心zookeeper
- 下一篇: protocol buffer使用小例