Click here to Skip to main content
15,886,798 members
Articles / Database Development

FlatFile Database System

Rate me:
Please Sign up or sign in to vote.
4.93/5 (9 votes)
2 Apr 2014CPOL6 min read 44.6K   2.5K   27   9
Working with text file as database can querying as RDBMS with SQL Queries.

Image 1

Introduction

In this article is fully based on how to querying the flat file database (i.e. text file database). The flat file database querying is quite difficult. I write this article to create a simple application with ability to manipulate the flatfile database (i.e. text file).

System Analysis

FlatFile Database:

This is the basic database system. It makes easier our work while comparing writing the data's in paper. It saves the paper. A flat file database is the simplest form of database systems. There is no posiblity to access the multiple tables like a RDBMS. Because it uses the simple strucutre, A textfile considered as a table. Every line of the text file is rows of table and the columns are separetd by delimiters like comma(,), tab, and some special characters. The database doesnot have specific datatype. It Only supports strings.

System Design

The system based on File Input Output processing and Streams. This system also same as flatfile database the difference is we can use multiple tables. The similarity is the multiple table querying such as Join queries are not proccessed currently.

Database:

The database is nothing but, It creates the folder for a database Name in application startup folder.

Image 2

Tables:

In this system the tables are holding all the datas. In this System the table structure has two parts

1. Header Row

2. Data Rows

Header Row consists the column names. Data Rows consist the rcords related to the columns. Here Some special symbols are used as a delimiters.

Image 3

Symbols:

├ - Header Row Begining

┤ - Header Row End

└ - Data Row Begining

┘ - Data Row End

│ - Column Separator

Image 4

Fig. Overview of System

Querying:

The system support 15 and more SQL Type Queries to querying the Database. The following queries are used in this system.

1) CREATE DATABASE StudentDB

This is the query for creating the database named "StudendDB".

2) LIST DATABASES

This query shows list of database in the system.

3) DROP DATABASE StudentDB

This query deletes the Database StudentDB.

4) USE StudentDB

This query holds the StudentDB database name for further database manipulation quries such as INSERT, DELETE, UPDATE, SELECT, etc.,

5) LIST TABLES

This query shows the tables in the database which is currenlty hold for manipulation.

6) DROP TABLE tblMarkSheet

This query delete the table from the database.

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

This query crates tblMarkSheet table with Columns of RollNo, StudentName, ClassStd, Mark1, Mark2, Mark3, Total and Avg. In Background It creates one file named "tblMarkSheet.fdb" in "StudentDB" Folder.

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

This query insert a record in tblMarkSheet table.

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

This query also same as previous insert query. The difference is we don't need to mention the column names.

9) 1. DELETE FROM tblMarkSheet WHERE RollNo=10

This query deletes the record which record column values is equal to 10 in tblMarkSheet table.

2. DELETE FROM tblMarkSheet

This query deletes all the record from tblMarkSheet Table.

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

This query modify the ClassStd field of the record which holds RollNo has 1.

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

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

This query sequentiay updates the record which holds the RollNo has 1. Here we don't need to mention the updating columns, it automatically updates from the sequence and missed column values are remain in the same in previous.

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

Note: The queries 11 of 1.1 and 2.1 are executed without condition.

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

This query using to view the records of the table. Here we can filter the records by using relational operators.

Bugs and Flaws in Queries:

  • In UPDATE and DELETE queries it supports only Equal (=) condition. It is not support for other operators like <, >, <=, etc.,
  • In SELECT query the data filter feature is held by use of datatable and dataview. Need to provide native support.
  • There is no JOIN queries when compared to RDBMS.

Advantage:

  • It is our own database system. So we can modify the transaction of the database system.
  • When compared to other database system is quite little and slower but security things are ours. So we feel free about data security.
  • We can ensure the security by using cryptography things in this system.
  • We can modify the table structure in encoded text. So that no one knows the inner structure of the database. There is no data theft.

