PDF.NET框架操作——工具應用(一)


PDF.NET是個開源的項目其解決UI層(WinForm / Web)控件數據綁定、映射與查詢; BLL層實體對象查詢(OQL);DAL層SQL語句和.NET數據訪問代碼映射(查看  SQL-MAP 原理);由於其工具是VB語言開發,個人將他翻成C#版本,僅供學習和交流,對於初學者和C#初學者有一定能夠幫助;有不足之處大家盡管拍磚,下面進入正題:

  1. 程序界面

  • 大致思路

通過數據庫連接查詢所有表名——》根據表中列名、描述及字段類型生成實體類對應的屬性——》根據項目需求實體類樣式生成文件

  • 所需控件

LookUpEdit(記錄歷史輸入數據)、TextEdit(輸入密碼以掩碼的形式展現)、SimpleButton(觸發操作)、ButtonEdit(選擇文檔輸出目錄)、GridControl(數據展示的容器)、ProgressBar(操作進度條)

  • 后台代碼實現
  1     public partial class runForm : Form
  2     {
  3         public runForm()
  4         {
  5             InitializeComponent();
  6             Load += new EventHandler(runForm_Load);
  7 
  8             //鎖定窗口大小
  9             this.FormBorderStyle = FormBorderStyle.FixedDialog;
 10 
 11             //顯示查詢區域
 12             this.gvTable.ShowFindPanel();
 13         }
 14 
 15         void runForm_Load(object sender, EventArgs e)
 16         {
 17             connFile = GetConfigFilePath("UserHistory.txt");
 18 
 19             //標准格式 "Data Source=10.10.198.242;Initial Catalog=mesbj;User ID=sa;Password=sa
 20             //數據庫地址賦值
 21             DataConnect dc = GetConnect(connFile);
 22             if (dc == null)
 23                 return;
 24             lueDataSource.Text = dc.dataSource;
 25             lueDataBase.Text = dc.dataBase;
 26             lueUser.Text = dc.user;
 27             txtPassWord.Text = dc.passWord;
 28 
 29             lueDataSource.Properties.DataSource = sourcelst;
 30             lueDataBase.Properties.DataSource = baselst;
 31             lueUser.Properties.DataSource = userlst;
 32         }
 33 
 34         /// <summary>
 35         /// 讀取配置文件給界面復制默認值
 36         /// </summary>
 37         /// <returns></returns>
 38         private DataConnect GetConnect(string connPath)
 39         {
 40             DataConnect dc = new DataConnect();
 41             string strcon = File.ReadAllText(connPath, Encoding.UTF8);
 42             string[] str = strcon.Split(';');
 43             for (int i = 0; i < str.Count(); i++)
 44             {
 45                 switch (i)
 46                 {
 47                     case 0:
 48                         dc.dataSource = GetConfig(str[i].Split('=')[1], i);
 49                         break;
 50                     case 1:
 51                         dc.dataBase = GetConfig(str[i].Split('=')[1], i);
 52                         break;
 53                     case 2:
 54                         dc.user = GetConfig(str[i].Split('=')[1], i);
 55                         break;
 56                     case 3:
 57                         dc.passWord = GetConfig(str[i].Split('=')[1], i);
 58                         break;
 59                     case 4:
 60                         OutputPath.Text = GetConfig(str[i].Split('=')[1], i);
 61                         break;
 62                     default:
 63                         break;
 64                 }
 65             }
 66             return dc;
 67         }
 68 
 69         /// <summary>
 70         /// 數據庫連接配置文件
 71         /// </summary>
 72         private string connFile { set; get; }
 73 
 74         /// <summary>
 75         /// 數據庫地址
 76         /// </summary>
 77         private List<string> sourcelst { set; get; }
 78 
 79         /// <summary>
 80         /// 數據庫名稱
 81         /// </summary>
 82         private List<string> baselst { set; get; }
 83 
 84         /// <summary>
 85         /// 用戶
 86         /// </summary>
 87         private List<string> userlst { set; get; }
 88 
 89         /// <summary>
 90         /// 所有表名
 91         /// </summary>
 92         private List<string> tables { set; get; }
 93 
 94         /// <summary>
 95         /// 當前選擇表名
 96         /// </summary>
 97         private string scttable { set; get; }
 98 
 99         /// <summary>
100         /// 讀取=號最后一個值
101         /// </summary>
102         /// <param name="str"></param>
103         /// <returns></returns>
104         private string GetConfig(string str, int i)
105         {
106             string[] con = str.Split(',');
107             switch (i)
108             {
109                 case 0:
110                     sourcelst = new List<string>();
111                     sourcelst.AddRange(con.ToArray());
112                     break;
113                 case 1:
114                     baselst = new List<string>();
115                     baselst.AddRange(con.ToArray());
116                     break;
117                 case 2:
118                     userlst = new List<string>();
119                     userlst.AddRange(con.ToArray());
120                     break;
121                 default:
122                     break;
123             }
124             //獲取最后一項作為默認值
125             string config = con[con.Count() - 1];
126             return config;
127         }
128 
129         /// <summary>
130         /// 讀取文件路徑
131         /// </summary>
132         /// <param name="fileName"></param>
133         /// <returns></returns>
134         private string GetConfigFilePath(string fileName)
135         {
136             string currenctDir = AppDomain.CurrentDomain.BaseDirectory;//存放路徑
137             string configFile = System.IO.Path.Combine(currenctDir, fileName);
138             return configFile;
139         }
140 
141         /// <summary>
142         /// lookupEdit 添加控制
143         /// </summary>
144         /// <param name="sender"></param>
145         /// <param name="e"></param>
146         private void lueDataSource_ProcessNewValue(object sender, ProcessNewValueEventArgs e)
147         {
148             LookUpEdit lue = sender as LookUpEdit;
149             AddDataSurce(lue);
150         }
151 
152         /// <summary>
153         /// LookUpEdit 輸入字段添加賦值
154         /// </summary>
155         /// <param name="lue">輸入字段</param>
156         private void AddDataSurce(LookUpEdit lue)
157         {
158             string value = lue.Text;
159             if (string.IsNullOrEmpty(value))
160                 return;
161             (lue.Properties.DataSource as List<string>).Add(value);
162         }
163 
164         /// <summary>
165         /// 連接
166         /// </summary>
167         /// <param name="sender"></param>
168         /// <param name="e"></param>
169         private void btnConnect_Click(object sender, EventArgs e)
170         {
171             DataConnect dc = new DataConnect();
172             dc.dataSource = lueDataSource.Text;
173             dc.dataBase = lueDataBase.Text;
174             dc.user = lueUser.Text;
175             dc.passWord = txtPassWord.Text;
176 
177             SqlHelper sl = new SqlHelper(dc);
178 
179             DataTable dt = SqlHelper.GetTables(@"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'");
180 
181             List<TableName> lst = new List<TableName>();
182 
183             tables = new List<string>();
184             foreach (DataRow item in dt.Rows)
185             {
186                 tables.Add(item[0].ToString());
187                 lst.Add(new TableName() { name = item[0].ToString() });
188             }
189             gcTable.DataSource = lst;
190 
191             WriteConninfo();
192         }
193 
194         /// <summary>
195         /// 寫入連接配置
196         /// </summary>
197         private void WriteConninfo()
198         {
199             //數據庫地址
200             string strconn = @"Data Source=" + WriteConninfo(lueDataSource, sourcelst) + ";Initial Catalog=" + WriteConninfo(lueDataBase, baselst) +
201                 ";User ID=" + WriteConninfo(lueUser, userlst) + ";Password=" + txtPassWord.Text + ";OutputPath=" + OutputPath.Text;
202             File.WriteAllText(connFile, strconn);
203         }
204 
205         private string WriteConninfo(LookUpEdit lup, List<string> lst)
206         {
207             lst = new List<string>();
208             lst = lup.Properties.DataSource as List<string>;
209             if (lst.Contains(lup.Text))
210             {
211                 lst.Remove(lup.Text);
212                 lst.Add(lup.Text);
213             }
214             string conn = "";
215             foreach (string item in lst)
216             {
217                 conn = conn + item + ",";
218             }
219             return conn.TrimEnd(',');
220         }
221 
222         /// <summary>
223         /// table 表選中事件,查詢表中所有字段
224         /// </summary>
225         /// <param name="sender"></param>
226         /// <param name="e"></param>
227         private void gvTable_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
228         {
229             TableName dv = gvTable.GetRow(e.FocusedRowHandle) as TableName;
230             if (dv == null)
231                 return;
232             string table = dv.name;
233             dv.template = true;
234 
235             //DataTable dt = SqlHelper.GetTables("Select name from syscolumns Where ID=OBJECT_ID('" + table + "') ");
236             //gcColumn.DataSource = dt;
237         }
238 
239         /// <summary>
240         /// 選擇輸出目錄
241         /// </summary>
242         /// <param name="sender"></param>
243         /// <param name="e"></param>
244         private void OutputPath_ButtonClick(object sender, ButtonPressedEventArgs e)
245         {
246             FolderBrowserDialog fbd = new FolderBrowserDialog();
247 
248             if (fbd.ShowDialog() == DialogResult.OK)
249             {
250                 this.OutputPath.Text = fbd.SelectedPath; ;
251             }
252         }
253 
254         /// <summary>
255         /// 實體類生成
256         /// </summary>
257         /// <param name="sender"></param>
258         /// <param name="e"></param>
259         private void btnMakeFile_Click(object sender, EventArgs e)
260         {
261             if (tables == null || tables.Count == 0)
262             {
263                 MessageBox.Show("請先連接數據庫", "實體類生成器");
264                 return;
265             }
266 
267             if (!Directory.Exists(OutputPath.Text))
268             {
269                 MessageBox.Show("指定的代碼輸出目錄" + OutputPath.Text + "不存在,請在屬性窗口選擇有效的路徑。", "實體類生成器");
270                 return;
271             }
272 
273             if (rbtnSelectOneTable.Checked)
274             {
275                 tables = new List<string>();
276                 foreach (TableName item in gvTable.DataSource as List<TableName>)
277                 {
278                     if (item.template)
279                     {
280                         tables.Add(item.name);
281                     }
282                 }
283             }
284 
285             PrgBarMakeFile.Maximum = tables.Count;
286 
287             txtMakeLog.Text = "";
288             if (string.IsNullOrEmpty(OutputPath.Text))
289             {
290                 MessageBox.Show("OutputPath路徑不能為空!", "實體類生成器");
291                 return;
292             }
293 
294             int count = 0;
295             foreach (string item in tables)
296             {
297                 count++;
298                 txtMakeLog.AppendText("正在生成第" + count + " 個實體類文件: " + OutputPath.Text + "\\" + item + ".cs" + "\r\n");
299                 PrgBarMakeFile.Value = count;
300                 CreatModelCode(item);
301             }
302             MessageBox.Show("生成 " + count + " 個實體類文件!", "實體類生成器");
303 
304             WriteConninfo();
305         }
306 
307         /// <summary>
308         /// 創建實體類文件內容
309         /// </summary>
310         /// <param name="tableNam"></param>
311         private void CreatModelCode(string tableName)
312         {
313             //表結構主鍵
314             string primaryKey = "";
315             //列名集合
316             string propertyNames = "";
317 
318             DataTable dt = SqlHelper.GetTables("select top 0 * from " + tableName);
319 
320             if (dt.PrimaryKey != null && dt.PrimaryKey.Count() > 0)
321             {
322                 primaryKey = dt.PrimaryKey[0].ToString();
323             }
324 
325             foreach (DataColumn item in dt.Columns)
326             {
327                 propertyNames = propertyNames + ",\"" + item.ColumnName + "\"";
328             }
329             propertyNames = propertyNames.TrimStart(',');
330 
331             StringBuilder sb = new StringBuilder();
332             sb.AppendLine("using System;");
333             //轉化配置處理
334             sb.AppendLine("using System.Collections.Generic;");
335             sb.AppendLine("using System.Text;");
336 
337             sb.AppendLine();
338 
339             //轉化配置處理
340             sb.AppendLine("namespace Com.Wisdom.VO");
341             sb.AppendLine("{");
342 
343             sb.AppendLine(" [Serializable()]");
344 
345             //繼承基類,轉化配置處理
346             sb.AppendLine(" public partial class " + tableName + " : WsdGenericDto");
347 
348             sb.AppendLine(" {");
349 
350             //構造函數
351             sb.AppendLine("     public " + tableName + "()");
352             sb.AppendLine("     {");
353             sb.AppendLine("             TableName = " + "\"" + tableName + "\";");
354             sb.AppendLine("             EntityMap=EntityMapType.Table;");
355             sb.AppendLine("             //IdentityName = \"標識字段名\";");
356             sb.AppendLine();
357             sb.AppendLine("             //PrimaryKeys.Add(\"主鍵字段名\")");
358 
359             sb.AppendLine("     PrimaryKeys.Add(" + "\"" + primaryKey + "\")");
360             sb.AppendLine();
361             sb.AppendLine("     }");
362 
363             sb.AppendLine("         protected override void SetFieldNames()");
364             sb.AppendLine("         {");
365             sb.AppendLine("            PropertyNames = new string[] { " + propertyNames + "};");
366             sb.AppendLine("         }");
367 
368             sb.AppendLine();
369             sb.AppendLine();
370 
371             foreach (DataColumn item in dt.Columns)
372             {
373                 sb.AppendLine();
374                 sb.AppendLine("         /// <summary>");
375                 sb.AppendLine("         /// " + GetDescribe(tableName, item.ColumnName));
376                 sb.AppendLine("         /// </summary>");
377                 sb.AppendLine("         public " + GetDataType(item) + item.ColumnName);
378                 sb.AppendLine("         {");
379                 sb.AppendLine("             get{return getProperty<" + GetDataType(item) + ">(\"" + item.ColumnName + "\");}");
380                 sb.AppendLine("             set{setProperty(\"" + item.ColumnName + "\",value " + GetMaxValue(item) + ");}");
381                 sb.AppendLine("         }");
382             }
383 
384             sb.AppendLine();
385             sb.AppendLine();
386 
387             sb.AppendLine(" }");
388 
389             sb.AppendLine("}");
390 
391             string configFile = OutputPath.Text + "\\" + tableName + ".cs";
392             File.WriteAllText(configFile, sb.ToString());
393         }
394 
395         /// <summary>
396         /// 獲取列名描述
397         /// </summary>
398         /// <param name="table"></param>
399         /// <param name="column"></param>
400         /// <returns></returns>
401         private string GetDescribe(string table, string column)
402         {
403             string describe = "";
404             DataTable dt = SqlHelper.GetTables(@"SELECT value FROM   ::fn_listextendedproperty(NULL,'user','dbo','table','" + table + "\'" + ",'column',NULL) WHERE objname='" + column + "\'");
405             if (dt != null && dt.Rows != null && dt.Rows.Count > 0)
406             {
407                 describe = dt.Rows[0].ItemArray[0].ToString();
408             }
409             return describe;
410         }
411 
412         /// <summary>
413         /// 根據表中最大值,處理
414         /// </summary>
415         /// <param name="column"></param>
416         /// <returns></returns>
417         private string GetMaxValue(DataColumn column)
418         {
419             if (column.MaxLength > 0)
420             {
421                 return "," + column.MaxLength.ToString();
422             }
423             else return "";
424         }
425 
426         /// <summary>
427         /// 判斷表中列是否為空處理,范圍屬性類型
428         /// </summary>
429         /// <param name="column"></param>
430         /// <returns></returns>
431         private string GetDataType(DataColumn column)
432         {
433             if (column.AllowDBNull && column.DataType.IsValueType)
434             {
435                 return column.DataType + "? ";//表字段為空,類屬性中添加?
436             }
437             else
438             {
439                 return column.DataType.ToString() + " ";
440             }
441         }
442     }


SqlHelper代碼

 1     public class SqlHelper
 2     {
 3         private static string strconn;
 4 
 5         public SqlHelper(DataConnect dc)
 6         {
 7             strconn = @"data source=" + dc.dataSource + ";database=" + dc.dataBase + ";user id=" + dc.user + ";password=" + dc.passWord;
 8         }
 9 
10         public static DataTable GetTables(string sql)
11         {
12             DataTable dt = new DataTable();
13             try
14             {
15                 using (SqlConnection cnn = new SqlConnection(strconn))
16                 {
17                     cnn.Open();
18                     using (SqlCommand cmd = cnn.CreateCommand())
19                     {
20                         cmd.CommandText = sql;//執行sql
21                         DataSet dataset = new DataSet();
22                         SqlDataAdapter dapter = new SqlDataAdapter(cmd);
23                         dapter.FillSchema(dataset, SchemaType.Source);
24                         dapter.Fill(dataset);//將dataset添加到SqlDataAdapter容器中
25                         dt = dataset.Tables[0];
26                     }
27                 }
28             }
29             catch (Exception e)
30             {
31                 MessageBox.Show(e.Message);
32             }
33             return dt;
34         }
35     }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM