1 客户端想把一些基本信息输入到数据库中,程序调用数据模块中的ClientDataSet1.CommandText的方法。但是动态sql写了几次都不行
 strMagCardID:=VipUnit.GetCodeNo;
 strPhone:=edtUserPhone.Text;
 strMail:=edtEmail.Text;strSQLInsert:='insert to UserInfo values (:strMagCardID,:strPhone,:strMail,) ';
开始这样不行,报错,
在网上找找,就以葫芦画瓢在上面的代码下加了如下:
DataModule2.ClientDataSet1.Params.ParamByName('strMagCardID').AsString:=strMagCardID;
DataModule2.ClientDataSet1.Params.ParamByName('strPhone').AsString:=strPhone;
DataModule2.ClientDataSet1.Params.ParamByName('strMail').AsString:=strMail;
仍报错:说是'strMagCardID'没发现???
我感觉还是动态sql没有写好,特来问问大家?

解决方案 »

  1.   

    将ClientDataSet1对应的TDataSetProvider的Options
    的poAllowCommandText设置为True
      

  2.   

    将ClientDataSet1对应的TDataSetProvider的Options
    的poAllowCommandText设置为True
    还有一点需要注意:如果你的参数值可能存在汉字的话,就不要用参数了,会出错的。
      

  3.   

    除了樓上說的設置CDS控件的Options屬性外﹐你的sql語句也可以這親寫。
    cds.commandtext:='insert to UserInfo select ' +strMagCardID+','+strPhone+','+strMail
    cds.execute;
      

  4.   

    注释掉了:
    DataModule2.ClientDataSet1.Params.ParamByName('strMagCardID').AsString:=strMagCardID;
    DataModule2.ClientDataSet1.Params.ParamByName('strPhone').AsString:=strPhone;
    DataModule2.ClientDataSet1.Params.ParamByName('strMail').AsString:=strMail;
    出现
    raised exception class EoleException with message'Parameter 对象被不正确地定义。提供了不一致或不完整的信息'
    所以我提供表的结构:
    CREATE TABLE UserInfo
    (
      MagCardID VARCHAR(12) NOT NULL,
    Phone VARCHAR(30) NULL,
    Mail VARCHAR(20) NULL,
    ) ON [PRIMARY]我想是不是因为我的参数是string类型的在sql中不能识别??如果我不注释掉刚才那段东西的话?
    出现:
    raised exception class EDatabaseError with message 'ClientDataSet1:Parameter'strMagCardID' not found 
    真不知道是哪里出了问题??
      

  5.   

    老兄:你也可以参考以下信息,好好琢磨吗?
    cds.CommandText := 'Insert into  Loginstat (id,UserName,LoginTime, ip) ' +                      //添加数据
              'values (''' + inttostr(pintUserId) + ''', ' +
              '''' + psstrUsercode + ''', '+
              '''' + FormatDateTime('yyyy-mm-dd hh:mm:ss', now) + ''', ' +                                         
              '''' + PstrUserIp + ''')';                  
     ds.Execute;
      

  6.   

    http://expert.csdn.net/Expert/topic/2612/2612964.xml?temp=.9677698
    谢谢兄弟的解答,但是为什么有的地方要3-4个单引号呢?
      

  7.   

    strFamily:='5';
     strMagCardID:=VipUnit.GetCodeNo; strUserName:=edtUserName.Text;
     strAddress:=edtAddress.Text;
     strPhone:=edtUserPhone.Text;
     strMail:=edtEmail.Text; if(rbMan.Checked)
       then   strSex:='男'
     else
       strSex:='女'; if(cbJob.Text <>'职业') then  strJob := cbJob.Text;
     if(cbEducation.Text<>'学历') then strEducation:=cbEducation.Text;
     if (cbAge.Text<>'年龄段' )  then strAge:=cbAge.Text;
     if (memNote.Text<>'') then  strNote:=memNote.Text;
    // strSQLInsert:='insert to UserInfo values (:strMagCardID,:strSex,:strUserName,:strAddress,:strPhone,:strEducation,:strJob,:strFamily,:strMail,:strAge,:strNote) ';
    strSQLInsert:='insert into UserInfo (MagCardID,Sex,Name,Address,Phone,Education,Job,Family,Mail,Age,Note)'
    +' values ('''+strMagCardID+''','+
    ''''+strSex+''','+
    ''''+strUserName+''','+
    ''''+strAddress+''','+
    ''''+strPhone+''','+
    ''''+strEducation+''','+
    ''''+strJob+''','+
    ''''+strFamily+''','+
    ''''+strMail+''','+
    ''''+strAge+''','+
    ''''+strNote+''') ';
    问题已经解决,过段时间总结.
      

  8.   

    '''+strMagCardID+''''
    Delphi中两个引号,代表字符串传到SQLServer后成为一个引号,因为SQL Server中需要一个引号。
      

  9.   

    参数如果是中文的话则clientdataset支持性不好,这种语句还在在服务器端写个处理过程,在服务器端处理完sql语句后再把数据集返回到客户端即可.