Search This Blog

Monday, October 25, 2010

Reading, manipulating an Xml file using C#.Net(including images)

Objective:
     To develop a windows application to read an xml file; perform insert, search, update, delete operations,navigation of records and display respective images.

Design:



Design the form as above with 1 DataGridView, 1 PictureBox control, 2 OpenFileDialog controls, 4 Labels, 4 TextBoxes and 12 Buttons.

->PictureBox1 Properties:
    BorderStyle=Fixed3D; SizeMode=StrechImage


Code:

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using System.IO;

namespace xmlapp
{
    public partial class studdata : Form
    {  
        public studdata()
        {
            InitializeComponent();
        }
        DataSet ds; string fpath, fdir, ppath, pname, pdestin; int rno = 0; DataRow drow;     
     
        private void loadbtn_Click(object sender, EventArgs e)
        {
            try
            {   
                openFileDialog1.Filter = "xml|*.xml|all files|*.*";
                DialogResult res = openFileDialog1.ShowDialog();
                if (res == DialogResult.OK)
                {
                    dataGridView1.DataSource = null;
                    clearbtn.PerformClick();
                    fpath = openFileDialog1.FileName;
                    ds = new DataSet();
                    ds.ReadXml(fpath);              
                    //setting primary key inorder to search a record using finding method
                    ds.Tables[0].Constraints.Add("pk_sno", ds.Tables[0].Columns[0], true);
                    dataGridView1.DataSource = ds.Tables[0];
                    fdir = fpath.Substring(0, fpath.LastIndexOf("\\") + 1);
                    showdata();
                }
            }
            catch
            { MessageBox.Show("invalid input");  }
        }

        void showdata()
        { 
            if (ds.Tables[0].Rows.Count > 0)
            { 
                pictureBox1.Image = null;
                sno_txtbx.Text = ds.Tables[0].Rows[rno][0].ToString();
                sname_txtbx.Text = ds.Tables[0].Rows[rno][1].ToString();
                course_txtbx.Text = ds.Tables[0].Rows[rno][2].ToString();
                fee_txtbx.Text = ds.Tables[0].Rows[rno][3].ToString();
                pictureBox1.ImageLocation = fdir + ds.Tables[0].Rows[rno][4].ToString();
            }
            else
                MessageBox.Show("No records");
        }
             
        private void browsebtn_Click(object sender, EventArgs e)
        {
            openFileDialog2.InitialDirectory = fdir;
            openFileDialog2.Filter = "bmp,jpeg,png|*.bmp;*.jpg;*.png|all files|*.*";
            DialogResult res = openFileDialog2.ShowDialog();
            if (res == DialogResult.OK)

            {
                pictureBox1.ImageLocation = openFileDialog2.FileName;
            }
        }

        private void insertbtn_Click(object sender, EventArgs e)
        {
            drow = null;
            drow = ds.Tables[0].Rows.Find(sno_txtbx.Text);
            if (drow == null)
            {
                drow = ds.Tables[0].NewRow();
                drow[0] = sno_txtbx.Text;
                drow[1] = sname_txtbx.Text;
                drow[2] = course_txtbx.Text;
                drow[3] = fee_txtbx.Text;

                phototask();   
                drow[4] = pname;

                ds.Tables[0].Rows.Add(drow);
                rno = ds.Tables[0].Rows.IndexOf(drow);

                ds.WriteXml(fpath);
                MessageBox.Show("record inserted");
            }
            else
            MessageBox.Show("sno. should be unique");
        }
        void phototask()
        {
            //finding name of photo ,saving it in directory of xml file with unique name(sno+photo name)
            ppath = pictureBox1.ImageLocation;
            pname = sno_txtbx.Text + ")" + (ppath.Substring(ppath.LastIndexOf('\\') + 1));//(sno + photo name)
            pdestin = fdir + pname;
            pictureBox1.Image.Save(pdestin);//saving photo on disk
        }

