先上代码:
public class DBO
{
public DataSet ds;
private OracleConnection conn;
private OracleDataAdapter da; public DBO()
{
try
{
ds = new DataSet();
conn = new OracleConnection("ConnectionString");
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
da = new OracleDataAdapter("SELECT * FROM TableName", conn);
da_directory.Fill(ds);
ds.Tables[0].TableName = "TableName";
conn.Close();
}
catch (Exception ex)
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
} public int UpdateDB()
{
try
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
OracleCommandBuilder builder = new OracleCommandBuilder(da);
da.InsertCommand = builder.GetInsertCommand();
da.DeleteCommand = builder.GetDeleteCommand();
da.UpdateCommand = builder.GetUpdateCommand();
int result = da.Update(ds.Tables["TableName"]);
conn.Close();
return result;
}
catch (Exception ex)
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
throw ex;
}
}
}业务层调用后,修改了ds中的数据,断点跟踪发现在da.Update(ds.Tables["TableName"])执行之前,修改的结果还在,执行也不报错,就是数据库中的数据没有更新。
public class DBO
{
public DataSet ds;
private OracleConnection conn;
private OracleDataAdapter da; public DBO()
{
try
{
ds = new DataSet();
conn = new OracleConnection("ConnectionString");
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
da = new OracleDataAdapter("SELECT * FROM TableName", conn);
da_directory.Fill(ds);
ds.Tables[0].TableName = "TableName";
conn.Close();
}
catch (Exception ex)
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
} public int UpdateDB()
{
try
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
OracleCommandBuilder builder = new OracleCommandBuilder(da);
da.InsertCommand = builder.GetInsertCommand();
da.DeleteCommand = builder.GetDeleteCommand();
da.UpdateCommand = builder.GetUpdateCommand();
int result = da.Update(ds.Tables["TableName"]);
conn.Close();
return result;
}
catch (Exception ex)
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
throw ex;
}
}
}业务层调用后,修改了ds中的数据,断点跟踪发现在da.Update(ds.Tables["TableName"])执行之前,修改的结果还在,执行也不报错,就是数据库中的数据没有更新。
解决方案 »
- CS1061: “System.Web.UI.WebControls.GridViewDeletedEventArgs”不包含“RowIndex”的定义,并且找
- 通过DataSet更新数据库效率如何?
- ASP.NET 中Input Type=Text放入到Table中时右边被复盖的问题
- 无法更新bit字段
- 没分了!(孟子、思归、速马等爱帮人的都来看看)你说可能吗?
- 关于水晶报表的特难问题,请各路好手进来Show一Show!
- 我的递归老是无法成功执行
- 好几个日夜了,终于四个了 :) 可我的可用分还是130 :( 真可怜啊!!!
- “思归”大侠,请进,关于frame调用的问题
- 微软高手 请问在ASP.NET中使用非托管COM组件?
- C#定义Access数据库问题,如何定义可以定义到一个文件中整个项目中可以使用,而且使用的是相对路径。
- 脚本错误 ...在线等
da.DeleteCommand = builder.GetDeleteCommand();
da.UpdateCommand = builder.GetUpdateCommand(); if (conn.State == ConnectionState.Closed)
{
conn.Open();
}conn.Close();
这个几行是多余的,可以不写数据表是否有主键
我都是把数据取回来处理,最后一次更新来减少访问数据库的次数,所以必须更新整张表。
如果da.InsertCommand = builder.GetInsertCommand()这种代码不必要,那还有什么方法能给da指定Insert、Update、Delete命令呢?
另外 Oracle 在Update 后 是不是应该 commit 下呢???
try catch取消,无效。
commit是DataAdapter的方法么?找不到啊
是不是这样用的,代码修改ds的数据,用da更新?
DataColumn[] keys = new DataColumn[1];
keys[0] = dtDetail.Columns["pk_OrderDetail"];
dtDetail.PrimaryKey = keys;
试试看。
是不是用代码直接修改ds.Tables[].Rows[][]这样做是错的?
业务层调用DBO的时候,每次修改完都多写了一个dbo.AcceptChanges(),这样没有更新数据库,但所有的行都变成了“UnChanged”……
折腾了一下午就因为这个……晕倒了……
谢谢大家,结帖!