65.9K
CodeProject 正在变化。 阅读更多。
Home

平面文件数据库系统

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (9投票s)

2014年4月2日

CPOL

6分钟阅读

viewsIcon

47034

downloadIcon

2583

使用文本文件作为数据库,可以像关系型数据库管理系统一样使用 SQL 查询进行查询。

引言

本文档完全基于如何查询平面文件数据库(即文本文件数据库)。平面文件数据库的查询相当困难。我写这篇文章是为了创建一个简单的应用程序,使其能够操作平面文件数据库(即文本文件)。

系统分析

平面文件数据库

这是最基本的数据库系统。与在纸上手写数据相比,它使我们的工作更容易。它节省了纸张。平面文件数据库是数据库系统中最简单的形式。它不像关系型数据库管理系统那样可以访问多个表。因为它使用简单的结构,文本文件被视为一个表。文本文件的每一行都是表中的行,列由逗号(,)、制表符或某些特殊字符等分隔符分隔。数据库没有特定的数据类型。它只支持字符串。

系统设计

该系统基于文件输入输出处理和流。该系统与平面文件数据库相同,不同之处在于我们可以使用多个表。相似之处在于目前不支持连接查询等多表查询。

数据库

数据库就是,它在应用程序启动文件夹中创建一个名为数据库名称的文件夹。

表格

在这个系统中,表保存所有数据。在这个系统中,表结构分为两部分:

1. 标题行

2. 数据行

标题行包含列名。数据行包含与列相关的记录。这里使用了一些特殊符号作为分隔符。

符号

├ - 标题行开始

┤ - 标题行结束

└ - 数据行开始

┘ - 数据行结束

│ - 列分隔符

图。系统概述

查询

该系统支持 15 种及以上的 SQL 类型查询来查询数据库。本系统中使用以下查询。

1) CREATE DATABASE StudentDB

这是创建名为“StudendDB”的数据库的查询。

2) LIST DATABASES

此查询显示系统中的数据库列表。

3) DROP DATABASE StudentDB

此查询删除数据库 StudentDB。

4) USE StudentDB

此查询用于进一步的数据库操作查询,如 INSERT、DELETE、UPDATE、SELECT 等,保留 StudentDB 数据库名称。

5) LIST TABLES

此查询显示当前用于操作的数据库中的表。

6) DROP TABLE tblMarkSheet

此查询从数据库中删除表。

7) CREATE TABLE tblMarkSheet (RollNo,StudentName,ClassStd,Mark1,Mark2,Mark3,Total,Avg)

此查询创建 tblMarkSheet 表,包含 RollNo、StudentName、ClassStd、Mark1、Mark2、Mark3、Total 和 Avg 列。在后台,它在“StudentDB”文件夹中创建一个名为“tblMarkSheet.fdb”的文件。

8) 1. INSERT INTO tblMarkSheet (RollNo,StudentName,ClassStd,Mark1,Mark2,Mark3,Total,Avg) VALUES (1, ANAND,10TH,85,48,59,192,64)

此查询将一条记录插入 tblMarkSheet 表。

2. INSERT INTO tblMarkSheet VALUES (1, ANAND,10TH,85,48,59,192,64)

此查询与之前的插入查询相同。区别在于我们不需要指定列名。

9) 1. DELETE FROM tblMarkSheet WHERE RollNo=10

此查询删除 tblMarkSheet 表中列值为 10 的记录。

2. DELETE FROM tblMarkSheet

此查询删除 tblMarkSheet 表中的所有记录。

10) 1. UPDATE tblMarkSheet SET (ClassStd) VALUES (11TH) WHERE RollNo=1

此查询修改 RollNo 为 1 的记录的 ClassStd 字段。

1.1. UPDATE tblMarkSheet SET (ClassStd) VALUES (11TH)

2. UPDATE tblMarkSheet SET VALUES (1, XXX,5TH,40) WHERE RollNo=1

此查询按顺序更新 RollNo 为 1 的记录。在这里,我们不需要指定要更新的列,它会自动从序列中更新,并且错过的列值将保持不变。

2.1. UPDATE tblMarkSheet SET VALUES (1, XXX,5TH,40)

注意:查询 11 的 1.1 和 2.1 在没有条件的情况下执行。

11) 1. SELECT * FROM tblMarkSheet

2. SELECT * FROM tblMarkSheet WHERE RollNo=1

3. SELECT RollNo,StudentName,Total FROM tblMarkSheet WHERE RollNo>5

