当前位置:编程学习 > C#/ASP.NET >>

问个OracleClient的问题!!!!!!!!!!!!!!

代码如下

OracleDataAdapter DaSql = new OracleDataAdapter();
OracleCommand sqlcmd = new OracleCommand();
sqlcmd.CommandText = "select * from tableName";
sqlcmd.Connection = ConnSql;--ConnSql为链接OracleConnection
DaSql.SelectCommand = sqlcmd; 

OracleCommandBuilder sb = new OracleCommandBuilder(DaSql);
DaSql.InsertCommand = sb.GetInsertCommand();
DaSql.Fill(dtTarget)
DaSql.Update(dtTarget); --dtTarget的结构和tableName表一致

为何执行下来不会报错,但也不会把数据插入到数据库中???

--------------------编程问答-------------------- DaSql.InsertCommand 应该没有获得正确的值
试着把值打印出来看看。 --------------------编程问答-------------------- sb.GetInsertCommand().CommandText是下面这条sql

INSERT INTO DTS200810291557349 (COL1, COL2) VALUES (:p1, :p2)


帮忙看看,谢谢
--------------------编程问答-------------------- Oracle默认情况下是只提提交SQL到数据库服务器
但是并不提交事务
也就是说,对于一个Oracle会话,除非手动提交事务,否则在会话结束后全部回滚
这样自然就没有真正更新数据库了
试着用对象浏览器找一下 OracleComment 或其它 Oracle 类中是否有关 AutoCommit 或 Commit 的函数
--------------------编程问答-------------------- 这是别人写的sqlserver的,oracle应该没太大区别的 

 private void UpdateData()
        {
            //建立Connection
            SqlConnection scConnection = new SqlConnection(sConnection);
            //建立Command
            SqlCommand scCommand = scConnection.CreateCommand();
            scCommand.CommandText = "select customerID,contactName from customers";
            //建立Adapter
            sdaAdapter = new SqlDataAdapter(scCommand);

            //该对象负责生成用于更新数据库的SQL语句,不必自己创建这些语句
            scbBuilder = new SqlCommandBuilder(sdaAdapter);

            //得到数据
            sdaAdapter.Fill(dsSet, "customers");
            dgvView.DataSource = dsSet.Tables["customers"];

        }

        void btnUpdate_Click(object sender, EventArgs e)
        {
            //设置值
            dsSet.Tables["customers"].Rows[3]["contactName"] = "Thomas Hardy";
            //更新数据(UpDate方法自动遍历DataTable中的行,以找出需要对数据库作出变动)
            //Rows集合中每个DataRow对象都具有属性RowState,可以跟踪此行是否已删除、添加、修改,还是未作变动。所作的任何变化都会反映到数据库中。
            sdaAdapter.Update(dsSet, "customers");
            dgvView.DataSource = dsSet.Tables["customers"];

        }

--------------------编程问答-------------------- 另外建议你的数据库最好要设定一下主键! --------------------编程问答-------------------- DaSql.Update()
是要你的DataTable的行状态为Added的时候才会去将数据insert到你的表里. --------------------编程问答--------------------
引用 2 楼 zhenaiyongheng 的回复:
sb.GetInsertCommand().CommandText是下面这条sql 

INSERT INTO DTS200810291557349 (COL1, COL2) VALUES (:p1, :p2) 


帮忙看看,谢谢 

这是对的.这证明你的OracleCommandBuilder正确生成了insert的语句.在oracle中参数化的参数就是:xx这样的东西,同sql server中的@xx --------------------编程问答-------------------- 在DaSql.Update(dtTarget); 这行代码之前加入下面代码.你再运行你的程序看看

foreach (DataRow dr in dtTarget.Rows)
{
     dr.SetAdded();
}
--------------------编程问答-------------------- DataRowState的几个状态:
Added 该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。  
Deleted 该行已通过 DataRow 的 Delete 方法被删除。  
Detached 该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。  
Modified 该行已被修改,AcceptChanges 尚未调用。  
Unchanged 该行自上次调用 AcceptChanges 以来尚未更改。 

示例如下:

private void DemonstrateRowState() {
   //Run a function to create a DataTable with one column.
   DataTable myTable = MakeTable();
   DataRow myRow;

   // Create a new DataRow.
   myRow = myTable.NewRow();
   // Detached row.
   Console.WriteLine("New Row " + myRow.RowState);

   myTable.Rows.Add(myRow);
   // New row.
   Console.WriteLine("AddRow " + myRow.RowState);

   myTable.AcceptChanges();
   // Unchanged row.
   Console.WriteLine("AcceptChanges " + myRow.RowState);

   myRow["FirstName"] = "Scott";
   // Modified row.
   Console.WriteLine("Modified " + myRow.RowState);

   myRow.Delete();
   // Deleted row.
   Console.WriteLine("Deleted " + myRow.RowState);
}

private DataTable MakeTable(){
   // Make a simple table with one column.
   DataTable dt = new DataTable("myTable");
   DataColumn dcFirstName = new DataColumn("FirstName", Type.GetType("System.String"));
   dt.Columns.Add(dcFirstName);
   return dt;
}

补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,