        private void searchbtn_Click(object sender, EventArgs e)
        {
                   
            int n = Convert.ToInt32(Interaction.InputBox("Enter sno to search:", "Search", "10", 200, 200));
            //searching using find method
            drow = null;
            drow = ds.Tables[0].Rows.Find(n);
            if (drow != null)
            {
                rno = ds.Tables[0].Rows.IndexOf(drow);
                sno_txtbx.Text = drow[0].ToString();
                sname_txtbx.Text = drow[1].ToString();
                course_txtbx.Text = drow[2].ToString();
                fee_txtbx.Text = drow[3].ToString();
                pictureBox1.ImageLocation = fdir + drow[4];
            }
            else
                MessageBox.Show("record not found");
           
        }
       
        private void updatebtn_Click(object sender, EventArgs e)
        {
          
            DataRow drow = ds.Tables[0].Rows.Find(sno_txtbx.Text);
            if (drow!= null)
            {
                rno = ds.Tables[0].Rows.IndexOf(drow);

                ds.Tables[0].Rows[rno][0] = sno_txtbx.Text;
                ds.Tables[0].Rows[rno][1] = sname_txtbx.Text;
                ds.Tables[0].Rows[rno][2] = course_txtbx.Text;
                ds.Tables[0].Rows[rno][3] = fee_txtbx.Text;

                File.Delete(fdir + drow[4]);
                phototask();

                ds.Tables[0].Rows[rno][4] = pname;

                ds.WriteXml(fpath);
                MessageBox.Show("record updated");
            }
            else
            MessageBox.Show("no record exists with this sno.");
        }

        private void deletebtn_Click(object sender, EventArgs e)
        {
          
            DataRow drow = ds.Tables[0].Rows.Find(sno_txtbx.Text);
            if (drow!= null)
            {
                File.Delete(fdir + drow[4]);
                ds.Tables[0].Rows.Remove(drow);  
                ds.WriteXml(openFileDialog1.FileName);
                MessageBox.Show("record deleted");
                rno = 0;
                showdata();
            }
            else
                MessageBox.Show("no record exists with this sno.");
        }

        private void firstbtn_Click(object sender, EventArgs e)
        {
            rno = 0;
            showdata();
        }

        private void prevbtn_Click(object sender, EventArgs e)
        {
            if (rno > 0)
            {
                rno--;
                showdata();
            }
            else
            { MessageBox.Show("first record"); }
        }

        private void nextbtn_Click(object sender, EventArgs e)
        {
            if (rno < ds.Tables[0].Rows.Count - 1)
            {
                rno++;
                showdata();
            }
            else
            { MessageBox.Show("LastRecord"); }
        }

        private void lastbtn_Click(object sender, EventArgs e)
        {
            rno = ds.Tables[0].Rows.Count - 1;
            showdata();
        }
       
        private void clearbtn_Click(object sender, EventArgs e)
        {
            sno_txtbx.Text = sname_txtbx.Text = course_txtbx.Text = fee_txtbx.Text = "";
            pictureBox1.Image = null;
        }
       
        private void exitbtn_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}
--------

Note:
i)In this application, we will search a record by taking input from the InputBox. For this we have to add reference to Microsoft.VisualBasic.

Adding a Reference:
 Goto Project Menu
->Add Reference -> select 'Microsoft.VisualBasic' from .NET tab.
Inorder to use this we have to include the namespace:
‘using Microsoft.VisualBasic’

ii) xml file and respective jpeg images should be maintained in same folder.

Example for Creating an xml file:
Open notepad and type the following & save it with extension ‘.xml’
--------
<students>
  <student>
    <sno>10</sno>
    <sname>Prashanth</sname>
    <course>dotnet</course>
    <fee>3500</fee>
    <photo>10)prash.jpg</photo>
  </student>
  <student>
    <sno>20</sno>
    <sname>Aravind</sname>
    <course>oracle</course>
    <fee>1000</fee>
    <photo>20)aravind.jpg</photo>
  </student>
  <student>
    <sno>30</sno>
    <sname>Satyapal</sname>
    <course>java</course>
    <fee>3000</fee>    <photo>30)satya.jpg</photo>
  </student>
  <student>
    <sno>40</sno>
    <sname>Mahender</sname>
    <course>php</course>
    <fee>2500</fee>
    <photo>40)mahi.jpg</photo>
  </student>
