首页 > 代码库 > C# 操作Access数据库

C# 操作Access数据库

<pre name="code" class="csharp"><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">                                                                                                           </span><span style="font-family: Arial, Helvetica, sans-serif; font-weight: normal; background-color: rgb(255, 255, 255);"><span style="font-size:24px;">c#  操作Access数据库</span></span>

这两天做项目,需要将数据存储到Access数据库中,并在DataGridView控件中显示出来。Access数据库的语法与SQL的有所不同,在此总结一下数据库的连接以及增删改基本操作。
在程序开始时,我打算使用一些数据库操作语句来创建一个数据库,不过好像用的不是很成功。而且如果要手动创建数据库,则在启动程序时,要判断没有某张表时,要创建该表。
1.首先要连接数据库:
其中的SewWorkStation.accdb为项目中要用到的数据库。
  public static string dbPath = System.Windows.Forms.Application.StartupPath + "\\SewWorkStation.accdb";
        public string dbName = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+dbPath+";";
        public OleDbConnection oleDbConn = null;
        public DBOperate()
        {
            oleDbConn = new OleDbConnection(dbName);
        }

2.用语句创建表:
  
 public void CreateRobotTable( )
        {
            try
            {
                oleDbConn.Open();
                string excuteStr = "Create Table t_Robot (rId int ,rName text,rIP text,rPort text)";
                OleDbCommand oleDbComm = new OleDbCommand(excuteStr, oleDbConn);
                oleDbComm.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                oleDbConn.Close();
            }
        }

当然也可以在外部建立好数据库建好表,然后在程序中只进行增删改操作,这样也不用检查表是否存在了。
大家可能看到我这里创建表的属性,与下面查询时表的属性不一致哈~,其实我是在外部创建好一个空的表的,这里面只是记录下语法啦。

在网上查到了一段代码,判断数据库中是否存在某表,不过我执行了几次,就是刚创建了表也找不到,dtTable中是空的,大家如果有什么好的方法可以提醒我一下,微笑
  public bool VerifyTableInAccess( string TableName)
        {
            bool flag = false;
            try
            {
                oleDbConn.Open();
                DataTable dtTable = oleDbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, TableName });
                if (dtTable == null)
                {
                    flag = false;
                    return flag;
                }
                foreach (DataRow DRow in dtTable.Rows)
                {
                    if (DRow["TABLE_NAME"].ToString().Trim().ToUpper() == TableName.Trim().ToUpper())
                    {
                        flag = true;
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                flag = false;
            }
            finally
            {
                oleDbConn.Close();
            }
            return flag;
        }


3.预览表
 
public void ShowTable( string tableName,DataGridView dataGridView )
        {
            try
            {
                oleDbConn.Open();
                DataSet dataSet = new DataSet();
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                OleDbCommand command = new OleDbCommand("select * from " + tableName, oleDbConn);
                adapter.SelectCommand = command;
                adapter.Fill(dataSet);
                dataGridView.DataSource = dataSet.Tables[0];
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                oleDbConn.Close();
            }
        }
这里面使用到了适配器OleDbDataAdapter,也可以使用OleDbDataReader来读取。
4.添加数据
  public void Insert(string  table, object obj )
        {
            string insertStr = "";
           
            try
            {
                oleDbConn.Open();
                OleDbCommand oleDbComm = null;
                switch (table)
                {
                    case "t_Robot":
                        MRobot robot = (MRobot)obj;
                        insertStr = "Insert into t_Robot(机器人编号,机器人名称,机器人IP,机器人端口) Values(?,?,?,?)";
                        oleDbComm = new OleDbCommand(insertStr, oleDbConn);
                        oleDbComm.Parameters.AddWithValue("机器人编号", robot.Id);
                        oleDbComm.Parameters.AddWithValue("机器人名称", robot.Name);
                        oleDbComm.Parameters.AddWithValue("机器人IP", robot.IP);
                        oleDbComm.Parameters.AddWithValue("机器人端口", robot.Port);
                        break;
                    default:
                        break;
                }
                if (!"".Equals(insertStr))
                {
                    oleDbComm.ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                oleDbConn.Close();
            }       
这里要添加数据,就需要参数化查询的方式,使用OleDbCommand.Parameters这个属性了。
5.删除数据
通过id来删除数据,开始时使用了Access中自动的Id,但发现即使删了一条数据后,后面数据的id没有自动更新,如果再新添加一条数据,id是max(id)+1,这点要注意。
   public void Delete(string table,int id  )
        {
            string delStr = "";
            string paramName = "";
            try
            {
                switch(table)
                {
                    case "t_Robot":
                          delStr = "Delete * from t_Robot where 机器人编号=?";
                          paramName = "rId";
                          break;
                    default:
                          break;
                }
                if(!"".Equals(delStr))
                {
                    oleDbConn.Open();
                    OleDbCommand oleDbComm = new OleDbCommand(delStr, oleDbConn);
                    oleDbComm.Parameters.AddWithValue(paramName, id);
                    oleDbComm.ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);

            }

6.更新id
 public void UpdateId(string table ,int id  )
        {
            string updateStr = "";
            try
            {
                oleDbConn.Open();
                OleDbCommand oleDbComm = null;
                switch (table)
                {
                    case "t_Robot":
                        updateStr = "update t_Robot set 机器人编号 = 机器人编号-1   where 机器人编号>@index";
                        break;
                    default:
                        break;
                }
                if (!"".Equals(updateStr))
                {
                    oleDbComm = new OleDbCommand(updateStr, oleDbConn);
                    oleDbComm.Parameters.AddWithValue("@index",id);
                    oleDbComm.ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                oleDbConn.Close();
            }       
        }
注意喔,上面的更新语句中是update  tableName set id = id -1 where id > delId ; 看到没里面没有select...,Access的更新语句与sql的update语句不同。
7.修改数据
   public void Update(string table ,object obj )
        {
            string updateStr = "";
            try
            {
                oleDbConn.Open();
                OleDbCommand oleDbComm = null;
                switch (table)
                {
                    case "t_Robot":
                        MRobot robot = (MRobot)obj;
                        updateStr = "update t_Robot set 机器人名称=?,机器人IP=?,机器人端口=? where 机器人编号=?";
                        oleDbComm = new OleDbCommand(updateStr, oleDbConn);
                        oleDbComm.Parameters.AddWithValue("机器人名称", robot.Name);
                        oleDbComm.Parameters.AddWithValue("机器人IP", robot.IP);
                        oleDbComm.Parameters.AddWithValue("机器人端口", robot.Port);
                        oleDbComm.Parameters.AddWithValue("机器人编号", robot.Id);
                        break;
                    default:
                        break;
                }
                if(!"".Equals(updateStr))
                {
                  oleDbComm.ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                oleDbConn.Close();
            }       
        }



C# 操作Access数据库