问题看起来很长.但是很简单.
有记录如下:
name1    sex
edit1    女
向世明   男
存储过程:
CREATE PROCEDURE X_selectTest1 
@nm1 char(10)
 AS
select * from test1 where name1 like @nm1
GO
delphi中调用:
with self.ADOStoredProc1 do
    begin
      prepared:=false;
      procedurename:='X_selectTest1';
      parameters.Clear;
      parameters.AddParameter.ParameterObject.Name:='@nm1';
      parameters.ParamValues['@nm1']:=edit1.Text;
      prepared:=true;
      open;
    end;
当edit1.text:='eidt';此时有返回数据;
当edit1.text:='edit      ';加了6个空格也有返回
当edit1.text:='向世明';此时没有数据返回;
而当edit1.text:='向世明    ';后面加了四个空格又有返回.
是什么原因呢.

解决方案 »

  1.   

    无非是模糊匹配与精确匹配的问题 ,在模糊匹配中 :'1234   '='1234' 建议你最好把左边的用trim清掉空格.
      

  2.   

    各位的方法都试过.还是不行.还是那个表.不过name1字段已改为varchar型 又作了以下试验:  
     //1. 直接用Query组件调用有无空格都行
        self.DataSource1.DataSet:=self.ADOQuery1;
        with adoquery1 do
        begin
          close;
          sql.Clear;
          sql.Add('select * from test1 where name1=:A');
          parameters.ParamByName('A').Value:=edit1.Text;
          open;//前后有无空格都行,汉字字母都行
        end;
    //2.用存储过程就是不行
        self.DataSource1.DataSet:=self.ADOStoredProc1;
        with self.ADOStoredProc1 do
        begin
          close;
          prepared:=false;
          procedurename:='X_selectTest1';
          parameters.Clear;
          parameters.AddParameter.ParameterObject.Name:='@nm1';
          parameters.ParamValues['@nm1']:=edit1.Text;
          prepared:=true;
          open;
        end;//当输入汉字姓名查询时不行请能告诉我???
      

  3.   

    //2.用存储过程
        self.DataSource1.DataSet:=self.ADOStoredProc1;
        with self.ADOStoredProc1 do
        begin
          close;
          prepared:=false;
          procedurename:='X_selectTest1';
          parameters.Clear;
          parameters.AddParameter.ParameterObject.Name:='@nm1';
          parameters.ParamValues['@nm1']:='%'+edit1.Text+'%';
          prepared:=true;
          open;
        end;//当输入汉字姓名查询时不行
      

  4.   

    self.DataSource1.DataSet:=self.ADOStoredProc1;
        with self.ADOStoredProc1 do
        begin
          close;
          prepared:=false;
          procedurename:='X_selectTest1';
          parameters.Clear;
          parameters.AddParameter.ParameterObject.Name:='@nm1';
          parameters.ParamValues['@nm1']:='%'+tring(edit1.Text)+'%';
          prepared:=true;
          open;
        end;
      

  5.   

    char(10)和varchar(10)是不一样的char(10)在保存的时候如果值没有10位则后面加空格' '补足10位
    varchar(10)则不会
    如:name:'向世明'
    数据库中保存的是:char(10):'向世明    '
                    varchar(10):'向世明'所以就会有这个问题:
      当edit1.text:='向世明';此时没有数据返回;
    而当edit1.text:='向世明    ';后面加了四个空格又有返回.
      

  6.   

    存储过程中@nm1 char(10)
    定义为:@nm1 varchar(10)
      

  7.   

    CREATE PROCEDURE X_selectTest1 
    @nm1 varchar(10)
     AS
    select * from test1 where name1 like @nm1 + '%'
    GO
      

  8.   

    應該是你的數據庫數據類型不對。一般要用varchar()來定義的
    char 和 varchar
    固定长度 (char) 或可变长度 (varchar) 字符数据类型。char[(n)]长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。char 在 SQL-92 中的同义词为 character。varchar[(n)]长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在 SQL-92 中的同义词为 char varying 或 character varying。注释
    如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。将为使用 char 或 varchar 的对象被指派数据库的默认排序规则,除非用 COLLATE 子句另外指派了特定的排序规则。该排序规则控制用于存储字符数据的代码页。支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。如果使用 char 或 varchar: 如果希望列中的数据值大小接近一致,请使用 char。
    如果希望列中的数据值大小显著不同,请使用 varchar。 
    如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF,则一个定义为 NULL 的 char 列将被作为 varchar 处理。 当排序规则代码页使用双字节字符时,存储大小仍然为 n 个字节。根据字符串的不同,n 个字节的存储大小可能小于 n 个字符。
      

  9.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      str1,str2:string;
    begin
       str1:=edit1.Text;
       str2:=StringReplace ( str1, ' ', '', [rfReplaceAll] );//去掉空格
       label1.Caption:=str2;
    end;
    end.