</students>

Execution:
 To execute application click loadxml button and select an xml file
(a folder ‘student data’ consisting xml file is placed in ‘xmlapp.zip’ along with source code)

------------------------------

Another way of handling xml file:
->performing operations on xml file and saving changes, which includes
   creating xml elements(tags), assigning values, appending them to xml root element,...
(for this we have to include namespace 'using System.Xml')

Example to insert a record:

           XmlDocument doc = new XmlDocument();
           doc.Load(openFileDialog1.FileName);

            XmlElement root = doc.CreateElement("student")
            XmlElement sno = doc.CreateElement("sno");
            XmlElement sname = doc.CreateElement("sname");
            XmlElement course = doc.CreateElement("course");
            XmlElement fee = doc.CreateElement("fee");
            XmlElement photo = doc.CreateElement("photo");

            sno.InnerText = sno_txtbx.Text;
            sname.InnerText = sname_txtbx.Text;
            course.InnerText = course_txtbx.Text;
            fee.InnerText = fee_txtbx.Text;

      phototask();//refer ‘Code’ for phototask()
            photo.InnerText == pname;

            root.AppendChild(sno);
            root.AppendChild(sname);
            root.AppendChild(course);
            root.AppendChild(fee);
            root.AppendChild(photo);

            doc.DocumentElement.AppendChild(root);
            doc.Save(fdir);
            MessageBox.Show("record inserted");    

Wednesday, October 13, 2010

Inserting & Retrieving records from M.S.Access-2007 using Odbc in C#.net

Objective:          To develop a windows application for performing insert, search, update, delete operations & navigation of M.S.Access 2007 records using Odbc connection.
Introduction:
Create a table in M.S.Access 2007 file and populate it.
In our application we use ‘stud.accdb’ (M.S.Access 2007) file, which consists ‘student’ table.
(Note: ‘stud.accdb’ is placed in ‘prash_access07.zip’ along with source code)

Creating and Configuring ODBC Data Source (dsn):
Go to Start Menu -> Control Panel -> Administrative Tools -> Data Sources (ODBC)





Click on ‘Add’ button
-> Select ‘Microsoft Access Driver (*.mdb, *.accdb)’ ->click on ‘Finish’ button.
Give a name to your Data Source
Click on ‘Select’ button and select your M.S.Access 2007 file (*.accdb) -> OK -> OK
Your Data Source Name will be specified in ‘ODBC Data Source Administrator’ window
->Click on ‘OK’ button.

Thus, your Data Source (dsn) is configured.

Design:


Design the form as above with a DataGridView, 3 Labels, 3 TextBoxes, 10 buttons.


Introduction to Code:

As we want to use Odbc Connection include the namespace:

'using System.Data.Odbc'

For accesing records from M.S.Access-2003 file we use 'Jet' driver,

But for accesing records from M.S.Access-2003 file we use 'Ace' driver.

In this application, we will search a record by taking input from the InputBox. For this we have to add reference to Microsoft.VisualBasic.

Adding a Reference:

Goto Project Menu ->Add Reference -> select 'Microsoft.VisualBasic' from .NET tab.

In order to use this we have to include the namespace:

'using Microsoft.VisualBasic'

