ODP.Net基础应用——数据更新

  • 插入、删除、更新
  • 利用DataGridView控件更新数据库

插入、删除、更新

OracleCommand.ExecuteNonQuery()方法可执行不需要返回值的声明,如INSERT,UPDATE,DELETE,ALTER TABLE和CREATE TABLE。

try
{
    _conn.Open();

    //insert
    OracleCommand _cmd = _conn.CreateCommand();
    _cmd.CommandText = "INSERT INTO PRODUCTS(ID,NAME,PRICE) VALUES(:v_Id,:v_Name,:v_Price)";
    _cmd.Parameters.Add(new OracleParameter("v_Id", "M1"));
    _cmd.Parameters.Add(new OracleParameter("v_Name", "Mudguards"));
    _cmd.Parameters.Add(new OracleParameter("v_Price", "250.5"));
    _cmd.ExecuteNonQuery();

    //update
    _cmd.CommandText = "UPDATE PRODUCTS SET REMARKS=:v_Remarks WHERE ID=:v_Id";
    _cmd.Parameters.Clear();
    _cmd.Parameters.Add(new OracleParameter("v_Remarks", "Quality mud guards"));
    _cmd.Parameters.Add(new OracleParameter("v_Id", "M1"));
    _cmd.ExecuteNonQuery();

    _cmd.CommandText = "DELETE FROM PRODUCTS WHERE ID=:v_Id";
    _cmd.Parameters.Clear();
    _cmd.Parameters.Add(new OracleParameter("v_Id", "M1"));
    _cmd.ExecuteNonQuery();

    _conn.Close();
    _conn.Dispose();
    _conn = null;
    Console.WriteLine("done");
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString(), "Error connecting to Oracle");
}

利用DataGridView控件更新数据库

下面做一个相对完整的小应用,实现以下功能:
1、连接数据库并将表格的内容显示在DataGridView控件中;
2、用户可更改DataGridView控件中的内容,包括修改已存在的行,增加行,删除行;
3、提交到数据库,进行表格数据的更新。
先贴代码:

private DataSet ds = null;
 private string connString = "User Id=****;Password=****;" +
                "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=****)(PORT=1521))" +
                "(CONNECT_DATA=(SID=****)))";

//连接数据库
private void BTN_conn_Click(object sender, EventArgs e)
{
    OracleConnection _conn = new OracleConnection(connString);
    try
    {
        _conn.Open();
        if (ds == null)
            ds = new DataSet();
        else
            ds.Clear();

        OracleCommand _cmd = _conn.CreateCommand();
        _cmd.CommandText = "SELECT * FROM PRODUCTS";

        OracleDataAdapter _adapter= new OracleDataAdapter(_cmd);
        _adapter.Fill(ds);

        _conn.Close();
        _conn.Dispose();
        _conn = null;
        Console.WriteLine("done");
        f_DataGridView.DataSource = ds.Tables[0];
        f_DataGridView.Rows[0].Selected = false;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(), "Error connecting to Oracle");
    }
}

//增加一行(关闭了控件的AllowUserToAddRows,因为嫌丑,所里这里加了一个增加行的接口)
private void Btn_AddRow_Click(object sender, EventArgs e)
{
    if (ds == null || ds.Tables.Count <=0 || ds.Tables[0].Rows.Count <= 0)
        return;
    DataRow dr = ds.Tables[0].NewRow();
    ds.Tables[0].Rows.Add(dr);
}

