如何用DataSet更新(批量更新)数据库
我在服务端用以下代码调用数据层Update不成功,以前看过用这种方法成功过的,不知道是哪里出了问题
DB2Conn db = new DB2Conn();
DataSet ds =db.GetData("SELECT * FROM UTEST");
DataRow dr = ds.Tables[0].NewRow();
dr["TEST"] = "1";
ds.Tables[0].Rows.Add(dr);
bool isOK = db.Update(ds);
以下是数据层代码:
private static string strConn="Data Source=(Local);Initial Catalog=MYDB;user id=sa;password=sa;";
private static OleDbConnection conn;
private OleDbTransaction trans;
public bool Update(DataSet ds)
{
try
{
DataTable dt = ds.Tables[0];
if (dt != null)
{
OleDbDataAdapter da = GetDataAdapter("SELECT * FROM " + dt.TableName);
da.Update(dt);
return true;
}
else
throw new Exception("数据集中无有效的数据表信息!");
}
catch(Exception ex)
{
throw ex;
}
return false;
}
private OleDbDataAdapter GetDataAdapter(string strSQL)
{
OleDbDataAdapter da = null;
try
{
da = new OleDbDataAdapter();
da.SelectCommand = new OleDbCommand(strSQL, conn != null ? conn : new OleDbConnection(strConn));
OleDbCommandBuilder custCB = new OleDbCommandBuilder(da);
if (conn != null)
{
if (da.SelectCommand != null)
da.SelectCommand.Transaction = trans;
if (da.DeleteCommand != null)
da.DeleteCommand.Transaction = trans;
if (da.InsertCommand != null)
da.InsertCommand.Transaction = trans;
if (da.UpdateCommand != null)
da.UpdateCommand.Transaction = trans;
}
}
catch(Exception ex)
{
throw ex;
}
return da;
}
问题点数:100、回复次数:22Top
1 楼wxqq2001(就让我用一生等待)回复于 2004-10-09 10:34:20 得分 10
……
MyDataAdapter.SelectCommand = MyCommand;
DataSet MyDataSet = new DataSet();
MyDataAdapter.Fill(MyDataSet,"table");
OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter);//!!注意:关联DataSet和数据库的操作!!!
{
//操作
MyDataSet.Tables["table"].Rows[0][0] = "ss";//更新DataSet中第一行第一列的值
//……
}
MyDataAdapter.Update(MyDataSet,"table");//将DataSet中”table”表中的数据提交给数据库,完成数据库的更新
MyConnection.Close();
Top
2 楼boyxia(>>雪饮狂刀 [抵制日货]<<)回复于 2004-10-09 10:37:26 得分 10
myConn = new OleDbConnection(connStr);
myDataAdapter = new OleDbDataAdapter();
myDataAdapter.SelectCommand = new OleDbCommand(str_Sql, myConn);
myCommandBuilder = new OleDbCommandBuilder(myDataAdapter);
myConn.Open();
myDataAdapter.Update(myDataSet.Tables[0].GetChanges());
myConn.Close();
Top
3 楼cnming(cnming)回复于 2004-10-09 10:42:15 得分 5
mark
我也没有写成功过Top
4 楼stephenZL(我爱C#,HOHO~~~)回复于 2004-10-09 10:46:26 得分 0
markTop
5 楼wangxt(海贝)回复于 2004-10-09 11:00:00 得分 0
UPTop
6 楼ma_ta(ma_ta)回复于 2004-10-09 11:16:57 得分 0
如果不用OleDbCommandBuilder,有没有办法呢
我很想知道为什么我的办法不行,我以前用过这种办法的,感觉很好用,不过那个类是操作SQL的,现在是操作DB2的,想想该没有什么问题的,类文件不复杂,用到的代码俺都粑上了Top
7 楼ma_ta(ma_ta)回复于 2004-10-09 11:26:00 得分 0
用我的方法每次都提示
"对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"
不知道这句话是什么意思,有没有解决的办法。Top
8 楼ma_ta(ma_ta)回复于 2004-10-09 15:30:40 得分 0
试过了,不行...Top
9 楼saucer(思归)回复于 2004-10-09 21:35:57 得分 10
>>>"对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"
use CommandBuilder, maker your table has a primary key
but see
Avoiding the CommandBuilder Object
http://www.theserverside.net/articles/showarticle.tss?id=OptimizingADONET
you can write your own Insert/Delete/Update command, see
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=103Top
10 楼CSDNATM(飞行员,麻烦帮开个窗让我透透气)回复于 2004-10-09 22:01:47 得分 0
思归行Top
11 楼ma_ta(ma_ta)回复于 2004-10-10 08:42:44 得分 0
另外我试了一下,发觉OleDb和Odbc两种方式存在很大差别,如下:
这是界面层代码:
string strSQL=string.Format("SELECT * FROM UTEST");
DataSet ds =db.GetData(strSQL);
DataRow myRow;
for(int i=0;i<3;i++)
{
myRow=ds.Tables[0].NewRow();
myRow["TEST"] = i.ToString();
ds.Tables[0].Rows.Add(myRow);
}
bool isOK = db.OdbcUpdate(ds);
这是数据层代码:
public bool OleDbUpdate(DataSet ds)
{
try
{
DataTable dt = ds.Tables[0];
string strSQL = string.Format("SELECT * FROM {0}",dt.TableName);
OleDbDataAdapter da = new OleDbDataAdapter(strSQL, conn != null ? conn : new OleDbConnection(strConn));
OleDbCommandBuilder MyCB = new OleDbCommandBuilder(da);
DataSet dss = new DataSet(dt.TableName);
dss = ds.Copy();
da.Update(dss,dt.TableName);
return true;
}
catch(Exception ex)
{
throw ex;
}
}
public bool OdbcUpdate(DataSet ds)
{
try
{
string con = "DSN=bzbjDB;UID=DBO;PWD=DBO;MODE=SHARE;LONGDATACOMPAT=1;GRAPHIC=1;LOBMAXCOLUMNSIZE=2048575;DBALIAS=bzbjDB;";
OdbcConnection ODBC_conn = new System.Data.Odbc.OdbcConnection(con);
ODBC_conn.Open();
DataTable dt = ds.Tables[0];
string strSQL = string.Format("SELECT * FROM {0}",dt.TableName);
OdbcDataAdapter da = new OdbcDataAdapter(strSQL, ODBC_conn != null ? ODBC_conn : new OdbcConnection(strConn));
OdbcCommandBuilder MyCB = new OdbcCommandBuilder(da);
DataSet dss = new DataSet(dt.TableName);
dss = ds.Copy();
da.Update(dss,dt.TableName);
return true;
}
catch(Exception ex)
{
throw ex;
}
}
如果我调用OleDbUpdate则失败,
提示"对于不返回任何基表信息的SelectCommand不支持动态SQL生成。"
如果我调用OdbcUpdate则成功....
而且我在界面层写通过dataset更改记录的代码,不能成功执行(现在是通过dataset新增记录的代码可以执行),搞不懂,按照思归的意思应该是都不能执行吧?(因为表里没有primary key)
这里我比较糊涂,还请大家赐教
Top
12 楼ma_ta(ma_ta)回复于 2004-10-10 10:29:22 得分 0
自己顶顶Top
13 楼linaren(JAVA/LINUX...)回复于 2004-10-10 11:43:50 得分 30
要用da.update应该注意1、da关联的表要有主键 2、da要与conn关联
我个人认为使用此功能不是很灵活的而且效率上也不高
灵活的方式就是构建sql串提交数据库执行,这样就完全避免了前面的限制
这样操作数据是很容易控制的Top
14 楼langmafeng(乞力马扎罗)回复于 2004-10-10 11:52:01 得分 30
http://blog.csdn.net/langmafeng/archive/2004/07/02/32287.aspxTop
15 楼ma_ta(ma_ta)回复于 2004-10-10 14:03:29 得分 0
此问题源于我要往表中插入9条记录,因此想到生成1个这9条记录的DataSet,然后调用1次搞定
linaren的说法给了我一些启发,不过我还是不很清楚,例如用构建sql串提交数据库执行的示例代码可否提供参考下
langmafeng的文章我大概看了下,确实是好文章,我已收藏,争取尽快吸收,谢了Top
16 楼robin0925(棱石)回复于 2004-10-10 14:19:23 得分 5
GZ,帮顶啦!Top
17 楼bflovesnow()回复于 2004-10-10 15:19:28 得分 0
思归 来了1定能解决:)Top
18 楼ma_ta(ma_ta)回复于 2004-10-10 17:37:53 得分 0
各位帮帮忙啊
为什么我这种方式效率不高?
怎么才能用构建sql串提交数据库执行解决1次插入9条记录?
为什么OleDbUpdate和OdbcUpdate有截然不同的结果?Top
19 楼Mycro(⊕☆夜海星空:上过大学的的农民☆⊕)回复于 2004-10-11 08:50:49 得分 0
upTop
20 楼ma_ta(ma_ta)回复于 2004-10-12 08:49:47 得分 0
upTop
21 楼ma_ta(ma_ta)回复于 2004-10-13 08:37:49 得分 0
自己顶下Top
22 楼ma_ta(ma_ta)回复于 2004-10-16 08:47:46 得分 0
再顶Top





