多表查询返回多个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页,和每页显示多少数据.

拼表名的方法:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 //数据库表名
 2        string[] sendTables;
 3        string[] statusTables;
 4
 5        //拼表名
 6        void GetTableName()
 7ExpandedBlockStart.gifContractedBlock.gif        {
 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++)
16ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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

 

ContractedBlock.gif ExpandedBlockStart.gif 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
 14ExpandedBlockStart.gifContractedBlock.gif{
 15    public class MySqlHelper
 16ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 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)
 20ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 21            string[] strSelect = new string[sendTables.Length];
 22            StringBuilder sbCommand2 = new StringBuilder();
 23            for (int i = 0; i < sendTables.Length; i++)
 24ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 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")
 28ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 29                    sbCommand.Append(" and s.status=" + "\"" + mstatus + "\"");
 30                }

 31                if (mtype == "jobs")
 32ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 33                    sbCommand.Append(" and (d.host!='quickmail6' and d.host!='quickmail7')");
 34                }

 35                else
 36ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 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)
 45ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 46            string[] strSelect = new string[sendTables.Length];
 47            StringBuilder sbCommand2 = new StringBuilder();
 48            for (int i = 0; i < sendTables.Length; i++)
 49ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 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")
 53ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 54                    sbCommand.Append(" and s.status=" + "\"" + mstatus + "\"");
 55                }

 56                if (mtype == "jobs")
 57ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 58                    sbCommand.Append(" and (d.host!='quickmail6' and d.host!='quickmail7')");
 59                }

 60                else
 61ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 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)
 72ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 73            string[] strCount = new string[sendTables.Length];
 74            for (int i = 0; i < sendTables.Length; i++)
 75ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 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")
 78ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 79                    sbCommand.Append(" and s.status=" + "\"" + mstatus + "\"");
 80                }

 81                if (type == "jobs")
 82ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 83                    sbCommand.Append(" and (d.host!='quickmail6' and d.host!='quickmail7')");
 84                }

 85                else
 86ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 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)
 96ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 97            MySqlConnection MyConn = new MySqlConnection(strConn);
 98            try
 99ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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++)
108ExpandedSubBlockStart.gifContractedSubBlock.gif                {
109                    MyCommand.CommandText = strCount[i];
110                    count += Convert.ToInt32(MyCommand.ExecuteScalar().ToString());
111                }

112                return count;
113                CloseConnection(MyConn);
114            }

115            catch (Exception)
116ExpandedSubBlockStart.gifContractedSubBlock.gif            {
117                return 0;
118            }

119        }

120        //多天导出数据.
121        public static DataTable ExportData2(string[] sendTables, string[] statusTables, string user, string domain, string status, string type)
122ExpandedSubBlockStart.gifContractedSubBlock.gif        {
123            DataSet MyDS = new DataSet();
124            DataTable MyTable;
125            try
126ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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++)
139ExpandedSubBlockStart.gifContractedSubBlock.gif                {
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++)
152ExpandedSubBlockStart.gifContractedSubBlock.gif                {
153                    for (int i = 0; i < MyDS.Tables[count].Rows.Count; i++)
154ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
155                        DataRow dr = MyTable.NewRow();
156                        for (int j = 0; j < MyDS.Tables[count].Columns.Count; j++)
157ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
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)
167ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
173ExpandedSubBlockStart.gifContractedSubBlock.gif        {
174            DataTable MyTable ;
175            DataTable MyTable2 = new DataTable();
176            try
177ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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++)
185ExpandedSubBlockStart.gifContractedSubBlock.gif                {
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++)
190ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
191                        dr[j] = MyTable.Rows[index][j];
192                    }

193                    MyTable2.Rows.Add(dr);
194                 }

195                return MyTable2;
196            }

197            catch (Exception)
198ExpandedSubBlockStart.gifContractedSubBlock.gif            {
199                return new DataTable();
200            }

201        }

202        private static void CloseConnection(MySqlConnection MyConn)
203ExpandedSubBlockStart.gifContractedSubBlock.gif        {
204            if (MyConn.State == ConnectionState.Open)
205                MyConn.Close();
206        }

207        private static void OpenConnection(MySqlConnection MyConn)
208ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值