Future Enhancement:

  • In the future it will portable for more security and fully enhanced database structure. It could be supports JOIN quries.

System Implementation

From the system analysis and system design the code has been written. The system has IntelliSense TextBox for lesser the query writing, It has been taken from my previously posted tip IntelliSense TextBox in C#.

Querying Method:

The below method is using to parsing the raw query from the client.

C#
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;
        }

Converting String Array to String Method:

The following code for coverting the string array to string

C#
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:

C#
//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:

C#
//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;
            }
        }

Displaying Database Method:

C#
//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 Method:

Method for holding the current database for operation.

C#
//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;
        }

Displaying Table in Database:

C#
//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 and Drop Methods:

C#
//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;
            }
        }

Filltering Record Method:

The following method filltering the records when executing the SELECT query.

C#
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 Record Method:

C#
//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 Method:

C#
//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;
            }
        }

Deleting Record Method:

C#
//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;
            }
        }

Addition Methods:

In this system I add one method for converting the textbox that only accepts the number. The code has follows:

Accepting Number Only TextBox Method:

C#
// 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;
                        }

                    };
            }
            
        }

We can call this method has follows:

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

Need to write in form constructor.

Demo Form Desing:

The demo form has been designed to examine the flat file database opeartion. It has database creation, table creation, record insertion, record deletion, record updation, loading records and custom query execution. In additionally It has IntelliSense TextBox for easy query writing. The form layout is fluid and exactly fit for all screens.

Dedication

I planned to post this article on 14th March 2014. I dedicate this article to my girlfrind(Ammu Kutti) birthday but missed. If I posted on that date, I may be got a big gift.

History

  • Now currently this system shows how we can manipulate the flatfile database in C# with simple fature.
  • In the future it will be availabe with more security and fully enhanced database structure. It would be available with support of JOIN quries.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Azeal Groups
India India
Thinking Innovation. .. ...

Technologies: .NET, Java, PHP, Python, SQL, Android, HTML, .

Comments and Discussions

 
Questionvb.net Pin
crayse111-Jun-19 7:18
crayse111-Jun-19 7:18 
I tried to convert this code to vb.net so I could use with a project and for some reason it will write 9-12 lines in the table and then it will repeat overwrite the 12th line over and over.