4. SELECT RollNo,StudentName,Avg FROM tblMarkSheet WHERE Avg>=60

此查询用于查看表的记录。在这里,我们可以使用关系运算符过滤记录。

查询中的 Bug 和缺陷

  • 在 UPDATE 和 DELETE 查询中,它只支持等于(=)条件。它不支持其他运算符,如 <、>、<= 等。
  • 在 SELECT 查询中,数据过滤功能由 datatable 和 dataview 控制。需要提供原生支持。
  • 与关系型数据库管理系统相比,没有 JOIN 查询。

优势

  • 这是我们自己的数据库系统。因此,我们可以修改数据库系统的事务。
  • 与其他数据库系统相比,它相当小且较慢,但安全性是我们的。所以我们对数据安全感到放心。
  • 我们可以通过使用加密技术在这个系统中确保安全。
  • 我们可以修改编码文本中的表结构。这样就没有人知道数据库的内部结构了。没有数据盗窃。

未来增强

  • 将来,它将支持更高级的安全性和完全增强的数据库结构。它将支持 JOIN 查询。

系统实现

根据系统分析和系统设计编写了代码。该系统具有 IntelliSense TextBox,可以减少查询编写,这来自我之前发布的技巧 C# 中的 IntelliSense TextBox

查询方法

下面是用于解析来自客户端的原始查询的方法。

