多年前寫的一個Access實體類生產工具

来源:http://www.cnblogs.com/gfjin/archive/2017/12/23/8093122.html
-Advertisement-
Play Games

偶爾翻到以前寫的小玩意,數據表實體類生成!只寫了Access資料庫,等將來有時間試著看看寫一個相容市面主流資料庫的! 代碼如下: static class Program { /// <summary> /// 應用程式的主入口點。 /// </summary> [STAThread] static ...


偶爾翻到以前寫的小玩意,數據表實體類生成!只寫了Access資料庫,等將來有時間試著看看寫一個相容市面主流資料庫的!

代碼如下:

 static class Program
    {
        /// <summary>
        /// 應用程式的主入口點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

下麵是主窗體代碼:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        #region 全部變數定義
        bool Canmove = false;
        Point Pf;
       // string ConnectionString = "";
        #endregion
        void WriteLog(string logstr)
        {
            textBox2.Text += logstr+"\r\n";
        }
        #region 測試資料庫是否能連上
        void TestConnection(string str)
        {
            using (OleDbConnection con = new OleDbConnection(str))
            {
                textBox2.ResetText();
                try
                {
                    WriteLog("嘗試打開資料庫鏈接......");
                    con.Open();
                    WriteLog("資料庫鏈接測試成功!");
                }
                catch (Exception ex)
                {
                    WriteLog("資料庫鏈接測試失敗:"+ex.Message);
                }
                finally
                {
                    WriteLog("關閉資料庫鏈接....");
                    con.Close();
                }
            }

        }
        #endregion
        #region 取得資料庫的表名
        string[] GetTableNames(string str)
        {
            using (OleDbConnection con = new OleDbConnection(str))
            {
                DataTable dt = new DataTable();
               
                    try
                    {
                        con.Open();
                        WriteLog("開始從資料庫獲得所有表名!");
                        dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "table" });
                        int n = dt.Rows.Count;
                        string[] strTable = new string[n];
                        int m = dt.Columns.IndexOf("TABLE_NAME");
                        for (int i = 0; i < n; i++)
                        {
                            DataRow m_DataRow = dt.Rows[i];
                            strTable[i] = m_DataRow.ItemArray.GetValue(m).ToString();
                        }
                        WriteLog("成功取得所有表名!");
                        return strTable;
                       
                    }
                    catch (Exception ex)
                    {
                        WriteLog("獲取表名出錯:"+ex.Message);
                        return null;
                    }
                    finally
                    {
                        con.Close();
                        dt.Dispose();
                    }
                }
           
        }
        #endregion
        #region 根據表名取得表中每個欄位及對應數據類型
        Dictionary<string ,string > GetCoulmNams(string constr,string TableName)
        {
            using (OleDbConnection con = new OleDbConnection(constr))
            {
                DataTable dt = new DataTable();
                try
                {
                    WriteLog("根據表名稱獲取所有欄位及其對應的數據類型!");
                    con.Open();
                  
                    dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new Object[] { null, null, TableName, null });
                   // dataGridView1.DataSource = dt;
                    int n = dt.Rows.Count;
                    Dictionary<string, string> CoulnmsInfo = new Dictionary<string, string>();
                    int m = dt.Columns.IndexOf("COLUMN_NAME");
                    int j = dt.Columns.IndexOf("DATA_TYPE");
                   
                    for ( int i = 0; i < n; i++)
                    {
                        DataRow m_DataRow = dt.Rows[i];
                        CoulnmsInfo.Add(m_DataRow.ItemArray.GetValue(m).ToString(),GetType((int)m_DataRow.ItemArray.GetValue(j)));
                        WriteLog("獲取欄位" + m_DataRow.ItemArray.GetValue(m).ToString() + "的類型碼成功!");
                    }
                    return CoulnmsInfo;
                }
                catch (Exception ex)
                {
                    WriteLog("獲取欄位類型出錯:"+ex.Message);
                    return null;
                }
                finally
                {
                    con.Close();
                    dt.Dispose();
                }
            }
        }
