数据库死活没有反应
目的是把objdataset1的数据插到tempdata中,这两个都是dataset
并且和Gridview2绑定显示,数据成功插入tempdata
但是最后一步Updata却无反应,
表设置了主键 String DatabaseConnectString = "Data Source=orcl;Persist Security Info=True;User ID=scott;Password=cat;";
OracleConnection OracleConn = new OracleConnection(DatabaseConnectString);
OracleConn.Open();
OracleDataAdapter adapter=new OracleDataAdapter();
OracleCommand slc = new OracleCommand("SELECT * FROM DUMMY_DOMAIN", OracleConn); adapter.SelectCommand = slc;
OracleCommandBuilder ocb = new OracleCommandBuilder(adapter); DataSet tempData = new DataSet();
adapter.FillSchema(tempData, SchemaType.Source, "DUMMY_DOMAIN");
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adapter.Fill(tempData,"DUMMY_DOMAIN");
foreach (DataRow dr in objDataset1.Tables[0].Rows)
{
tempData.Tables[0].ImportRow(dr);
} GridView2.DataSource = tempData;
GridView2.DataBind(); adapter.Update(tempData, "DUMMY_DOMAIN"); OracleConn.Close();
目的是把objdataset1的数据插到tempdata中,这两个都是dataset
并且和Gridview2绑定显示,数据成功插入tempdata
但是最后一步Updata却无反应,
表设置了主键 String DatabaseConnectString = "Data Source=orcl;Persist Security Info=True;User ID=scott;Password=cat;";
OracleConnection OracleConn = new OracleConnection(DatabaseConnectString);
OracleConn.Open();
OracleDataAdapter adapter=new OracleDataAdapter();
OracleCommand slc = new OracleCommand("SELECT * FROM DUMMY_DOMAIN", OracleConn); adapter.SelectCommand = slc;
OracleCommandBuilder ocb = new OracleCommandBuilder(adapter); DataSet tempData = new DataSet();
adapter.FillSchema(tempData, SchemaType.Source, "DUMMY_DOMAIN");
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adapter.Fill(tempData,"DUMMY_DOMAIN");
foreach (DataRow dr in objDataset1.Tables[0].Rows)
{
tempData.Tables[0].ImportRow(dr);
} GridView2.DataSource = tempData;
GridView2.DataBind(); adapter.Update(tempData, "DUMMY_DOMAIN"); OracleConn.Close();
GridView2.DataSource = tempData;
GridView2.DataBind();
把插入之后tempdata显示在页面上
显示出插入后的数据
update后用sqlplus查数据库发现没有东西插入...
但是写sqlcommand然后执行是可以的
ocb.GetUpdateCommand().CommandText
update之后,加上AcceptChanges()方法
"DELETE FROM DUMMY_DOMAIN WHERE ((DQ_NUM = :p1) AND ((:p2 = 1 AND DQ_NAME IS NULL) OR (DQ_NAME = :p3)) AND ((:p4 = 1 AND DQ_TEXT IS NULL) OR (DQ_TEXT = :p5)))""UPDATE DUMMY_DOMAIN SET DQ_NUM = :p1, DQ_NAME = :p2, DQ_TEXT = :p3 WHERE ((DQ_NUM = :p4) AND ((:p5 = 1 AND DQ_NAME IS NULL) OR (DQ_NAME = :p6)) AND ((:p7 = 1 AND DQ_TEXT IS NULL) OR (DQ_TEXT = :p8)))""INSERT INTO DUMMY_DOMAIN (DQ_NUM, DQ_NAME, DQ_TEXT) VALUES (:p1, :p2, :p3)"ocb生成代码是这样的
update之后再给数据集tempdata加上acceptChanges()方法么?
我刚才试了 没有什么作用
{
tempData.Tables[0].ImportRow(dr);
} 这个循环执行的时候,objDataset1.Tables[0] 中的行修改了吗,做过什么操作。
ImportRow 会复制dr的DataRowState 。
也就是说ImportRow 不等于新增行。
经兄台提示 我搜到一篇帖子
http://topic.csdn.net/t/20050520/15/4022937.html首先要知道DataAdapter.Update方法的运行原理,
原始的DataTable,所有行的状待(DataRowState)都是没有改变的
当操作其中的数据时,相应的行状态会被更改,例如删除一行,DataRowState状态就被改为Delete
最后,调用UPdate()的时候就检索一下行状态,凡是有更改的行都自动生成一下sql语句反映到数据库
有不少人有这个误会:DataAdapter.Update方法是跟数据库的数据进行比较有更改的就更新==绝对是个误解!
ds2.Merge(ds1),那么ds2就成了ds1了,里面的数据行的状态没有记录任何更改,所以能成功运行,但是数据没有更改;
遗憾的是DataRowState是个只读属性,没办法手动更改之,因此只能一行一行地进行处理,而不能使用merge方法 那么问题似乎明白了,但是怎么解决呢?DataRowState又改不成。还是要用SQL么?
决定在循环里新建DataRow 然后对DataRow各项幅值,最后插进去。
foreach (DataRow dr in objDataset1.Tables[0].Rows)
{
DataRow nwdr=tempData.Tables[0].NewRow();
nwdr["DQ_NUM"]=dr["DQ_NUM"];
nwdr["DQ_NAME"] = dr["DQ_NAME"];
nwdr["DQ_TEXT"] = dr["DQ_TEXT"];
tempData.Tables[0].Rows.Add(nwdr);
}把循环改成这样就可以了
其实第一位兄弟就说对了 只是我没明白过来
多谢楼上几位的帮忙
然后再这Table中添加数据,删除数据,更新数据,然后将Updata(修改后的表) using (GetSqlConn()) //GetSqlConn()自定义连接方法!!
{
//创建适配器
SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from tables", conn);
DataSet a = new DataSet(); dataAdapter.Fill(a);
// .....对a的TABLE插入N行数据!!! //执行更新 SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter); dataAdapter.Update(a); }
//这里操作SQL数据库