我水平比较低级,这是我毕业设计中出现的问题,6,14号就要答辩了,希望大家帮帮我,谢谢了使用了ListView显示一个数据表中的信息,然后根据其中两列的信息在右边的CELL中再查找信息,将查找到的信息导入数据库
如:ListView第一列列名为字段名,下方分别显示姓名、性别、年龄等,第二列为内容定位分别显示第一列中各个字段在cell表格中的位置旁边要填写的内容所在的行列数,右方为一个填写好信息的学籍表,现在要求根据ListView中的第二列找到填写的内容然后导入数据库
SQL语句应为:
insert into data(姓名,性别,年龄,所在班级,基本信息)
values('张三','男','22','计算机041','无');我写了下面的代码,但是总是报错,参数'姓名'无法找到,数据不能导进去
代码如下:
procedure TMainfrm.TB_ImportClick(Sender: TObject);
var filename,varname,contentlocation,value1:string;
    lvcount,row,col,i,j,k:integer;
    sql1,sql2,strcon,path:string;
begin
   filename:=ComboBox1.Text;
   lvcount:=ListView1.Items.Count;   //连接数据库
   strcon:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
   path:=ExtractFilePath(application.ExeName);
   strcon:=strcon+path+'\data\'+filename+';Persist Security Info=False';
   adocon.Close;
   adocon.ConnectionString:=strcon;
   adocon.ConnectionTimeout:=8;
   adocon.Open;   //数据导入
   sql1:='insert into data(';
   for i:=0 to lvcount-1 do
   begin
     varname:=ListView1.Items[i].Caption;
     sql1:=sql1+varname+',';
   end;
   delete(sql1,length(sql1),1);
   sql1:=sql1+')';   sql2:='values(';
   for j:=0 to lvcount-1 do
   begin
     varname:=ListView1.Items[j].Caption;
     sql2:=sql2+':'+varname+',';
   end;
   delete(sql2,length(sql2),1);
   sql2:=sql2+')';   adoquery1.Close;
   adoquery1.SQL.Clear;
   adoquery1.SQL.Add(sql1);
   adoquery1.SQL.Add(sql2);   for k:=0 to lvcount-1 do
   begin
       varname:=ListView1.Items[k].Caption;
       contentlocation:=ListView1.Items[k].SubItems[2];
       row:=strtoint(copy(contentlocation,1,1));
       col:=strtoint(copy(contentlocation,3,1));
       value1:=cell1.GetCellString(col,row,cell1.GetCurSheet);
       adoquery1.Parameters.Clear;
       adoquery1.Parameters.Refresh;
       adoquery1.Parameters.ParamByName(varname).Value:=value1;
   end;
   adoquery1.ExecSQL;   //关闭链接
   MessageBox(self.Handle,'数据导入成功!','提示',32);
   adocon.Close; 原谅小女子愚笨,忘各位大侠帮帮忙让我顺利毕业吧。

解决方案 »

  1.   

    估计是SQL语句的问题
    adoquery1.ExecSQL; 
    在前面加一句看看
    ADOQuery1.SQL.SaveToFile('c:\test.txt');将里面的信息拷贝出来看看
      

  2.   

    逻辑有问题吧
        adoquery1.Parameters.Clear;
          adoquery1.Parameters.Refresh; 
    你这里已经把parameter清除了,再次循环肯定找不到参数了
      

  3.   

    请把这句话,解释一下
    第二列为内容定位分别显示第一列中各个字段在cell表格中的位置旁边要填写的内容所在的行列数,右方为一个填写好信息的学籍表,
      

  4.   


    adoquery1.Parameters.Clear; 
    adoquery1.Parameters.Refresh;
    去掉,还是报这个错
      

  5.   

    ListView分为四列,窗体中还有一个cell组件,其中有一张填写好的学籍表,ListView第一列列名为‘字段名’,第二列显示一个行列数,这个行列数是这样的,假如学籍表要填写‘姓名’字段为‘张三’、‘性别’为‘女’、‘年龄’为‘22’等项,ListView中第一列就显示要填的项:姓名、性别、年龄,第二列显示张三、女、22这些内容在学籍表中的行列
    不知道我说清楚了没
      

  6.   

    你的listview的列是动态的吗?
    如果不是就别用循环拼写了for k:=0 to lvcount-1 do
    begin
          varname:=ListView1.Items[k].Caption;
          contentlocation:=ListView1.Items[k].SubItems[2];
          row:=strtoint(copy(contentlocation,1,1));
          col:=strtoint(copy(contentlocation,3,1));
          value1:=cell1.GetCellString(col,row,cell1.GetCurSheet);
          with adoquery1 do
          begin
            close;
            sql.text := ' insert into data(姓名,性别,年龄,所在班级,基本信息)'+
                        ' values(:a,:b,:c,:d,:e); 
            parameters.paramebyname('a').value := varname;
            parameters.paramebyname('b').value := varname;
            ......
          end;
    end; 
      

  7.   

    你的代码问题:
    adoquery1.Parameters.ParamByName(varname).Value:=value1; 应该在这里,你跟踪调试看看是否是你想要的结果
    像1楼说的
    ******************************
    估计是SQL语句的问题
    adoquery1.ExecSQL;
    在前面加一句看看
    ADOQuery1.SQL.SaveToFile('c:\test.txt');将里面的信息拷贝出来看看
    *******************************
    仔细检查一下你的逻辑吧,看着你的代码有点晕:)
      

  8.   

    ListView的列是动态的
    加了ADOQuery1.SQL.SaveToFile('c:\test.txt');
    导出的信息为
    insert into data(姓名,性别,年龄,所在班级,基本信息)
    values(:姓名,:性别,:年龄,:所在班级,:基本信息)真是不好意思,初学者,是很没有逻辑啊,唉,大家见笑了
      

  9.   

    写SQL语句的时候将空格去掉
    如: varname:=Trim(ListView1.Items[j].Caption); 
      

  10.   

      adoquery1.SQL.Add(sql1); 
      adoquery1.SQL.Add(sql2); 
    ==
    首先sql1和sql2之间要用空格隔开,否则values就跟sql1后面的)连到一起了
    另外最后不要用parameters, 直接用adoquery执行sql,如:insert into data(姓名,性别,年龄,所在班级,基本信息) 
    values('张三','男','22','计算机041','无'); 
    FormatString('insert into data (姓名,性别,年龄,所在班级,基本信息) values(''%s'',''%s'',''%s'',''%s'',''%s'')', strName, strSex, strAge, strClass, strBaseInfi)
    ...
      

  11.   

    ListView中的信息是随着表格的变化改变的,是动态的
      

  12.   

    1、注意中英文标点
    2、去掉空格:varname:=Trim(ListView1.Items[j].Caption); 
      

  13.   

    去掉空格了,可是又有错误,提示:Access violation at address …T_T
    快崩溃了……
      

  14.   

    请问
    insert into data(姓名,性别,年龄,所在班级,基本信息)
    values('张三','男','22','计算机041','无');
    怎么用字符串表达啊?
      

  15.   


     with adoquery1 do begin
      close;
      sql.Text:='insert into data([姓名],[性别],[年龄],[所在班级],[基本信息]) values(''张三'',''男'',''22'',''计算机041'',''无'')';
      open;
     end;另:这贴不会成为传说中的死贴吧???????????????
      

  16.   

    问题解决了,就是因为空格的问题,
    改为: varname:=Trim(ListView1.Items[j].Caption);后就可以导入了
    谢谢大家了,非常感谢!!!