#endregion
        #region 判斷欄位是否為主鍵
        bool IsprimaryKeys(string tbname,string Name)
        {
            OleDbConnection connection = new OleDbConnection(textBox1.Text.Trim());
            connection.Open();
           // DataTable schemaColumns = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new string[] { null, null,tbname, null });
            DataTable primaryKeys = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, new string[] { null, null, tbname });
            connection.Close();
            int j = -1;
            foreach (DataRow row in primaryKeys.Rows)
            {
                string fname=row["COLUMN_NAME"].ToString();
                if (fname  == Name)
                {
                    j++;
                }
                            
             }
            if (j>=0)
            { return true; }
            else
            {
                return false;
            }
           
        }
        #endregion
        #region 資料庫類型與C#中類型轉換
        string  GetType(int num)
        {
          
            switch (num)
            {
              
                case 2:
                    return "Int16";
                case 3:
                    return "int";
                case 4:
                    return "Single";
                   
                case 5:
                    return "Double";
                case 6:
                case 131:
                    return "decimal";
                case 7:
                    return "DateTime";
                case 11:
                    return "bool";

                case 18:
                    return "byte";
                case 130:
                    return "string";
                case 128:
                    return "Binary";
                case 129:
                    return "char";
                case 0:
                case 8: 
                case 9:
                case 10:
                case 12:
                case 13:
                case 14:
                case 15:
                case 16:
                case 17:
                case 19:
                case 20:
                case 21:
                case 64:
                case 72:
                case 132:
                case 133:
                case 134:
                case 135:
                case 136:
                case 138:
                case 139:
                case 200:
                case 203:
                case 204:
                case 205:
                    return "";

                default: return null ;
                   
                   
            }
         
        }
       #endregion
        #region 寫文件
        void WriteFile(string NameSpaces,string FileName1,string FileName2,IDbConnection dbconnect)
        {
            if (File.Exists(FileName1  + ".cs"))
            {
                File.Delete(FileName1 + ".cs");
            }
            if (File.Exists(FileName2 + ".cs"))
            {
                File.Delete(FileName2 + ".cs");
            }
            WriteLog("創建文件!");
            FileInfo f = new FileInfo(FileName1 + ".cs");
            FileInfo f1=new FileInfo (FileName2 + ".cs");
            StreamWriter sw1 = f1.AppendText();
            StreamWriter sw = f.AppendText();
            try
            {
                WriteLog("一.寫文件頭:");
                WriteLog("1.寫DB類文件頭!");
                sw1.WriteLine("using System.Data;");
                sw1.WriteLine("using System.Data.Linq;");
                sw1.WriteLine("using System.Data.OleDb;");
                sw1.WriteLine("using System.Diagnostics;");
                sw1.WriteLine("namespace "+NameSpaces );
                sw1.WriteLine("{");
                sw1.WriteLine("public class DB");
                sw1.WriteLine("{");
                sw1.WriteLine("DataContext dc;");
                WriteLog("2.寫實體類文件頭!");
                sw.WriteLine("using System.Data.Linq.Mapping;");
                sw.WriteLine("namespace\t"+NameSpaces );
                sw.WriteLine ("{");
                //一下根據表生產對應的類,根據表中的欄位生產對應屬性;
                string[] tables = GetTableNames(textBox1.Text.Trim());
                int l = 1;
                WriteLog("二.寫文件內容:");
                foreach (string str in tables)
                {
                    WriteLog("開始寫第" + l + "張表("+str+")的實體類!");
                               
                    //根據表明寫類名
                    sw.WriteLine("[Table (Name=\""+str+"\")]");
                    sw.WriteLine("public class " + str);
                    sw.WriteLine("{");
                    Dictionary<string, string> di = GetCoulmNams(textBox1.Text, str);
                    foreach (KeyValuePair<string, string> value in di)
                    {
                       

                        WriteLog("開始寫欄位:" + value.Key );
                        if (IsprimaryKeys(str, value.Key) == true)
                        {
                            sw.WriteLine("[Column(IsPrimaryKey =true)]");
                        }
                        else
                        {
                            sw.WriteLine("[Column]");
                        }
                        sw.WriteLine("public " + value.Value + " " + value.Key + "{get;set;}");
                                         

                    }
                    sw.WriteLine("}");
                    WriteLog("寫第" + l + "張表的申明!");
                    sw1.WriteLine("public Table<" + str + ">" + str + ";");
                    l++;      

                }
               

                WriteLog("寫DB類的初始化方法!");
                sw1.WriteLine("public DB(IDbConnection con) ");
                sw1.WriteLine("{");
                sw1.WriteLine("dc = new DataContext(con);");
                int n=1;
                foreach(string str in tables)
                {
                    WriteLog("建立第" + n + "張表的Object對象!");
                    sw1.WriteLine(str +"=dc.GetTable<"+str+">();");
                    n++;
                }
                WriteLog("三.寫文件尾:");
                sw.WriteLine("}");
                sw1.WriteLine("}");
                sw1.WriteLine("}");
                sw1.WriteLine("}");
                WriteLog("生成文件成功!");
                ProcessStartInfo psi = new ProcessStartInfo();
                psi.FileName = "explorer";
                psi.Arguments = "/e,/select," + Application.StartupPath + FileName1+".cs";
                Process.Start(psi);
              

            }
                catch (Exception ex)
            {
                    WriteLog("生成文件發生錯誤:"+ex.Message);
             }
            finally
            {
                sw.Close();
                sw1.Close();
            }
        }

        #endregion
        #region 測試鏈接按鈕單擊事件
        private void button1_Click(object sender, EventArgs e)
        {
            WriteLog("測試鏈接按鈕單擊");
            TestConnection(textBox1.Text.Trim());
        }
        #endregion
        #region 生成.cs文件按鈕單擊事件
        private void button2_Click(object sender, EventArgs e)
        {
            textBox2.ResetText();
            WriteLog("生成.cs文件按鈕單擊");
            string namespaces = Interaction.InputBox("請輸入命名空間!", "輸入命名空間", "gaofajin",Control.MousePosition.X -200,Control.MousePosition.Y-100);
            if (namespaces.Length == 0)
            {
                WriteLog("沒有輸入命名空間,生成文件操作無法繼續!");
                return;
            }
            string filename1 = Interaction.InputBox("請輸入實體類文件名稱!", "輸入文件名", "gaofajinmodel", Control.MousePosition.X-200, Control.MousePosition.Y-100);
            if (namespaces.Length == 0)
            {
                WriteLog("沒有輸入實體類文件名!生成文件操作無法繼續!");
                return;
            }
            string filename2 = Interaction.InputBox("請輸入DB類文件名稱!", "輸入文件名", "gaofajinDB", Control.MousePosition.X -200, Control.MousePosition.Y-100);
            if (namespaces.Length == 0)
            {
                WriteLog("沒有輸入DB類文件名!生成文件操作無法繼續!");
                return;
            }
            IDbConnection c = new OleDbConnection(textBox1.Text.Trim());
            WriteFile(namespaces,filename1,filename2,c);      
          
        }
        #endregion
        #region 退出程式按鈕單機時間
        private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }
        #endregion
        #region 使無邊框的窗體可以拖動
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (Canmove == true && e.Button == MouseButtons.Left)
            {
                Point p = Control.MousePosition;
                p.Offset(Pf);
                Location = p;

            }
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            Canmove = false;
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Canmove = true;
                Pf = new Point(-e.X, -e.Y);
            }
        }
        #endregion
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            WriteLog("程式正在被關閉!");
            if (DialogResult.OK != MessageBox.Show("確定退出程式嗎?", "退出程式", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
            {
                e.Cancel = true;
            }
            else { e.Cancel = false; }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            textBox1.Text = ShowConnectDialog();
        }
        string ShowConnectDialog()
        {
            string ConnectionString = string.Empty;
            DataConnectionDialog dcd = new DataConnectionDialog();
            dcd.DataSources.Add(DataSource.AccessDataSource);
            dcd.DataSources.Add(DataSource.OdbcDataSource);
            dcd.DataSources.Add(DataSource.OracleDataSource);
            dcd.DataSources.Add(DataSource.SqlDataSource);
            dcd.DataSources.Add(DataSource.SqlFileDataSource);
           
            if (DialogResult.OK ==DataConnectionDialog.Show(dcd))
            {
                ConnectionString = dcd.ConnectionString;
            }
            return ConnectionString;
        }
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • luogu題面 小學奧數呵呵 在考場上40分鐘沒證出來(數學太差),運氣好看到了規律... 來一波證明: 定義 f(a,b) 表示在 gcd(a,b)==1 情況下的答案。 貝祖定理 易證:對於 gcd(c,b)==1,c > a , 有 f(c,b) = f(a,b) + (c-a)*(b-1) ...
  • 匿名類指類定義體(即代碼塊)本身,使得類也成為所謂的“一等公民”,類也可以像變數一樣進行賦值定義、傳遞和使用。S#語言的數據類就是程式代碼,數據表是該代碼運行時對應的數據值,為此本文介紹了數據表、類定義和類實例化的各種使用方法,讓你體驗S#強大的數據和信息表達能力。 ...
  • 本文主要介紹怎樣通過Visual Studio Code為.Net Core 2.0的項目添加本地類庫引用 ...
  • Winform開發中的窗體重覆及靈活顯示問題 1.問題引入 在項目中需要實現主窗體點擊按鈕後打開子窗體,但是如果不限制的話每次點擊都會打開一個新窗體,用戶體驗不好還浪費記憶體。所以這裡要做的是限制每個子窗體只可以打開一次,如果打開後沒有關閉子窗體或者子窗體被最小化了,就直接把已打開的窗體激活並置頂顯示 ...
  • 騰訊雲開發者實驗室為開發者提供了一個零門檻的線上實驗平臺,開發者實驗室提供的能力: 具體內容可以看視頻: .NET Core 的最重要的一個特性就是跨平臺,Windows 很多同學都會,學習 Linux 已經成為一個.NET 程式員的必備技能,因此我和騰訊雲同事合作在騰訊雲上提供了 1 個 Cent ...
  • 最近開始自己動手寫一個財務分析軟體,由於自己也是剛學.Net不久,所以自己寫的的時候遇到了很多問題,希望通過博客把一些印象深刻的問題記錄下來。 Winform開發中如何將資料庫欄位綁定到ComboBox控制項 1.問題引入 在開發中用到了ComboBox控制項,也就是實現下拉選擇功能的控制項。但是選項的 ...
  • DataOntap 8.1 7-mode版本,需要使用NMSDK 4.1才能使用。 查詢DataOntap 8.1 cifs 延時的命令如下: perf_operation.exe 192.168.10.100 root password get-counter-values cifs cifs_l ...
  • 前言 在網上找EFCore Code First相關的文章,很多都是基於core 1.0版本的,覺得有必要自己實踐下2.0。所以,擼起袖子乾吧!~ 1.新建控制台項目(這裡就不放圖了) 2.打開程式包管理器控制台。工具 NuGet包管理器 程式包管理器控制台 依次安裝以上三個Nuget包 3.新建U ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...