Public Class FFDB
    Public Shared Datapath As String = CurDir()
    Public Shared DataBase As String = Nothing

    Public Shared Function QueryExecution(ByVal query As String) As Object
        Dim ValueObj As Object = Nothing
        Dim QueryArray As String() = query.Split(New Char(0) {" "c}, StringSplitOptions.RemoveEmptyEntries)

        Select Case QueryArray(0)
            Case "CREATE"

                If QueryArray(1) = "DATABASE" Then
                    ValueObj = CreateDB(QueryArray(2))
                ElseIf QueryArray(1) = "TABLE" Then
                    ValueObj = CreateTable(QueryArray(2), DataBase, StringArrayToString(QueryArray(3).Split(New Char(2) {"("c, ","c, ")"c}, StringSplitOptions.RemoveEmptyEntries)))
                End If

            Case "DROP"

                If QueryArray(1) = "DATABASE" Then
                    ValueObj = DropDB(QueryArray(2))
                ElseIf QueryArray(1) = "TABLE" Then
                    ValueObj = DropTable(QueryArray(2), DataBase)
                End If

            Case "USE"
                ValueObj = UseDB(QueryArray(1))
            Case "LIST"

                If QueryArray(1) = "DATABASES" Then
                    ValueObj = ListDB()
                ElseIf QueryArray(1) = "TABLES" Then

                    If DataBase IsNot Nothing Then
                        ValueObj = ListTables(DataBase)
                    Else
                        Console.WriteLine("DATABASE NOT IN USE" & Environment.NewLine & "SELECT THE DATABASE, THEN EXECUTE THIS QUERY", "FFDB")
                        ' MessageBox.Show("DATABASE NOT IN USE" & Environment.NewLine & "SELECT THE DATABASE, THEN EXECUTE THIS QUERY", "FFDB", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    End If
                End If

            Case "DELETE"

                If QueryArray.Length >= 5 Then
                    Dim tdcon As String() = QueryArray(4).Split("="c)
                    ValueObj = DeleteRecord(QueryArray(2), DataBase, tdcon(0), tdcon(1))
                Else
                    ValueObj = DeleteRecord(QueryArray(2), DataBase)
                End If

            Case "INSERT"
                Dim valArray As String() = query.Substring((query.LastIndexOf("VALUES") + 7)).Split(New Char(3) {"("c, ","c, "'"c, ")"c}, StringSplitOptions.RemoveEmptyEntries)

                If QueryArray(4) = "VALUES" Then
                    Dim colArray As String() = QueryArray(3).Split(New Char(2) {"("c, ","c, ")"c}, StringSplitOptions.RemoveEmptyEntries)
                    ValueObj = InsertRecord(QueryArray(2), DataBase, StringArrayToString(valArray), StringArrayToString(colArray))
                Else
                    ValueObj = InsertRecord(QueryArray(2), DataBase, StringArrayToString(valArray))
                End If

            Case "UPDATE"
                Dim tiv As String() = query.Substring(query.LastIndexOf("VALUES") + 7).Split(New Char(3) {"("c, ","c, "'"c, ")"c}, StringSplitOptions.None)

                If query.LastIndexOf("WHERE") > -1 Then

                    If QueryArray(4) = "VALUES" Then
                        Dim tcon As String() = QueryArray(7).Split("="c)
                        Dim tic As String() = QueryArray(3).Split(New Char(2) {"("c, ","c, ")"c}, StringSplitOptions.RemoveEmptyEntries)
                        ValueObj = UpdateRecord(QueryArray(1), DataBase, StringArrayToString(tiv), StringArrayToString(tic), tcon(0), tcon(1))
                    Else
                        Dim tcon As String() = QueryArray(6).Split("="c)
                        ValueObj = UpdateRecord(QueryArray(1), DataBase, StringArrayToString(tiv), Nothing, tcon(0), tcon(1))
                    End If
                Else

                    If QueryArray(4) = "VALUES" Then
                        Dim tic As String() = QueryArray(3).Split(New Char(2) {"("c, ","c, ")"c}, StringSplitOptions.RemoveEmptyEntries)
                        ValueObj = UpdateRecord(QueryArray(1), DataBase, StringArrayToString(tiv), StringArrayToString(tic))
                    Else
                        ValueObj = UpdateRecord(QueryArray(1), DataBase, StringArrayToString(tiv), Nothing)
                    End If
                End If

            Case "SELECT"
                ValueObj = SelectFilter(query, DataBase)
            Case Else
                ValueObj = False
        End Select

        Return ValueObj
    End Function

    Public Shared Function StringArrayToString(ByVal strArray As String()) As String
        Dim Str As String = ""

        For i As Integer = 0 To strArray.Length - 1
            Str += strArray(i)
            If i < strArray.Length - 1 Then Str += ","
        Next

        Return Str
    End Function

    Public Shared Function SelectFilter(ByVal unmodifiedQuery As String, ByVal dbName As String) As DataTable
        Dim UQStr As String() = unmodifiedQuery.Split(New Char(0) {" "c}, StringSplitOptions.RemoveEmptyEntries)
        Dim dtTemp As DataTable = SelectRecord(UQStr(3), dbName)
        Dim dv As DataView = New DataView(dtTemp)

        If UQStr.Length = 6 Then
            dv.RowFilter = unmodifiedQuery.Substring(unmodifiedQuery.LastIndexOf("WHERE") + 6)
            dtTemp = dv.ToTable()
        End If

        If UQStr(1) <> "*" Then
            dtTemp = dv.ToTable(False, UQStr(1).Split(New Char(0) {","c}, StringSplitOptions.RemoveEmptyEntries))
        End If

        Return dtTemp
    End Function

    Public Shared Function CreateDB(ByVal dbName As String) As Boolean
        If Directory.Exists(Datapath & "\" & dbName) Then
            Return False
        Else
            Directory.CreateDirectory(Datapath & "\" & dbName)
            Return True
        End If
    End Function

    Public Shared Function DropDB(ByVal dbName As String) As Boolean
        If Not Directory.Exists(Datapath & "\" & dbName) Then
            Return False
        Else
            Directory.Delete(Datapath & "\" & dbName, True)
            Return True
        End If
    End Function

    Public Shared Function ListDB() As DataTable
        Dim dir As DirectoryInfo = New DirectoryInfo(Datapath)
        Dim dtData As DataTable = New DataTable()
        dtData.Columns.Add(New DataColumn("DATABASES_IN_FFDB", GetType(String)))
        Dim drRow As DataRow
        Dim ObjArray As Object() = New Object(0) {}

        For Each g As DirectoryInfo In dir.GetDirectories()
            ObjArray(0) = g.Name
            drRow = dtData.NewRow()
            drRow.ItemArray = ObjArray
            dtData.Rows.Add(drRow)
        Next

        Return dtData
    End Function

    Public Shared Function UseDB(ByVal dbName As String) As Boolean
        Dim tempVal As Boolean = False
        Dim dir As DirectoryInfo = New DirectoryInfo(Datapath)

        For Each g As DirectoryInfo In dir.GetDirectories()

            If dbName = g.Name Then
                DataBase = g.Name
                tempVal = True
                Exit For
            Else
                tempVal = False
                Continue For
            End If
        Next

        If tempVal = False Then
            Console.WriteLine(DataBase & " DATABASE is Not Exist!", "FFDB")

        End If

        Return tempVal
    End Function

    Public Shared Function ListTables(ByVal dbName As String) As DataTable
        Dim dir As DirectoryInfo = New DirectoryInfo(Datapath & "\" & dbName)
        Dim dtData As DataTable = New DataTable()
        dtData.Columns.Add(New DataColumn("TABLES_IN_" & dbName & "_DATABASE", GetType(String)))
        Dim drRow As DataRow
        Dim ObjArray As Object() = New Object(0) {}

        For Each f As FileInfo In dir.GetFiles("*.fdb")
            ObjArray(0) = f.Name.Split(New String(0) {".fdb"}, StringSplitOptions.RemoveEmptyEntries)(0)
            drRow = dtData.NewRow()
            drRow.ItemArray = ObjArray
            dtData.Rows.Add(drRow)
        Next

        Return dtData
    End Function

    Public Shared Function CreateTable(ByVal tblName As String, ByVal dbName As String, ByVal tblColumns As String) As Boolean
        If File.Exists(Datapath & "\" & dbName & "\" & tblName & ".fdb") Then
            Return False
        Else
            Dim fs As FileStream = New FileStream(Datapath & "\" & dbName & "\" & tblName & ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous)
            Dim sw As StreamWriter = New StreamWriter(fs)
            Dim ColsArray As String() = tblColumns.Split(","c)
            sw.Write("├")

            For i As Integer = 0 To ColsArray.Length - 1
                If i < ColsArray.Length - 1 Then ColsArray(i) += "│"
                sw.Write(ColsArray(i))
            Next

            sw.Write("┤")
            sw.Close()
            Return True
        End If
    End Function

    Public Shared Function DropTable(ByVal tblName As String, ByVal dbName As String) As Boolean
        If Not File.Exists(Datapath & "\" & dbName & "\" & tblName & ".fdb") Then
            Return False
        Else
            File.Delete(Datapath & "\" & dbName & "\" & tblName & ".fdb")
            Return True
        End If
    End Function

    Public Shared Function DeleteRecord(ByVal tblName As String, ByVal dbName As String, ByVal Optional cField As String = Nothing, ByVal Optional cValue As String = Nothing) As Boolean
        If Not File.Exists(Datapath & "\" & dbName & "\" & tblName & ".fdb") Then
            Return False
        Else
            Dim fsr As FileStream = New FileStream(Datapath & "\" & dbName & "\" & tblName & ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous)
            Dim fsw As FileStream = New FileStream(Datapath & "\" & dbName & "\" & tblName & ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous)
            Dim sw As StreamWriter = New StreamWriter(fsw)
            Dim sr As StreamReader = New StreamReader(fsr)
            fsw.Seek(0, SeekOrigin.[End])
            Dim tCol As String = sr.ReadLine()
            Dim ColsArray As String() = tCol.Split(New Char(2) {"├"c, "┤"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)
            sw.Write(tCol)

            If cField IsNot Nothing OrElse cValue IsNot Nothing Then
                Dim cfi As Integer = Array.IndexOf(ColsArray, cField)

                While Not sr.EndOfStream
                    Dim TempStr As String = sr.ReadLine()
                    Dim RowArray As String() = TempStr.Split(New Char(2) {"└"c, "┘"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)

                    If RowArray(cfi).Trim() = cValue.Trim() Then
                        Continue While
                    End If

                    sw.Write(sw.NewLine & TempStr)
                End While
            End If

            sw.Close()
            sr.Close()
            fsr.Close()
            fsw.Close()
            File.Copy(Datapath & "\" & dbName & "\" & tblName & ".tmp", Datapath & "\" & dbName & "\" & tblName & ".fdb", True)
            File.Delete(Datapath & "\" & dbName & "\" & tblName & ".tmp")
            Return True
        End If
    End Function

    Public Shared Function InsertRecord(ByVal tblName As String, ByVal dbName As String, ByVal iValues As String, ByVal Optional iColumns As String = Nothing) As Boolean
        If Not File.Exists(Datapath & "\" & dbName & "\" & tblName & ".fdb") Then
            Return False
        Else
            Dim fs As FileStream = New FileStream(Datapath & "\" & dbName & "\" & tblName & ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous)
            Dim sw As StreamWriter = New StreamWriter(fs)
            Dim sr As StreamReader = New StreamReader(fs)
            Dim ColsArray As String() = sr.ReadLine().Split(New Char(2) {"├"c, "┤"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)
            Dim TempColsArray As String() = Nothing
            Dim TempiCols As Integer = 0
            Dim TempcValues As String() = iValues.Split(New Char(0) {","c}, StringSplitOptions.RemoveEmptyEntries)
            TempiCols = TempcValues.Length

            If iColumns IsNot Nothing Then
                TempColsArray = iColumns.Split(","c)
                TempiCols = TempColsArray.Length
            End If

            sw.Write(sw.NewLine & "└")

            For i As Integer = 0 To ColsArray.Length - 1

                If TempColsArray IsNot Nothing Then

                    For j As Integer = 0 To TempiCols - 1

                        If ColsArray(i) = TempColsArray(j) Then
                            If TempcValues(j).Trim() = "" Then TempcValues(j) = "■"

                            If i < ColsArray.Length - 1 Then
                                TempcValues(j) += "│"
                            End If

                            sw.Write(TempcValues(j))
                            Exit For
                        Else

                            If j = TempiCols - 1 Then
                                sw.Write("■")

                                If i < ColsArray.Length - 1 Then
                                    sw.Write("│")
                                End If
                            End If
                        End If
                    Next
                Else

                    If TempcValues.Length > i Then
                        If TempcValues(i).Trim() = "" Then TempcValues(i) = "■"

                        If i < ColsArray.Length - 1 Then
                            TempcValues(i) += "│"
                        End If

                        sw.Write(TempcValues(i))
                    Else
                        sw.Write("■")

                        If i < ColsArray.Length - 1 Then
                            sw.Write("│")
                        End If
                    End If
                End If
            Next

            sw.Write("┘")
            sw.Close()
            sr.Close()
            fs.Close()
            Return True
        End If
    End Function

    Public Shared Function UpdateRecord(ByVal tblName As String, ByVal dbName As String, ByVal iValues As String, ByVal Optional iColumns As String = Nothing, ByVal Optional cField As String = Nothing, ByVal Optional cValue As String = Nothing) As Boolean
        If Not File.Exists(Datapath & "\" & dbName & "\" & tblName & ".fdb") Then
            Return False
        Else
            Dim fsr As FileStream = New FileStream(Datapath & "\" & dbName & "\" & tblName & ".fdb", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous)
            Dim fsw As FileStream = New FileStream(Datapath & "\" & dbName & "\" & tblName & ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 10000, FileOptions.Asynchronous)
            Dim sw As StreamWriter = New StreamWriter(fsw)
            Dim sr As StreamReader = New StreamReader(fsr)
            fsw.Seek(0, SeekOrigin.[End])
            Dim tCol As String = sr.ReadLine()
            Dim ColsArray As String() = tCol.Split(New Char(2) {"├"c, "┤"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)
            sw.Write(tCol)
            Dim iColumnsArray As String() = Nothing
            Dim TempiCols As Integer = 0
            Dim modifiedRow As String = ""
            Dim iValuesArray As String() = iValues.Split(New Char(0) {","c}, StringSplitOptions.RemoveEmptyEntries)
            TempiCols = iValuesArray.Length

            If iColumns IsNot Nothing Then
                iColumnsArray = iColumns.Split(","c)
                TempiCols = iColumnsArray.Length
            End If

            If cField IsNot Nothing OrElse cValue IsNot Nothing Then
                Dim cfi As Integer = Array.IndexOf(ColsArray, cField)

                While Not sr.EndOfStream
                    Dim TempStr As String = sr.ReadLine()
                    Dim RowArray As String() = TempStr.Split(New Char(2) {"└"c, "┘"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)

                    If RowArray(cfi).Trim() = cValue.Trim() Then
                        modifiedRow = ""
                        Dim k As Integer = 0

                        For i As Integer = 0 To ColsArray.Length - 1

                            If iColumnsArray IsNot Nothing Then

                                For j As Integer = 0 To TempiCols - 1

                                    If ColsArray(i) = iColumnsArray(j) Then
                                        modifiedRow += iValuesArray(j) & "~"
                                        k += 1
                                        Exit For
                                    Else

                                        If j = TempiCols - 1 Then
                                            modifiedRow += RowArray(i) & "~"
                                            Exit For
                                        End If
                                    End If
                                Next
                            End If
                        Next

                        Dim TempcValues As String() = modifiedRow.Split("~"c)
                        Dim TempModStr As String = "└"

                        For j As Integer = 0 To TempcValues.Length - 1
                            If TempcValues(j).Trim() = "" Then TempcValues(j) = "■"

                            If j < TempcValues.Length - 1 Then
                                TempcValues(j) += "│"
                            End If

                            TempModStr += TempcValues(j)
                        Next

                        TempModStr += "┘"
                        TempStr = TempModStr
                    End If

                    sw.Write(sw.NewLine & TempStr)
                End While
            Else

                While Not sr.EndOfStream
                    Dim TempStr As String = sr.ReadLine()
                    Dim RowArray As String() = TempStr.Split(New Char(2) {"└"c, "┘"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)
                    modifiedRow = ""
                    Dim k As Integer = 0

                    For i As Integer = 0 To ColsArray.Length - 1

                        For j As Integer = 0 To TempiCols - 1

                            If k <= iValuesArray.Length - 1 Then
                                modifiedRow += iValuesArray(j) & "~"
                                k += 1
                                Exit For
                            Else

                                If j <= TempiCols - 1 Then
                                    modifiedRow += RowArray(i) & "~"
                                    Exit For
                                End If
                            End If
                        Next
                    Next

                    Dim TempcValues As String() = modifiedRow.Split("~"c)
                    Dim TempModStr As String = "└"

                    For j As Integer = 0 To TempcValues.Length - 1
                        If TempcValues(j).Trim() = "" Then TempcValues(j) = "■"

                        If j < TempcValues.Length - 1 Then
                            TempcValues(j) += "│"
                        End If

                        TempModStr += TempcValues(j)
                    Next

                    TempModStr += "┘"
                    TempStr = TempModStr
                    sw.Write(sw.NewLine & TempStr)
                End While
            End If

            sw.Close()
            sr.Close()
            fsr.Close()
            fsw.Close()
            File.Copy(Datapath & "\" & dbName & "\" & tblName & ".tmp", Datapath & "\" & dbName & "\" & tblName & ".fdb", True)
            File.Delete(Datapath & "\" & dbName & "\" & tblName & ".tmp")
            Return True
        End If
    End Function

    Public Shared Function SelectRecord(ByVal tblName As String, ByVal dbName As String) As DataTable
        If Not File.Exists(Datapath & "\" & dbName & "\" & tblName & ".fdb") Then
            Return Nothing
        Else
            Dim fs As FileStream = New FileStream(Datapath & "\" & dbName & "\" & tblName & ".fdb", FileMode.Open, FileAccess.Read, FileShare.Read, 10000, FileOptions.Asynchronous)
            Dim sr As StreamReader = New StreamReader(fs)
            Dim ColsArray As String() = sr.ReadLine().Split(New Char(2) {"├"c, "┤"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)
            Dim dtData As DataTable = New DataTable()

            For i As Integer = 0 To ColsArray.Length - 1
                dtData.Columns.Add(New DataColumn(ColsArray(i), GetType(String)))
            Next

            Dim drRow As DataRow
            Dim objRowArray As Object() = New Object(ColsArray.Length - 1) {}

            While Not sr.EndOfStream
                Dim RowArray As String() = sr.ReadLine().Split(New Char(2) {"└"c, "┘"c, "│"c}, StringSplitOptions.RemoveEmptyEntries)

                For j As Integer = 0 To ColsArray.Length - 1

                    If RowArray(j) <> "■" Then
                        objRowArray(j) = RowArray(j)
                    Else
                        objRowArray(j) = ""
                    End If
                Next

                drRow = dtData.NewRow()
                drRow.ItemArray = objRowArray
                dtData.Rows.Add(drRow)
            End While

            sr.Close()
            fs.Close()
            Return dtData
        End If
    End Function
End Class

QuestionMy Vote +5 Pin
D V L19-Nov-15 20:36
professionalD V L19-Nov-15 20:36 
QuestionExtra periods Pin
Gary Strunk3-Apr-14 10:31
Gary Strunk3-Apr-14 10:31 
AnswerRe: Extra periods Pin
Anand Gunasekaran3-Apr-14 20:18
professionalAnand Gunasekaran3-Apr-14 20:18 
QuestionWhat if some field contains Special char? Pin
Pushparaj Adigopula2-Apr-14 5:56
Pushparaj Adigopula2-Apr-14 5:56 
AnswerRe: What if some field contains Special char? Pin
Anand Gunasekaran3-Apr-14 20:29
professionalAnand Gunasekaran3-Apr-14 20:29 
GeneralThoughts Pin
PIEBALDconsult2-Apr-14 3:55
mvePIEBALDconsult2-Apr-14 3:55 
GeneralRe: Thoughts Pin
Anand Gunasekaran3-Apr-14 20:32
professionalAnand Gunasekaran3-Apr-14 20:32 
GeneralRe: Thoughts Pin
SANJAY DUSANE8-Apr-14 6:28
professionalSANJAY DUSANE8-Apr-14 6:28 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.