Odbc connection string:
Syntax:
OdbcConnection con = new OdbcConnection("dsn=<Data Source Name>");
Ex:
OdbcConnection con = new OdbcConnection(“dsn=myaccess07dsn ");

You just need to specify the Data Source Name(dsn) in the Connection String, no need to specify the driver details and path of the file, you dsn will take care of it.

Creating a primary key in the dataTable:

In this app. we use Find() method to search a record, which requires details of primarykey column for database tables; this is provided using statement:
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

But as we don't have any primarykey column in M.S.Access table, we have to create a primary key column in datatable.
Ex:
ds.Tables[0].Constraints.Add("pk_sno", ds.Tables[0].Columns[0], true);

Pointing to current record in dataTable:

After searching a record, we have to get the index of that record so that we can show next and previous records when we press '>>'(next) and '<<'(previous) buttons.
Ex:
rno= ds.Tables[0].Rows.IndexOf(drow);
-------------

Code:
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.Odbc;
using Microsoft.VisualBasic;

namespace prash_access07
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        OdbcConnection con;
        OdbcCommand cmd;
        OdbcDataAdapter adapter;
        DataSet ds;
        int rno;

        private void Form1_Load(object sender, EventArgs e)
        {
            con = new OdbcConnection("dsn=myaccess07dsn");
            //stud.accdb->access07 filename
            loaddata();
            showdata();
        }
        void loaddata()
        {
            adapter = new OdbcDataAdapter("select * from student", con);
            ds = new DataSet();//student-> table name in stud.accdb file
            adapter.Fill(ds, "student");
            ds.Tables[0].Constraints.Add("pk_sno", ds.Tables[0].Columns[0], true);//creating primary key for Tables[0] in dataset
            dataGridView1.DataSource = ds.Tables[0];
        }
        void showdata()
        {
            textBox1.Text = ds.Tables[0].Rows[rno][0].ToString();
            textBox2.Text = ds.Tables[0].Rows[rno][1].ToString();
            textBox3.Text = ds.Tables[0].Rows[rno][2].ToString();
        }
     
        private void btnFirst_Click(object sender, EventArgs e)
        {
            if (ds.Tables[0].Rows.Count > 0)
            {
                rno = 0;
                showdata();
            }
            else
                MessageBox.Show("no records");
        }

        private void btnPrevious_Click(object sender, EventArgs e)
        {
            if (ds.Tables[0].Rows.Count > 0)
            {
                if (rno > 0)
                {
                    rno--;
                    showdata();
                }
                else
                    MessageBox.Show("First Record");
            }
            else
                MessageBox.Show("no records");
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
            if (ds.Tables[0].Rows.Count > 0)
            {
                if (rno < ds.Tables[0].Rows.Count - 1)
                {
                    rno++;
                    showdata();
                }
                else
                    MessageBox.Show("Last Record");

            }
            else
                MessageBox.Show("no records");
        }

        private void btnLast_Click(object sender, EventArgs e)
        {
            if (ds.Tables[0].Rows.Count > 0)
            {
                rno = ds.Tables[0].Rows.Count - 1;
                showdata();
            }
            else
                MessageBox.Show("no records");
        }

        private void btnInsert_Click(object sender, EventArgs e)
        {
            cmd = new OdbcCommand("insert into student values(" + textBox1.Text + ",' " + textBox2.Text + " ',' " + textBox3.Text + " ')", con);
            con.Open();
            int n = cmd.ExecuteNonQuery();
            con.Close();

            if (n > 0)
            {
                MessageBox.Show("record inserted");
                loaddata();
            }
            else
                MessageBox.Show("insertion failed");
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            int n = Convert.ToInt32(Interaction.InputBox("Enter sno:", "Search", "20", 200, 200));
            DataRow drow = ds.Tables[0].Rows.Find(n);
            if (drow != null)
            {
                rno = ds.Tables[0].Rows.IndexOf(drow);
                textBox1.Text = drow[0].ToString();
                textBox2.Text = drow[1].ToString();
                textBox3.Text = drow[2].ToString();
            }
            else
                MessageBox.Show("Record not found");
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            cmd = new OdbcCommand("update student set sname='" + textBox2.Text + "',course='" + textBox3.Text + "' where sno=" + textBox1.Text, con);
            con.Open();
            int n = cmd.ExecuteNonQuery();
            con.Close();
            if (n > 0)
            {
                MessageBox.Show("Record Updated");
                loaddata();
            }
            else
                MessageBox.Show("Update failed");
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            cmd = new OdbcCommand("delete from student where sno=" + textBox1.Text, con);
            con.Open();
            int n = cmd.ExecuteNonQuery();
            con.Close();
            if (n > 0)
            {
                MessageBox.Show("Record Deleted");
                loaddata();
            }

            else
                MessageBox.Show("Deletion failed");
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox2.Text = textBox3.Text = "";
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    
    }
}