实际应用举例:
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前辈们帮我分析一下具体原因何在?