sql server中使用事务的问题

small_wei 2006-09-17 11:59:52
程序原来是使用ODBC的,运行正常,现在改用ADO就出问题了。程序大约如下:

CADORecordset rs(&db);
if ( !db.BeginTrans() )
AfxMessageBox("事务启动失败");
try
{
rs.Open(...);
while(!rs.IsEOF()){
switch( .... )
{
case '1':
execone(s);
rs.PutCollect(....);
rs.Update();

..........

}

rs.MoveNext();

}
rs.Close();
}
catch(_com_error e)
{
....
flag = false;
}

if (!flag ) {
if ( !db.Rollback() )
AfxMessageBox("回滚失败");
else return ;

}
else{
if ( !db.CommitTrans() ){
AfxMessageBox("提交失败");
return ;
}
}


BOOL execone(CString reportid)
{

CADORecordset rs(&db),rs1(&db);

s2.Format("delete from tablename ");
db.ExecuteSQL(s2);


rs.Open(......);

while ( !rs.IsEOF()){

rs1.Open(....);

while(!rs1.IsEOF()){


db.ExecuteSQL("insert tablename1 (field_1,field_2 .......");
}


rs1.MoveNext();
}
rs1.Close();
rs.MoveNext();
}
rs.Close();


return true;

}
db是我已经打开的全局数据库连接。CADORecordset是我的封装类。程序原来在ODBC中运行正常。现在一执行db.ExecuteSQL("insert tablename1 (field_1,field_2 .......");
就出错,提示是《未指定错误》。如果不要事务。整个程序就能正常运行。结果也对。数据库是sql server 2000
...全文
342 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wisdomone 2006-09-19
  • 打赏
  • 举报
回复
UP
Pilot380 2006-09-18
  • 打赏
  • 举报
回复
我前几天也遇到了这样的问题,但我遇到的问题是:使用ADO的Provider...格式的有错误,是80004005,改成driver=...,仍然有错误,但错误代码不太一样了(没有记住),后来,不知道怎么调整的,又全都好了。真的一头雾水,在Access下,一点问题也没有。
small_wei 2006-09-18
  • 打赏
  • 举报
回复
MSDTC?什么意思?
OracleRoob 2006-09-18
  • 打赏
  • 举报
回复
启动MSDTC
small_wei 2006-09-17
  • 打赏
  • 举报
回复
非常郁闷,不知怎样解决
small_wei 2006-09-17
  • 打赏
  • 举报
回复
语句肯定是没有问题的。只要不启动事务,就能正常运行。当然在 sql查询管理器里也能正常执行了。只要启动事务就出错。
间隔就是:
如table1
有以下字段:
f1,f2,f3,f4
insert table1 (f1,f2,f3) values(1,2,3) 正常
insert table1 (f1,f2,f4) values(1,2,4) 不启动事务正常。启动事务后就出错。这个就是间隔
OracleRoob 2006-09-17
  • 打赏
  • 举报
回复
最有效的方法,就是中断代码,调试出SQL的值,直接在SQL查询分析器中执行。
OracleRoob 2006-09-17
  • 打赏
  • 举报
回复
字段列表中间有间隔?

什么意思?
small_wei 2006-09-17
  • 打赏
  • 举报
回复
在ADO里就是不行了,可能是BUG吧。相同的程序,如果字段列表中间没有间隔的,即使不列全,也没有错。但如果字段列表中间有间隔,就会出错了,如果不用事务也是正常的。
OracleRoob 2006-09-17
  • 打赏
  • 举报
回复
字段列表不需要全写,只列出需要追加的列名即可。
small_wei 2006-09-17
  • 打赏
  • 举报
回复
晕!找到问题了。
insert tablename1 (field_1,field_2 .......) values(....);这一条insert语句的tablename1的字段名一定要按顺序排完,不能有间隔。执行就没有问题。也就是field_1,field_2,field_3,field_4....
如果是这样field_1,field_2,field_4,field_5就出错了。
晕!MS怎么会有这种BUG?这条语句是动态生成的,我做程序时也不知道会是怎样的。叫我怎么去做啊!!!
small_wei 2006-09-17
  • 打赏
  • 举报
回复
CADODataBase Error
Code = 80004005
Code meaning = 未指定的错误
Source = Microsoft OLE DB Provider for SQL Server
Description = 不能在手动或分布事务方式下创建新的连接。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