注册

为什么达梦8通过DPI方式设置事务始终无法设置成功

达梦烤瓷冠 2025/05/01 65 0

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:
【CPU】:
【问题描述】*:
procedure TDm8DatabaseConnection.BeginTrans;
var
rt: DPIRETURN;
AutoCommitVal:sdint4; //
currentVal: sdint4; //
len: sdint4;
I: Integer;

const

DSQL_AUTOCOMMIT_OFF = 0; // 手动提交模式,需显式调用COMMIT
DSQL_AUTOCOMMIT_ON = 1; // 自动提交模式,每条语句自动提交
DSQL_AUTOCOMMIT_DEFAULT = DSQL_AUTOCOMMIT_ON; // 使用数据库默认设置
begin
/// CheckConnected;
if FHCon = nil then
begin
raise Exception.Create('数据库连接失败');

end;
// 验证初始自动提交状态
rt := dpi_get_con_attr(FHCon, DSQL_ATTR_AUTOCOMMIT, @currentVal,
SizeOf(currentVal), @len);

if rt = DSQL_SUCCESS then
begin

OutputDebugString(pchar(Format('[DEBUG] 原始事务设置属性:ID=0x%x, Val=%d, Size=%d',
[DSQL_ATTR_AUTOCOMMIT, currentVal, SizeOf(len)])));

end;

// 步骤2:设置自动提交为OFF

// 第一步:关闭自动提交

AutoCommitVal := DSQL_AUTOCOMMIT_OFF;

// 添加调试输出
OutputDebugString(pchar(Format('[DEBUG] 设置属性:ID=0x%x, Val=%d, Size=%d',
[DSQL_ATTR_AUTOCOMMIT, AutoCommitVal, SizeOf(AutoCommitVal)])));
rt := dpi_set_con_attr(FHCon, DSQL_ATTR_AUTOCOMMIT,@AutoCommitVal, SizeOf(AutoCommitVal));

if rt <> DSQL_SUCCESS then
begin
var
err := GetErrorMessage(DSQL_HANDLE_DBC, FHCon);
raise Exception.CreateFmt('无法关闭自动提交[0x%x]:%s', [rt, err]);
end;

// 步骤3:验证设置结果
rt := dpi_get_con_attr(FHCon, DSQL_ATTR_AUTOCOMMIT, @currentVal,
SizeOf(currentVal), @len);
if rt = DSQL_SUCCESS then
OutputDebugString(pchar(Format('[DEBUG] 新事务设置属性:ID=0x%x, Val=%d, Size=%d',
[DSQL_ATTR_AUTOCOMMIT, currentVal, SizeOf(len)])))
else
raise Exception.Create('属性设置验证失败');

end;

在执行rt := dpi_set_con_attr(FHCon, DSQL_ATTR_AUTOCOMMIT,@AutoCommitVal, SizeOf(AutoCommitVal)); 这一句的返回结果始终是

事务处理失败: 无法关闭自动提交[0xFFFFFFFF]:错误码: 0xFFFEEE5B, 描述: 无效的属性值
我查看了手册,确开传值是没错的

我们公司现在正在全面实行达梦8替换ORALCEL,事关项目的成败,希望能得到你们的帮助,谢谢

另外代码的写法是肯定没有错的,
//设置连接端口
ports:=5236;
rt:=dpi_set_con_attr(FHCon, DSQL_ATTR_LOGIN_PORT, @ports, sizeof(ports));

if rt <> DSQL_SUCCESS then
begin
var
err := GetErrorMessage(DSQL_HANDLE_DBC, FHCon);
raise Exception.CreateFmt('无法设置端口号[0x%x]:%s', [rt, err]);
end
else
begin
OutputDebugString(pchar('测试设置端口号成功'))

end; 这段设置端口号的都能正确执行

回答 0
暂无回答
扫一扫
联系客服