Delphi 下利用UniStoredProc空间执行MySQL存储过程问题

stephenchern 2014-10-21 10:38:10
Delphi 下利用UniStoredProc空间执行MySQL存储过程问题
参数可以赋值
执行可以成功
但是如果参数中 是返回类型参数 返回回来的参数值 delphi这边捕获不到
不知道什么原因 还请指教
函数 代码如下:
function ExecUniStoredProc(UniStoredProc: TUniStoredProc; ProcName: string;
AParamName: array of string;
var AParamValue: array of Variant;
AParamType: array of TFieldType; OpenFlag: Boolean): Boolean;
var
i: Integer;
begin
Result := True;
with UniStoredProc do
begin
Close;
Params.Clear;
StoredProcName := ProcName;
// UnPrepare;//这里要注释掉,不然执行会出错
// Prepare;//执行一下后面的参数等信息才可以显示出来
for i := Low(AParamName) to High(AParamName) do
begin
if Params.FindParam(AParamName[i]) = nil then Continue;
try
case AParamType[i] of
ftString, ftInteger, ftFloat, ftDateTime, ftDate:
begin//VarIsEmpty:判断是否为Unassigned VarIsNull:判断是否为Null
//如果Variant是Unassigned,则将其赋值为null
if VarIsEmpty(AParamValue[i]) then
AParamValue[i] := null
else
Params.ParamByName(AParamName[i]).Value := AParamValue[i];
end;
ftBoolean:
begin
//如果Variant是Unassigned;并且数据类型是Boolean类型,则将其赋值为false(因为对于Variant类型,若将其赋值为False,则Variant类型为Unassigned)
if VarIsEmpty(AParamValue[i]) then
Params.ParamByName(AParamName[i]).Value := False
else
Params.ParamByName(AParamName[i]).Value := AParamValue[i];
end;
ftBlob:
begin
//若添加的是图片类型或文件类型的处理 参数值为图片文件所在的本地路径
if FileExists(AParamValue[i]) then
Params.ParamByName(AParamName[i]).LoadFromFile(AParamValue[i], ftBlob)
else
Params.ParamByName(AParamName[i]).Value := null;
end;
end;
except
Application.MessageBox(PChar('错误过程:'+ProcName+'参数:'+AParamName[i]), '错误', MB_OK + MB_ICONINFORMATION);
Exit;
end;
end;
try
if OpenFlag then Open
else ExecProc;
except
Result := False;
Application.MessageBox(PChar('错误过程:'+ProcName), '错误', MB_OK + MB_ICONINFORMATION);
Exit;
end;
//获取返回值(这里包括存储过程自身返回值,和存储过程定义的Output返回值)
for i := Low(AParamName) to High(AParamName) do
begin
if (Params.ParamByName(AParamName[i]).ParamType = ptOutput)
or (Params.ParamByName(AParamName[i]).ParamType = ptInputOutput) then
AParamValue[i] := Params.ParamByName(AParamName[i]).Value;
end;
end;
end;

执行代码:
AFieldName[0] := 'vTeacherCode'; AFieldValue[0] := Trim(txtedtTeacherCode.Text); AFieldType[0] := ftString;
AFieldName[1] := 'vPasswords'; AFieldValue[1] := Trim(txtedtPasswords.Text); AFieldType[1] := ftString;
AFieldName[2] := 'iTeacherID'; AFieldValue[2] := null; AFieldType[2] := ftInteger;
AFieldName[3] := 'vTeacherName'; AFieldValue[3] := null; AFieldType[3] := ftString;
AFieldName[4] := 'vReturnValue'; AFieldValue[4] := null; AFieldType[4] := ftString;
AFieldName[5] := 'iResult'; AFieldValue[5] := null; AFieldType[5] := ftString;
ExecUniStoredProc(UniStoredProc, 'P_LoginTeacher', AFieldName, AFieldValue, AFieldType, True);
showmessage(AFieldValue[4]);
这里show出来 总是空置
代码跟踪 发现 返回值并没东西赋值进去
不知道为什么 还请指教 谢谢。。。。
...全文
470 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
stephenchern 2014-10-27
  • 打赏
  • 举报
回复
分数都给你了
stephenchern 2014-10-22
  • 打赏
  • 举报
回复
已经自己解决 折腾了半天 其实完全没必要用什么执行存储过程的控件 这个控件我后面拿去执行完 查看里面的sql.text 发现控件就是自动组合call .语句去执行存储过程 还不如自己写call来的方便,而且控件组合出来的call 如果有返回参数 会自动拿去转换类型,所以导致获取不到数值 索性自己写call语句去呼叫存储过程 然后select将其返回值拿出来 存储过程控件也是如此做的 代码如下: 这里注意 call语句 前面我加了一句 set gbk; 这个可重要了 不然中文乱码呢。。 CreateUniDataSet(UniQuery, RConnect, Self); try SqlStr := 'set names gbk;' + 'call P_LoginTeacher(:TeacherCode, :Password, @iTeacherID, @vTeacherName, @vReturnValue, @iResult);' + 'select @iTeacherID, @vTeacherName, @vReturnValue, @iResult;'; ExecUniQueryWithParam(UniQuery, SqlStr, ['TeacherCode', 'Password'], [Trim(txtedtTeacherCode.Text), Trim(txtedtPasswords.Text)], [ftString, ftString], True); case GetIFieldValue(UniQuery, '@iResult') of 0: // 登录成功 begin TeacherID := GetSFieldValue(UniQuery, '@iTeacherID'); TeacherName := GetSFieldValue(UniQuery, '@vTeacherName'); ModalResult := mrOK; end; 1: // 用户名不存在 begin txtedtTeacherCode.Clear; txtedtTeacherCode.SetFocus; MsgDlg(GetSFieldValue(UniQuery, '@vReturnValue'), '提示', MB_OK + MB_ICONINFORMATION); end; 2: // 密码错误 begin txtedtPasswords.Clear; txtedtPasswords.SetFocus; MsgDlg(GetSFieldValue(UniQuery, '@vReturnValue'), '提示', MB_OK + MB_ICONINFORMATION); end; end; finally UniQuery.Free; end;
踏雪无痕 2014-10-22
  • 打赏
  • 举报
回复
自学成才么?

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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