public static string DataBase=null;
        /// <summary>
        /// This method is executing the queries to the FFDB.
        /// </summary>
         
        /// <param name="query"><para>Enter the SQL like Queries All Queries keyword must be in Caps. </para>
        /// <para>Don't Give Unnecessary White Spaces</para>
        /// <para>Ex. SELECT, CREATE, TABLE, etc., </para>
        /// <example>
        /// <code>
        /// <para>1) CREATE DATABASE &lt;DATABASE_NAME&gt;</para>
        /// <para>&#160;&#160;&#160;&#160;Ex: CREATE DATABASE StudntDB</para>
        /// <para>2) DROP DATABASE &lt;DATABASE_NAME&gt;</para>
        /// <para>3) CREATE TABLE tblMarkSheet (RegNo,Name,Std,Sub1,Sub2,Sub3,TotalMark,MarkPercentage)</para>
        /// <para>4) LIST TABLES</para>
        /// <para>5) LIST DATABASES</para>
        /// </code>
        /// </example>
        /// </param>
        /// 
        /// <returns>This is a Dynamic method it cant returns the value as type of return</returns>
        public static dynamic QueryExecution(string query)
        {
            object ValueObj = null;
            string[] QueryArray = query.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                switch (QueryArray[0])
                {
                    case "CREATE":
                        if (QueryArray[1] == "DATABASE")
                            ValueObj = CreateDB(QueryArray[2]);
                        else if (QueryArray[1] == "TABLE")
                            ValueObj = CreateTable(QueryArray[2], DataBase, StringArrayToString(QueryArray[3].Split(new char[3] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries)));
                        break;

                    case "DROP":
                        if (QueryArray[1] == "DATABASE")
                            ValueObj = DropDB(QueryArray[2]);
                        else if (QueryArray[1] == "TABLE")
                            ValueObj = DropTable(QueryArray[2], DataBase);
                        break;

                    case "USE":
                        ValueObj = UseDB(QueryArray[1]);
                        break;
                    case "LIST":
                        if (QueryArray[1] == "DATABASES")
                            ValueObj = ListDB();
                        else if (QueryArray[1] == "TABLES")
                        {
                            if (DataBase != null)
                            {
                                ValueObj = ListTables(DataBase);
                            }
                            else
                            {
                                MessageBox.Show("DATABASE NOT IN USE" + Environment.NewLine + "SELECT THE DATABASE, THEN EXECUTE THIS QUERY", "FFDB", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            }
                        }
                        break;

                    case "DELETE":

                        if (QueryArray.Length >= 5)
                        {
                            string[] tdcon = QueryArray[4].Split('=');
                            ValueObj = DeleteRecord(QueryArray[2], DataBase, tdcon[0], tdcon[1]);
                        }
                        else
                            ValueObj = DeleteRecord(QueryArray[2], DataBase);
                        break;

                    case "INSERT":
                        string[] valArray = query.Substring((query.LastIndexOf("VALUES") + 7)).Split(new char[4] { '(', ',', '\'', ')' }, StringSplitOptions.RemoveEmptyEntries);
                        if (QueryArray[4] == "VALUES")
                        {
                            string[] colArray = QueryArray[3].Split(new char[3] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries);

                            ValueObj = InsertRecord(QueryArray[2], DataBase, StringArrayToString(valArray), StringArrayToString(colArray));
                        }
                        else
                        {
                            ValueObj = InsertRecord(QueryArray[2], DataBase, StringArrayToString(valArray));
                        }
                        break;

                    case "UPDATE":
                        string[] tiv = query.Substring(query.LastIndexOf("VALUES") + 7).Split(new char[4] { '(', ',','\'', ')' }, StringSplitOptions.None);

                        if (query.LastIndexOf("WHERE") > -1)
                        {
                            if (QueryArray[4] == "VALUES")
                            {
                                string[] tcon = QueryArray[7].Split('=');
                                string[] tic = QueryArray[3].Split(new char[3] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries);
                                ValueObj = UpdateRecord(QueryArray[1], DataBase, StringArrayToString(tiv), StringArrayToString(tic), tcon[0], tcon[1]);
                            }
                            else
                            {
                                string[] tcon = QueryArray[6].Split('=');
                                ValueObj = UpdateRecord(QueryArray[1], DataBase, StringArrayToString(tiv), null, tcon[0], tcon[1]);
                            }
                        }
                        else
                        {
                            if (QueryArray[4] == "VALUES")
                            {
                                string[] tic = QueryArray[3].Split(new char[3] { '(', ',', ')' }, StringSplitOptions.RemoveEmptyEntries);
                                ValueObj = UpdateRecord(QueryArray[1], DataBase, StringArrayToString(tiv), StringArrayToString(tic));
                            }
                            else
                            {
                                ValueObj = UpdateRecord(QueryArray[1], DataBase, StringArrayToString(tiv), null);
                            }
                        }

                        

                        break;
                    case "SELECT":
                        ValueObj = SelectFilter(query, DataBase);
                        break;
                    default:
                        ValueObj=false;
                        break;

                }
            
            return ValueObj;
        }

将字符串数组转换为字符串的方法

以下代码用于将字符串数组转换为字符串

public static string StringArrayToString(string[] strArray)
        {
            string Str = "";
            for (int i = 0; i < strArray.Length; i++)
            {
                Str += strArray[i];
                if (i < strArray.Length - 1)
                    Str += ",";
            }
            return Str;
        }

数据库创建方法

 //Database Creation Method
        /// <summary>
        /// <para>This method creates the database (i.e. It creates Folder with DbName.</para>  <para>The folder is called Database in FFDB.</para>
        /// 
        /// </summary>
        /// <param name="dbName"></param>
        /// <returns></returns>
        public static bool CreateDB(string dbName)
        {
            if (Directory.Exists(Application.StartupPath + "\\" + dbName))
            {
                return false;
            }
            else
            {
                Directory.CreateDirectory(Application.StartupPath + "\\" + dbName);
                return true;
            }
        }

数据库删除方法

//Database Drop Method

        public static bool DropDB(string dbName)
        {
            if (!Directory.Exists(Application.StartupPath + "\\" + dbName))
            {
                return false;
            }
            else
            {
                Directory.Delete(Application.StartupPath + "\\" + dbName, true);
                return true;
            }
        }

显示数据库的方法

//Display the List of Databases
        public static DataTable ListDB()
        {
            DirectoryInfo dir = new DirectoryInfo(Application.StartupPath);
            DataTable dtData = new DataTable();
            dtData.Columns.Add(new DataColumn("DATABASES_IN_FFDB", typeof(String)));
            DataRow drRow;
            object[] ObjArray =new object[1];

            foreach (DirectoryInfo g in dir.GetDirectories())
            {
                ObjArray[0] = g.Name;
                drRow = dtData.NewRow();
                drRow.ItemArray = ObjArray;
                dtData.Rows.Add(drRow);
            }
            return dtData;
        }

USE DB 方法

用于保留当前数据库进行操作的方法。

//use database

        public static bool UseDB(string dbName)
        {
            bool tempVal = false;
            DirectoryInfo dir = new DirectoryInfo(Application.StartupPath);
            foreach (DirectoryInfo g in dir.GetDirectories())
            {
                if (dbName == g.Name)
                {
                    DataBase = g.Name;
                    tempVal = true;
                    break;
                }
                else
                {
                    
                    tempVal = false;
                    continue;
                }
                
            }
            if (tempVal == false)
            {
                MessageBox.Show(DataBase + " DATABASE is Not Exist!", "FFDB", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            return tempVal;
        }

在数据库中显示表

//Display the list of Tables in the Db
        public static DataTable ListTables(string dbName)
        {
            DirectoryInfo dir = new DirectoryInfo(Application.StartupPath+"\\"+dbName);
            DataTable dtData = new DataTable();
            dtData.Columns.Add(new DataColumn("TABLES_IN_"+dbName+"_DATABASE", typeof(String)));
            DataRow drRow;
            object[] ObjArray = new object[1];

            foreach (FileInfo f in dir.GetFiles("*.fdb"))
            {
                ObjArray[0] = f.Name.Split(new string[1] {".fdb"},StringSplitOptions.RemoveEmptyEntries)[0];
                drRow = dtData.NewRow();
                drRow.ItemArray = ObjArray;
                dtData.Rows.Add(drRow);
                
            }
            return dtData;
        }

表创建和删除方法

//Table Creation Method
        public static bool CreateTable(string tblName, string dbName, string tblColumns)
        {

            if (File.Exists(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"))
                return false;
            else
            {
                FileStream fs = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                StreamWriter sw = new StreamWriter(fs);
                string[] ColsArray = tblColumns.Split(',');
                sw.Write("├");
                for (int i = 0; i < ColsArray.Length; i++)
                {
                    if (i < ColsArray.Length - 1)
                        ColsArray[i] += "│";
                    sw.Write(ColsArray[i]);
                }
                sw.Write("┤");
                sw.Close();
                
                return true;
            }
        }

        //Table Drop Method
        public static bool DropTable(string tblName, string dbName)
        {
            if (!File.Exists(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"))
            {
                return false;
            }
            else
            {
                File.Delete(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"); 
                return true;
            }
        }

过滤记录方法

以下方法在执行 SELECT 查询时过滤记录。

public static DataTable SelectFilter(string unmodifiedQuery,string dbName)
        {
            string[] UQStr = unmodifiedQuery.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            DataTable dtTemp = SelectRecord(UQStr[3], dbName);
            DataView dv = new DataView(dtTemp);
            if (UQStr.Length==6)
            {
                dv.RowFilter = unmodifiedQuery.Substring(unmodifiedQuery.LastIndexOf("WHERE") + 6);
                dtTemp = dv.ToTable();
            }
            if (UQStr[1] != "*")
            {
                dtTemp = dv.ToTable(false, UQStr[1].Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries));
            }
            return dtTemp;
        }

选择记录方法

//Select the record from table
        public static DataTable SelectRecord(string tblName, string dbName)
        {
            if (!File.Exists(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"))
            {
                return null;
            }
            else
            {
                FileStream fs = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", FileMode.Open, FileAccess.Read, FileShare.Read, 10000, FileOptions.Asynchronous);
                StreamReader sr = new StreamReader(fs);

                string[] ColsArray = sr.ReadLine().Split(new char[3] { '├', '┤', '│' }, StringSplitOptions.RemoveEmptyEntries);

                DataTable dtData = new DataTable();

                for (int i = 0; i < ColsArray.Length; i++)
                {
                    dtData.Columns.Add(new DataColumn(ColsArray[i], typeof(String)));
                }

                DataRow drRow;
                object[] objRowArray = new object[ColsArray.Length];

                while(!sr.EndOfStream)
                {
                    string[] RowArray = sr.ReadLine().Split(new char[3] { '└', '┘', '│' }, StringSplitOptions.RemoveEmptyEntries);
                    for (int j = 0; j < ColsArray.Length; j++)
                    {
                        if (RowArray[j] != "■")
                            objRowArray[j] = RowArray[j];
                        else
                            objRowArray[j] = "";
                    }
                    drRow = dtData.NewRow();
                    drRow.ItemArray = objRowArray;
                    dtData.Rows.Add(drRow);
                }
                sr.Close();
                fs.Close();
                return dtData;
            }

        }

Inserting Record Method:

public static bool InsertRecord(string tblName, string dbName, string iValues, string iColumns=null)
        {

            if (!File.Exists(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"))
                return false;
            else
            {
                FileStream fs = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                StreamWriter sw = new StreamWriter(fs);
                StreamReader sr = new StreamReader(fs);

                string[] ColsArray = sr.ReadLine().Split(new char[3] { '├', '┤', '│' }, StringSplitOptions.RemoveEmptyEntries);
                string[] TempColsArray=null;
                int TempiCols = 0;
                string[] TempcValues = iValues.Split(new char[1]{','},StringSplitOptions.RemoveEmptyEntries);
                TempiCols=TempcValues.Length;
                if (iColumns != null)
                {
                    TempColsArray = iColumns.Split(',');
                    TempiCols = TempColsArray.Length;
                }
               
                sw.Write(sw.NewLine+"└");
                
                for (int i = 0; i < ColsArray.Length; i++)
                {
                    if (TempColsArray != null)
                    {

                        for (int j = 0; j < TempiCols; j++)
                        {

                            if (ColsArray[i] == TempColsArray[j])
                            {
                                if (TempcValues[j].Trim() == "")
                                    TempcValues[j] = "■";
                                if (i < ColsArray.Length - 1)
                                {
                                    TempcValues[j] += "│";
                                }
                                sw.Write(TempcValues[j]);
                                break;
                            }
                            else
                            {
                                if (j == TempiCols - 1)
                                {
                                    sw.Write("■");
                                    if (i < ColsArray.Length - 1)
                                    {
                                        sw.Write("│");
                                    }

                                }
                            }
                        }
                    }
                    else
                    {
                        if (TempcValues.Length > i)
                        {
                            if (TempcValues[i].Trim() == "")
                                TempcValues[i] = "■";

                            if (i < ColsArray.Length - 1)
                            {
                                TempcValues[i] += "│";
                            }
                            sw.Write(TempcValues[i]);
                        }
                        else
                        {
                            sw.Write("■");
                            if (i < ColsArray.Length - 1)
                            {
                                sw.Write("│");
                            }
                        }
                    }

                }
                sw.Write("┘");
                sw.Close();
                sr.Close();
                fs.Close();
                return true;
            }

        }

更新记录方法

//Updating Record
        public static bool UpdateRecord(string tblName, string dbName, string iValues, string iColumns = null, string cField=null, string cValue=null)
        {
            if (!File.Exists(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"))
                return false;
            else
            {
                FileStream fsr = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                FileStream fsw = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                StreamWriter sw = new StreamWriter(fsw);
                StreamReader sr = new StreamReader(fsr);
                fsw.Seek(0, SeekOrigin.End);
                string tCol = sr.ReadLine();
                string[] ColsArray = tCol.Split(new char[3] { '├', '┤', '│' }, StringSplitOptions.RemoveEmptyEntries);
                
                sw.Write(tCol);

                string[] iColumnsArray = null;
                int TempiCols = 0;
                string modifiedRow = "";
                string[] iValuesArray = iValues.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                TempiCols = iValuesArray.Length;

                if (iColumns != null)
                {
                    iColumnsArray = iColumns.Split(',');
                    TempiCols = iColumnsArray.Length;
                }

                

                if (cField != null || cValue != null)
                {
                    int cfi = Array.IndexOf(ColsArray, cField);
                    while (!sr.EndOfStream)
                    {
                        string TempStr = sr.ReadLine();
                        string[] RowArray = TempStr.Split(new char[3] { '└', '┘', '│' }, StringSplitOptions.RemoveEmptyEntries);
                        if (RowArray[cfi].Trim() == cValue.Trim())
                        {
                            modifiedRow = "";

                            int k = 0;

                            for (int i = 0; i < ColsArray.Length; i++)
                            {
                                if (iColumnsArray != null)
                                {
                                    for (int j = 0; j < TempiCols; j++)
                                    {
                                        if (ColsArray[i] == iColumnsArray[j])
                                        {
                                            modifiedRow += iValuesArray[j]+"~";
                                            k++;
                                            break;
                                        }
                                        else
                                        {
                                            if (j == TempiCols - 1)
                                            {
                                                modifiedRow += RowArray[i] + "~";
                                                break;
                                            }
                                        }
                                    }
                                }
                             
                            }

                          

                            string[] TempcValues = modifiedRow.Split('~');

                            string TempModStr = "└";
                            for (int j = 0; j < TempcValues.Length; j++)
                            {
                                if (TempcValues[j].Trim() == "")
                                    TempcValues[j] = "■";
                                if (j < TempcValues.Length - 1)
                                {
                                    TempcValues[j] += "│";
                                }
                                TempModStr += TempcValues[j];
                            }
                            TempModStr += "┘";

                            TempStr = TempModStr;
                        }
                        sw.Write(sw.NewLine + TempStr);

                    }
                }

                else
                {
                    while (!sr.EndOfStream)
                    {
                        string TempStr = sr.ReadLine();
                        string[] RowArray = TempStr.Split(new char[3] { '└', '┘', '│' }, StringSplitOptions.RemoveEmptyEntries);
                        
                            modifiedRow = "";                         

                            int k = 0;
                            for (int i = 0; i < ColsArray.Length; i++)
                            {
                                for (int j = 0; j < TempiCols; j++)
                                {
                                    if (k<=iValuesArray.Length-1)
                                    {
                                        modifiedRow += iValuesArray[j]+"~";
                                        k++;
                                        break;
                                    }
                                    else
                                    {
                                        if (j <= TempiCols - 1)
                                        {
                                            modifiedRow += RowArray[i]+"~";
                                            break;
                                        }
                                    }
                                }
                            }

                            //continue;
                            string[] TempcValues = modifiedRow.Split('~');

                            string TempModStr = "└";
                            for (int j = 0; j < TempcValues.Length; j++)
                            {
                                if (TempcValues[j].Trim() == "")
                                    TempcValues[j] = "■";
                                if (j < TempcValues.Length - 1)
                                {
                                    TempcValues[j] += "│";
                                }
                                TempModStr += TempcValues[j];
                            }
                            TempModStr += "┘";

                            TempStr = TempModStr;
                        
                        sw.Write(sw.NewLine + TempStr);
                    }
                }

                sw.Close();
                sr.Close();
                fsr.Close();
                fsw.Close();
                File.Copy(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp", Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", true);
                File.Delete(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp");
                return true;
            }
        }

删除记录方法

//Record Delete Method
        public static bool DeleteRecord(string tblName, string dbName, string cField=null, string cValue=null)
        {
            if (!File.Exists(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb"))
                return false;
            else
            {
                FileStream fsr = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                FileStream fsw = new FileStream(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous);
                StreamWriter sw = new StreamWriter(fsw);
                StreamReader sr = new StreamReader(fsr);
                fsw.Seek(0, SeekOrigin.End);
                string tCol = sr.ReadLine();
                string[] ColsArray = tCol.Split(new char[3] { '├', '┤', '│' }, StringSplitOptions.RemoveEmptyEntries);
                
                sw.Write(tCol);
                if (cField != null || cValue != null)
                {
                    int cfi = Array.IndexOf(ColsArray, cField);
                    while (!sr.EndOfStream)
                    {
                        string TempStr = sr.ReadLine();
                        string[] RowArray = TempStr.Split(new char[3] { '└', '┘', '│' }, StringSplitOptions.RemoveEmptyEntries);
                        if (RowArray[cfi].Trim() == cValue.Trim())
                        {
                            continue;
                        }
                        sw.Write(sw.NewLine + TempStr);
                    }
                }
                

                sw.Close();
                sr.Close();
                fsr.Close();
                fsw.Close();
                File.Copy(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp", Application.StartupPath + "\\" + dbName + "\\" + tblName + ".fdb", true);
                File.Delete(Application.StartupPath + "\\" + dbName + "\\" + tblName + ".tmp");
                return true;
            }
        }

附加方法

在这个系统中,我添加了一个将文本框转换为只接受数字的方法。代码如下:

只接受数字的 TextBox 方法

// Method for Change the Textbox only accepts the numbers

        public static void NumberTextBox(params TextBox[] txtControl)
        {
            foreach (TextBox txt in txtControl) 
            {
                txt.KeyPress += (s, e) =>
                    {
                        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
                        {
                            e.Handled = true;
                        }

                            if (e.KeyChar == '.' && (s as TextBox).Text.IndexOf('.') > -1)
                        {
                            e.Handled = true;
                        }

                    };
            }
            
        }

我们可以按如下方式调用此方法:

clsIntelliSense.NumberTextBox(txtTamil, txtEnglish,txtMaths,txtScince,txtSocialScience);

需要在窗体构造函数中编写。

演示窗体设计

演示窗体旨在检查平面文件数据库的操作。它包括数据库创建、表创建、记录插入、记录删除、记录更新、加载记录和自定义查询执行。此外,它还提供了 IntelliSense TextBox 以方便查询编写。窗体布局流畅,完全适合所有屏幕。

致谢

我计划在 2014 年 3 月 14 日发布这篇文章。我将这篇文章献给我女朋友(Ammu Kutti)的生日,但错过了。如果我在那天发布,我可能会收到一份大礼。

历史

  • 目前,该系统展示了我们如何使用简单的功能在 C# 中操作平面文件数据库。
  • 将来,它将提供更高级的安全性和完全增强的数据库结构。它将支持 JOIN 查询。
© . All rights reserved.