当ADOStoredProc中参数为中文时报错,如何处理

scoredhigh 2013-03-05 06:09:28
当ADOStoredProc中参数为中文时如何处理?

数据库是mysql
存储过程为
CREATE PROCEDURE sp_save_patient(prmName char(24), prmMedno char(24))
BEGIN
insert into tbl_patient values(prmName, prmMedno);
END

BCB中的代码为
ADOStoredProc->Close();
ADOStoredProc->ProcedureName = "sp_save_patient";
ADOStoredProc->Parameters->Clear();
ADOStoredProc->Parameters->CreateParameter("@prmName", ftString, pdInput, 30, NULL);
ADOStoredProc->Parameters->CreateParameter("@prmMedno", ftString, pdInput, 30,NULL);
ADOStoredProc->Parameters->ParamByName("@prmName")->Value = "张三";
ADOStoredProc->Parameters->ParamByName("@prmMedno")->Value = "0001";
ADOStoredProc->ExecProc();

以上代码出错,如果参数“@prmName”为英文就可以,
ADOStoredProc->Parameters->ParamByName("@prmName")->Value = "zhangsan";
怎么解决
...全文
638 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
scoredhigh 2013-03-07
  • 打赏
  • 举报
回复
引用 8 楼 ccrun 的回复:
数据库是UTF-8的?那这样再试试: C/C++ code ? 12 ADOStoredProc->Parameters->ParamByName("@prmName")->Value = AnsiToUtf8("张三"); ADOStoredProc->Parameters->ParamByName("@prmMedno")->Value = AnsiToUtf8……
可以啊,多谢了
ccrun.com 2013-03-07
  • 打赏
  • 举报
回复
数据库是UTF-8的?那这样再试试:
ADOStoredProc->Parameters->ParamByName("@prmName")->Value = AnsiToUtf8("张三");
ADOStoredProc->Parameters->ParamByName("@prmMedno")->Value = AnsiToUtf8("0001");
scoredhigh 2013-03-07
  • 打赏
  • 举报
回复
引用 3 楼 ccrun 的回复:
将字符串转成String,如: C/C++ code ? 12 ADOStoredProc->Parameters->ParamByName("@prmName")->Value = String("张三"); ADOStoredProc->Parameters->ParamByName("@prmMedno")->Value = String("0001");……
试过了,不行啊
scoredhigh 2013-03-07
  • 打赏
  • 举报
回复
引用 2 楼 ksrsoft 的回复:
出错提示是什么
提示错误:“Project DataBase_Server.exe raised exception class EOleException with message '[MySQL][ODBC 5.2(w) Driver][mysqld-5.5.20]Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'prmName' at row 1'. Process stopped. Use Step or Run to continue.”
scoredhigh 2013-03-07
  • 打赏
  • 举报
回复
引用 1 楼 dataxdata 的回复:
看看数据库所使用的代码表,可能和中文的编码方式有关
数据库是utf8编码的,我用此存储过程直接在数据库里执行时可以的。 这说明是BCB里的问题,我在连接符里设置了"Provider=MSDASQL.1;Password=center_db;Persist Security Info=True;User ID=center_db;Data Source=ZDDB;charset=utf8",也没什么用
我不懂电脑 2013-03-06
  • 打赏
  • 举报
回复
用WideString
ccrun.com 2013-03-06
  • 打赏
  • 举报
回复
将字符串转成String,如:
ADOStoredProc->Parameters->ParamByName("@prmName")->Value = String("张三");
ADOStoredProc->Parameters->ParamByName("@prmMedno")->Value = String("0001");
缘中人 2013-03-06
  • 打赏
  • 举报
回复
出错提示是什么
dataxdata 2013-03-06
  • 打赏
  • 举报
回复
看看数据库所使用的代码表,可能和中文的编码方式有关
一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接) ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接池 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接池 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.

1,178

社区成员

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

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