本文意在说明一下DataSet.Merge(Table)和多个Table合并到一个里面的操作.因为是新手,代码肯定有很多问题,欢迎大家批评指正.
先说一下需求:ASP.NET+MYSQL
查询连续N天的邮件发送日志.在库里,表是按天存放的,表名也是按天命名的.例如:send20090302,status20090302,两张表有ID关联.为了调试简单,我把日期直接写死.在点查询按钮之后,首先根据得到的日期拼凑表名,得到两个表名数组,然后调用MySqlHelper类里的方法,下面是数据库操作的代码.因为用的是MySql,所以需要添加一个MySql.Data.dll引用.另外前两天看过string 与stringbuilder之间的区别,所以拼sql 时用了stringbuilder,然后用其ToString()赋给数组.
本文意在说明一下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
1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Web;
5
using System.Web.Security;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
using System.Web.UI.WebControls.WebParts;
9
using System.Web.UI.HtmlControls;
10
using MySql.Data.MySqlClient;
11
using System.Text;
12
13
namespace 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端