我水平比较低级,这是我毕业设计中出现的问题,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; 原谅小女子愚笨,忘各位大侠帮帮忙让我顺利毕业吧。
如: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; 原谅小女子愚笨,忘各位大侠帮帮忙让我顺利毕业吧。
adoquery1.ExecSQL;
在前面加一句看看
ADOQuery1.SQL.SaveToFile('c:\test.txt');将里面的信息拷贝出来看看
adoquery1.Parameters.Clear;
adoquery1.Parameters.Refresh;
你这里已经把parameter清除了,再次循环肯定找不到参数了
第二列为内容定位分别显示第一列中各个字段在cell表格中的位置旁边要填写的内容所在的行列数,右方为一个填写好信息的学籍表,
adoquery1.Parameters.Clear;
adoquery1.Parameters.Refresh;
去掉,还是报这个错
不知道我说清楚了没
如果不是就别用循环拼写了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;
adoquery1.Parameters.ParamByName(varname).Value:=value1; 应该在这里,你跟踪调试看看是否是你想要的结果
像1楼说的
******************************
估计是SQL语句的问题
adoquery1.ExecSQL;
在前面加一句看看
ADOQuery1.SQL.SaveToFile('c:\test.txt');将里面的信息拷贝出来看看
*******************************
仔细检查一下你的逻辑吧,看着你的代码有点晕:)
加了ADOQuery1.SQL.SaveToFile('c:\test.txt');
导出的信息为
insert into data(姓名,性别,年龄,所在班级,基本信息)
values(:姓名,:性别,:年龄,:所在班级,:基本信息)真是不好意思,初学者,是很没有逻辑啊,唉,大家见笑了
如: varname:=Trim(ListView1.Items[j].Caption);
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)
...
2、去掉空格:varname:=Trim(ListView1.Items[j].Caption);
快崩溃了……
insert into data(姓名,性别,年龄,所在班级,基本信息)
values('张三','男','22','计算机041','无');
怎么用字符串表达啊?
with adoquery1 do begin
close;
sql.Text:='insert into data([姓名],[性别],[年龄],[所在班级],[基本信息]) values(''张三'',''男'',''22'',''计算机041'',''无'')';
open;
end;另:这贴不会成为传说中的死贴吧???????????????
改为: varname:=Trim(ListView1.Items[j].Caption);后就可以导入了
谢谢大家了,非常感谢!!!