实际应用举例:
1.后台数据库SQL SERVER2000
2.程序用DELPHI 7开发----------------------
数据库端使用存储过程进行增删查改, 程序中用DELPHI的TADOQuery组件调用存储过程(说明:出于对性能的考虑,而没有使用TADOProc组件).
代码如下:
function TForm1.GET_MANAGE_ADDUSER(Query: TADOQuery;
var _USER_ID: LongWord; _UNIT_ID, _PARENT_USER_ID, _REGION_ID: LongWord;
_USER_NAME, _REAL_NAME, _PASSWORD: String; _USER_TYPE: Byte; _CONTACT,
_TEL, _MONITOR_PURVIEW: String; _BACKGROUND_PURVIEW: Byte;
_REMARK: String; _OPERATOR_ID: LongWord): LongWord;
begin
//初始化返回值
_USER_ID := 0;
Result := 1; //结果 //执行
try
Query.Close ;
Query.SQL.Clear;
Query.SQL.Add('DECLARE @USER_ID INT, @RETURN_CODE INT, '
+ ' @USER_NAME VARCHAR(20), @REAL_NAME VARCHAR(40), @PASSWORD VARCHAR(16), @CONTACT VARCHAR(20), '
+ ' @TEL VARCHAR(30), @MONITOR_PURVIEW VARCHAR(100), @REMARK VARCHAR(100) '
+ ' SET @USER_NAME = :USER_NAME '
+ ' SET @REAL_NAME = :REAL_NAME '
+ ' SET @PASSWORD = :PASSWORD '
+ ' SET @CONTACT = :CONTACT '
+ ' SET @TEL = :TEL '
+ ' SET @MONITOR_PURVIEW = :MONITOR_PURVIEW '
+ ' SET @REMARK = :REMARK '
+ ' EXEC [dbo].[PROC_USER_INSERT] @USER_ID OUTPUT,'
+ ' :UNIT_ID,:PARENT_USER_ID, :REGION_ID, @USER_NAME, @REAL_NAME, @PASSWORD, '
+ ' :USER_TYPE, @CONTACT, @TEL, @MONITOR_PURVIEW, :BACKGROUND_PURVIEW, '
+ ' @REMARK, :OPERATOR_ID, '
+ ' @RETURN_CODE OUTPUT '); Query.Parameters.ParamByName('UNIT_ID').Value := _UNIT_ID;
Query.Parameters.ParamByName('PARENT_USER_ID').Value := _PARENT_USER_ID;
Query.Parameters.ParamByName('REGION_ID').Value := _REGION_ID;
Query.Parameters.ParamByName('USER_NAME').Value := _USER_NAME;
Query.Parameters.ParamByName('REAL_NAME').Value := _REAL_NAME;
Query.Parameters.ParamByName('PASSWORD').Value := _PASSWORD;
Query.Parameters.ParamByName('USER_TYPE').Value := _USER_TYPE;
Query.Parameters.ParamByName('CONTACT').Value := _CONTACT;
Query.Parameters.ParamByName('TEL').Value := _TEL;
Query.Parameters.ParamByName('MONITOR_PURVIEW').Value := _MONITOR_PURVIEW;
Query.Parameters.ParamByName('BACKGROUND_PURVIEW').Value := _BACKGROUND_PURVIEW;
Query.Parameters.ParamByName('REMARK').Value := _REMARK;
Query.Parameters.ParamByName('OPERATOR_ID').Value := _OPERATOR_ID; Query.Open; case Query.FieldByName('RETURN_CODE').AsInteger of
1: //OK
begin
_USER_ID := Query.FieldByName('USER_ID').AsInteger;
Result := E_SUCCESS;
end;
-1: //记录重复
begin
Result := 2;
end;
-2: //对象无效
begin
Result := 3;
end
else
begin
Result := 4;
end;
end;
except
exit;
end;end;在运行过程中,发现若传入非汉字的STRING型值一般都均正常(如_USER_NAME,_REAL_NAME等),但是若要传入汉字,则存入数据库中的汉字一般只能存前1个汉字,或者只能存前2个汉字,而非汉字字符则没有任何问题.
一直在找原因,郁闷中...(说明:单独在SQL SERVER查询分析器中调用存储过程,则没有任何问题).
盼DELPHI前辈们帮我分析一下具体原因何在?
1.后台数据库SQL SERVER2000
2.程序用DELPHI 7开发----------------------
数据库端使用存储过程进行增删查改, 程序中用DELPHI的TADOQuery组件调用存储过程(说明:出于对性能的考虑,而没有使用TADOProc组件).
代码如下:
function TForm1.GET_MANAGE_ADDUSER(Query: TADOQuery;
var _USER_ID: LongWord; _UNIT_ID, _PARENT_USER_ID, _REGION_ID: LongWord;
_USER_NAME, _REAL_NAME, _PASSWORD: String; _USER_TYPE: Byte; _CONTACT,
_TEL, _MONITOR_PURVIEW: String; _BACKGROUND_PURVIEW: Byte;
_REMARK: String; _OPERATOR_ID: LongWord): LongWord;
begin
//初始化返回值
_USER_ID := 0;
Result := 1; //结果 //执行
try
Query.Close ;
Query.SQL.Clear;
Query.SQL.Add('DECLARE @USER_ID INT, @RETURN_CODE INT, '
+ ' @USER_NAME VARCHAR(20), @REAL_NAME VARCHAR(40), @PASSWORD VARCHAR(16), @CONTACT VARCHAR(20), '
+ ' @TEL VARCHAR(30), @MONITOR_PURVIEW VARCHAR(100), @REMARK VARCHAR(100) '
+ ' SET @USER_NAME = :USER_NAME '
+ ' SET @REAL_NAME = :REAL_NAME '
+ ' SET @PASSWORD = :PASSWORD '
+ ' SET @CONTACT = :CONTACT '
+ ' SET @TEL = :TEL '
+ ' SET @MONITOR_PURVIEW = :MONITOR_PURVIEW '
+ ' SET @REMARK = :REMARK '
+ ' EXEC [dbo].[PROC_USER_INSERT] @USER_ID OUTPUT,'
+ ' :UNIT_ID,:PARENT_USER_ID, :REGION_ID, @USER_NAME, @REAL_NAME, @PASSWORD, '
+ ' :USER_TYPE, @CONTACT, @TEL, @MONITOR_PURVIEW, :BACKGROUND_PURVIEW, '
+ ' @REMARK, :OPERATOR_ID, '
+ ' @RETURN_CODE OUTPUT '); Query.Parameters.ParamByName('UNIT_ID').Value := _UNIT_ID;
Query.Parameters.ParamByName('PARENT_USER_ID').Value := _PARENT_USER_ID;
Query.Parameters.ParamByName('REGION_ID').Value := _REGION_ID;
Query.Parameters.ParamByName('USER_NAME').Value := _USER_NAME;
Query.Parameters.ParamByName('REAL_NAME').Value := _REAL_NAME;
Query.Parameters.ParamByName('PASSWORD').Value := _PASSWORD;
Query.Parameters.ParamByName('USER_TYPE').Value := _USER_TYPE;
Query.Parameters.ParamByName('CONTACT').Value := _CONTACT;
Query.Parameters.ParamByName('TEL').Value := _TEL;
Query.Parameters.ParamByName('MONITOR_PURVIEW').Value := _MONITOR_PURVIEW;
Query.Parameters.ParamByName('BACKGROUND_PURVIEW').Value := _BACKGROUND_PURVIEW;
Query.Parameters.ParamByName('REMARK').Value := _REMARK;
Query.Parameters.ParamByName('OPERATOR_ID').Value := _OPERATOR_ID; Query.Open; case Query.FieldByName('RETURN_CODE').AsInteger of
1: //OK
begin
_USER_ID := Query.FieldByName('USER_ID').AsInteger;
Result := E_SUCCESS;
end;
-1: //记录重复
begin
Result := 2;
end;
-2: //对象无效
begin
Result := 3;
end
else
begin
Result := 4;
end;
end;
except
exit;
end;end;在运行过程中,发现若传入非汉字的STRING型值一般都均正常(如_USER_NAME,_REAL_NAME等),但是若要传入汉字,则存入数据库中的汉字一般只能存前1个汉字,或者只能存前2个汉字,而非汉字字符则没有任何问题.
一直在找原因,郁闷中...(说明:单独在SQL SERVER查询分析器中调用存储过程,则没有任何问题).
盼DELPHI前辈们帮我分析一下具体原因何在?
解决方案 »
- 广交做数据库的DELPHI朋友,留下QQ号或MSN的都有分。
- 如何向正在打开或打开完毕的网页中插入并运行代码?
- 请问我把网上下载的源码卖给别人有没有侵犯版权?
- sql server数据库异常处理时的奇怪现象!急,高分求解
- 谁有服装MRP的源代码吗 在线等
- 大家幫忙看看這段代碼,是關於動態建立form的問題?
- 用installshell for delphi5打包时,如何把ADO的安装文件包进去并在安装时运行注册?
- 300分求NMPOP31DecodeStart(AnsiString &FileName)和NMPOP31DecodeEnd(TObject *Sender)还有SMTP的两个函数 ,这四个函数怎么写(这是不是
- word出错的问题,为什么说variant does not reference an automation object,怎么不能回答?
- 阿贵,你好!
- 请问怎样在DBGrid1中实现字段自动计算呢?
- 点击查询按钮后,出现表,而且自动在表后加一个计算的列,怎么做?
2.使用存储过程,建议使用ADOStoreProc,
3.ADOQuery也可以使用,可以不使用DECLARE;
4,考虑nvarchar
自己组合SQL,然后ADOQUERY.TEXT = :SQL,(注间数值两端不能加引号,字符两端用QuotedStr方法加上引号)就可以了,已经试过.