//提交更新,根据表格结构定义OracleDataAdapter的UpdateCommand、InsertCommand和DeleteCommand
private void Btn_UpdateTable_Click(object sender, EventArgs e)
{
    string _sqlString;
    try
    {
        OracleConnection _conn = new OracleConnection(connString);
        _conn.Open();
        OracleCommand _cmd = _conn.CreateCommand();
        OracleDataAdapter _adapter = new OracleDataAdapter(_cmd);

        //update
        _sqlString = "UPDATE PRODUCTS SET NAME=:v_Name,PRICE=:v_Price,REMARKS=:v_Remarks WHERE ID=:v_Id";
        _adapter.UpdateCommand = new OracleCommand(_sqlString, _conn);
        _adapter.UpdateCommand.Parameters.Add(new OracleParameter("v_Name", OracleDbType.Varchar2, 255, "NAME"));
        _adapter.UpdateCommand.Parameters.Add(new OracleParameter("v_Price", OracleDbType.Decimal, 10, "PRICE"));
        _adapter.UpdateCommand.Parameters.Add(new OracleParameter("v_Remarks", OracleDbType.Varchar2, 4000, "REMARKS"));
        _adapter.UpdateCommand.Parameters.Add(new OracleParameter("v_Id", OracleDbType.Varchar2, 10, "ID"));

        //insert
        _sqlString = "INSERT INTO PRODUCTS(NAME,PRICE,REMARKS,ID) VALUES(:v_Name,:v_Price,:v_Remarks,:v_Id)";
        _adapter.InsertCommand = new OracleCommand(_sqlString, _conn);
        _adapter.InsertCommand.Parameters.Add(new OracleParameter("v_Name", OracleDbType.Varchar2, 255, "NAME"));
        _adapter.InsertCommand.Parameters.Add(new OracleParameter("v_Price", OracleDbType.Decimal, 10, "PRICE"));
        _adapter.InsertCommand.Parameters.Add(new OracleParameter("v_Remarks", OracleDbType.Varchar2, 4000, "REMARKS"));
        _adapter.InsertCommand.Parameters.Add(new OracleParameter("v_Id", OracleDbType.Varchar2, 10, "ID"));

        //delete
        _sqlString = "DELETE FROM PRODUCTS WHERE ID=:v_Id";
        _adapter.DeleteCommand = new OracleCommand(_sqlString, _conn);
        _adapter.DeleteCommand.Parameters.Add(new OracleParameter("v_Id", OracleDbType.Varchar2, 10, "ID"));

        _adapter.Update(ds);
        _conn.Close();
        _conn.Dispose();
        _conn = null;
        MessageBox.Show("Dataset committed");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

删除操作这里并没有写,有兴趣的可以自己尝试一下,删除指定行的代码可以使用:

f_DataGridView.Rows.Remove(f_DataGridView.SelectedRows[0]);

运行程序并连接数据库:

这里写图片描述

修改表格内容并提交:

这里写图片描述

再次连接数据库查看表格内容:
这里写图片描述

命令对象生成

当表格的列非常多的时候,定义UpdateCommand、InsertCommand和DeleteCommand将会十分繁琐。ODP.Net提供了OracleCommandBuilder类,用以自动生成Update、Insert和Delete命令对象。

下面对提交更新的函数进行修改:

private void Btn_UpdateTable_Click(object sender, EventArgs e)
{
    string _sqlString;
    try
    {
        OracleConnection _conn = new OracleConnection(connString);
        _conn.Open();
        _sqlString = "SELECT * FROM PRODUCTS";
        OracleCommand _cmd = _conn.CreateCommand();
        OracleDataAdapter _adapter = new OracleDataAdapter(_sqlString, _conn);
        OracleCommandBuilder _cmdBuilder = new OracleCommandBuilder(_adapter);

        ds.Tables[0].Columns["ID"].Unique = true;//指定Unique列,以告诉OracleCommandBuilder哪个是主键

        _adapter.Update(ds);
        _conn.Close();
        _conn.Dispose();
        _conn = null;
        MessageBox.Show("Dataset committed");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

再来编译运行,添加一列,提交
这里写图片描述

notes:

OracleCommandBuilder只能用于单表更新,如果在查询中用到了连接进行多表查询,则只能hand-code定义UpdateCommand、InsertCommand和DeleteCommand。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值