我是新手,下面有一段我写在程序中的查询代码,我调了好久一直没有调成功,另我非常头痛,请各位高手帮帮指点一下!!!procedure TCDMIS_Form_Search.BitBtn_SearchClick(Sender: TObject);
var
    sql_str: string;
    str: string;
begin    DataModule_RMIS.ADOTable_CD_table.Locate('菜单编号',Edit_CDBH_Search.Text,[loCaseInsensitive, loPartialKey]);
        if  Edit_CDBH_Search.Text<>DataModule_RMIS.ADOTable_CD_table['菜单编号']
            then
                begin
                    Application.MessageBox('此菜单不存在','错误',MB_ICONERROR     +     MB_OK);
                    Edit_CDBH_Search.Text:='< 请重新输入 >';
                end
        else
            begin
                str:= Edit_CDBH_Search.Text;
                sql_str:='select * from CD_table where';
                sql_str:=sql_str+'(菜单编号=';
                sql_str:=sql_str+'str)';
                ShowMessage(sql_str);
                with DataModule_RMIS.ADOQuery_CD_table do
                begin
                    close;
                    sql.Clear;
                    sql.Add(sql_str);
                    open;
                end;
            end;
end;我用一个TEdit控件Edit_CDBH_Search来接收“菜单编号”的信息,但是在程序运行到要执行SQL查询(open;)时总是会出现错误信息说参数“str”没有默认值。我不知道这个到底是什么意思啊?我在一本书上看到跟上面代码类似的代码是可执行的,代码如下:procedure TQueryBookForm.btnQry2Click(Sender: TObject);
var
    SQLStr:string;
begin
    SQLStr:='select * from 图书 where';
    SQLStr:=SQLStr+' (图书名称 like "%'+edtBook.Text+'%"';
    SQLStr:=SQLStr+') and (ISBN like "%'+edtISBN.Text+'%"';
    SQLStr:=SQLStr+') and (译著者 like "%'+edtWriter.Text+'%"';
    SQLStr:=SQLStr+') and (类别 like "%'+cbType.Items[cbType.ItemIndex]+'%"';
    SQLStr:=SQLStr+') and (出版社 like "%'+cbPub.Items[cbPub.ItemIndex]+'%"';
    SQLStr:=SQLStr+') and (出版时间 like "%'+cbDate.Items[cbDate.ItemIndex]+'%")';    SQLStr:=SQLStr+' order by 出版时间';
ShowMessage(SQLStr);
    SQLQuery(SQLStr,DMMain.adqBook);
    dgBook.DataSource:=DMMain.dsqBook;
end;procedure TQueryBookForm.SQLQuery(SQLString:string;qry:TADOQuery);
begin
    with qry do
        begin
            close;
            sql.Clear;
            sql.Add(SQLString);
            open;
        end;
end;
请各位高手帮我解决一下这个问题为什么我这个写的代码执行起来会有这样的错误啊!非常紧急!!!

解决方案 »

  1.   

    给你修改了一下,试试吧
    procedure TCDMIS_Form_Search.BitBtn_SearchClick(Sender: TObject);
    var
        sql_str: string;
        str: string;
    begin
            if  not DataModule_RMIS.ADOTable_CD_table.Locate('菜单编号',Edit_CDBH_Search.Text,[]) then
                    begin
                        Application.MessageBox('此菜单不存在','错误',MB_ICONERROR     +     MB_OK);
                        Edit_CDBH_Search.Text:='< 请重新输入 >';
                    end
            else
                begin
                    str:= Edit_CDBH_Search.Text;
                    sql_str:='select * from CD_table where';
                    sql_str:=sql_str+'(菜单编号=';
                    sql_str:=sql_str+'str)';
                    ShowMessage(sql_str);
                    with DataModule_RMIS.ADOQuery_CD_table do
                    begin
                        close;
                        sql.Clear;
                        sql.Add(sql_str);
                        open;
                    end;
                end;
    end;
      

  2.   

    非常感谢你的答复,我试了一下可是还是不行,这次出现了其他错误了,就是在你改过的if语句那边就出错了,我在文本框中如果输入的是错误的编号则很顺利的显示菜单不存在,而如果我输入的是数据库中有的数据则报错,不往下执行了,显示的报错信息是“有一个是真的……”说了一大串,然后我按F7跟踪了一下,跳过这一步之后还是进入了if语句而不是进入else语句中执行,仍显示此菜单不存在!
      

  3.   

    你的sql语句有错误,再给你修改一下:
    procedure TCDMIS_Form_Search.BitBtn_SearchClick(Sender: TObject);
    var
        sql_str: string;
        str: string;
    begin
            if  not DataModule_RMIS.ADOTable_CD_table.Locate('菜单编号',Edit_CDBH_Search.Text,[]) then
                    begin
                        Application.MessageBox('此菜单不存在','错误',MB_ICONERROR     +     MB_OK);
                        Edit_CDBH_Search.Text:='< 请重新输入 >';
                    end
            else
                begin
                    str:= Edit_CDBH_Search.Text;
                    sql_str:='select * from CD_table where 菜单编号='''+trim(str)+'''';
                    ShowMessage(sql_str);
                    with DataModule_RMIS.ADOQuery_CD_table do
                    begin
                        close;
                        sql.Clear;
                        sql.Add(sql_str);
                        open;
                    end;
                end;
    end;
      

  4.   

    参数“str”没有默认值,这只是编译警告,但是不会影响你程序正常运行,一定是其它地方出现了 问题。
    通常情况下,在循环语句、条件语句等字句前应该初始化用到的变量,否则可能会出现类似“参数“str”没有默认值”的编译警告。
    正确:
      str := ''; //虽然多写一行代码,但是可能省却很多烦恼
      if 1>0 then
        ...
      else
       str := '1<=0';不合理:
      if 1>0 then
        ...
      else
       str := '1<=0';
      

  5.   

    应该是你的str这个变量在sql语句中没有起作用
    sql_str:=sql_str+''''+ str +''''+')';这样出来的结果就是'select * from CD_table where (菜单编号=' ?')你要的是这个结果吗?我觉得那个括号没有什么用处
      

  6.   

    关于sql语句的调试,有一个好的思路是,>>ShowMessage(SQLStr);单步调试试,将变量SQLStr添加到watch窗口,然后得到SQLStr的值,即生成的sql 语句再把sql 语句放到 SQL Explorer,查询分析器等能执行sql语句的工具中,看sql语句是否正确执行.如果可以执行成功,那问题就好多解决了