我是用2个ADOCONNECTION和相关组件连接MYSQL和SQL SERVER2008,然后将数据取出再写入,之前对sql server2008不熟悉,用来数组参数,相当郁闷。。现在出现的问题是我改用变量 将读取到数据赋值给delphi中定义的变量再写入,变量赋值等等都没问题 到执行sql语句提示:变量列名无效。如hid列名无效,hid是delphi中的变量。
var  i:integer;
     //str:array[0..9] of string;
     hid:string;
     mid:string;
     mdate:string;
     utime:string;
     lo:string;
     la:string;
     hei:string;
     dir:string;
     spe:string;
     gtime:string;begin
adoquery2.Close;
adoquery2.sql.clear;
adoquery2.sql.add('select * from msgpshistory');
adoquery2.open;if not adoquery2.IsEmpty then begin
with AdoQuery2 do while not eof do begin
//for i := 0 to 9 do
//begin
hid:=adoquery2.Fields[0].AsString;
mid:=adoquery2.Fields[1].AsString;
mdate:=adoquery2.Fields[2].AsString;
utime:=adoquery2.Fields[3].AsString;
lo:=adoquery2.Fields[4].AsString;
la:=adoquery2.Fields[5].AsString;
hei:=adoquery2.Fields[6].AsString;
dir:=adoquery2.Fields[7].AsString;
spe:=adoquery2.Fields[8].AsString;
gtime:=adoquery2.Fields[9].AsString;
//end;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('insert into MC_historyPosinfo(historyPosinfoId,Msdid,msdsdate,updatetime,lon,Lat,height,direction,speed,Gpstime) values(hid,mid,mdate,utime,lo,la,hei,dir,spe,gtime) ');
//adoquery1.sql.add('insert into MC_historyPosinfo(historyPosinfoId,Msdid,msdsdate,updatetime,lon,Lat,height,direction,speed,Gpstime) values ("+str[0]+","+str[1]+","+str[2]+","+str[3]+","+str[4]+","+str[5]+","+str[6]+","+str[7]+","+str[8]+","+str[9]+")');
adoquery1.EXECSQL;
end;
end;
end;
求大神指点下。

解决方案 »

  1.   

    这样子:
    sql.add('... values('+Quotedstr(hid)+','+Quotedstr(mid)+','+Quotedstr(mdate)+',...');或者用参数的形式:
    sql.add('... values(:hid,:mid,:mdate,...');
    adoquery1.Parameters.ParamByName('hid').Value:=hid;
    adoquery1.Parameters.ParamByName('mid').Value:=mid;
    adoquery1.Parameters.ParamByName('mdate').Value:=mdate;
    ...
      

  2.   

    表中有字段类型为datetime型的,比如2012-9-10 20:50:17。现在我用string变量读取到了,如何在存储到另一个数据库的表中的时候转换为datetime而不发生语法错误?
    hid:=adoquery2.Fields[0].Asstring;
    mid:=adoquery2.Fields[1].AsString;
    mdate:=adoquery2.Fields[2].AsString;
    utime:=adoquery2.Fields[3].Asstring;
    lo:=adoquery2.Fields[4].AsString;
    la:=adoquery2.Fields[5].AsString;
    hei:=adoquery2.Fields[6].AsString;
    dir:=adoquery2.Fields[7].AsString;
    spe:=adoquery2.Fields[8].AsString;
    gtime:=adoquery2.Fields[9].Asstring;
    end;
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add('insert into dbo.MC_historyPosinfo(historyPosinfoId,Msdid,msdstate,updatetime,lon,Lat,height,direction,speed,Gpstime) values ('+hid+','+mid+','+mdate+','+utime+','+lo+','+la+','+hei+','+dir+','+spe+','+gtime+')');
      

  3.   

    var
         Fsetting:TFormatSettings;
         hid:string;
         mid,mdate,lo,la,hei,dir,spe:string;
         utime,gtime:Tdatetime;if not adoquery2.IsEmpty then begin
    with AdoQuery2 do while not eof do begin
    begin
    Fsetting.ShortDateFormat:='yyyy-MM-dd';
    FSetting.DateSeparator:='-';
    FSetting.LongTimeFormat:='hh:mm:ss';
    utime:=adoquery2.Fields[3].AsDateTime;
    gtime:=adoquery2.Fields[9].AsDateTime;
    end;adoquery1.sql.add('insert into dbo.MC_historyPosinfo(historyPosinfoId,Msdid,msdstate,updatetime,lon,Lat,height,direction,speed,Gpstime) values('+hid+','+mid+','+mdate+',:Cutime,'+lo+','+la+','+hei+','+dir+','+spe+',:Cgtime)');
    adoquery1.Parameters.ParamByName('Cutime').value:=utime;
    adoquery1.Parameters.ParamByName('Cgtime').Value:=gtime;我看网上用参数解决,但是不行,求解决。
      

  4.   

    日期类型只要格式正确就行 values('2012-9-10 20:50:17')
    像这个values('2012-19-10 20:50:17'),肯定就是报错的另外你的 values ('+hid+','+mid+',...
    如果是字段是字符类型的话,是错的,少了引号,要像这样 values ('''+hid+''','''+mid+''',...
    但若这样加引号,如果hid变量中也有引号的话,也是錯的; 所以最好使用Quotedstr()函数,像2楼的最终sql语句,变成这成
    insert into t(a,b,c) values ('小三','小四','小五')如果对sql语句,引号处理没有把握的话,就先用edit/append,然后post吧
      

  5.   

    begin
    hid:=adoquery2.Fields[0].Asstring;
    mid:=adoquery2.Fields[1].AsString;
    mdate:=adoquery2.Fields[2].AsString;
    utime:=adoquery2.Fields[3].Asstring;
    lo:=adoquery2.Fields[4].AsString;
    la:=adoquery2.Fields[5].AsString;
    hei:=adoquery2.Fields[6].AsString;
    dir:=adoquery2.Fields[7].AsString;
    spe:=adoquery2.Fields[8].AsString;
    gtime:=adoquery2.Fields[9].AsString;
    end;
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add('insert into dbo.MC_historyPosinfo(historyPosinfoId,Msdid,msdstate,updatetime,lon,Lat,height,direction,speed,Gpstime) values ('+Quotedstr(hid)+','+Quotedstr(mid)+','+Quotedstr(mdate)+','+Quotedstr(utime)+','+Quotedstr(lo)+','+Quotedstr(la)+','+Quotedstr(hei)+','+Quotedstr(dir)+','+Quotedstr(spe)+','+Quotedstr(gtime)+')');
    //adoquery1.sql.add('insert into dbo.MC_historyPosinfo(updatetime,Gpstime) values (:Cutime,:Cgtime)');
    adoquery1.Parameters.ParamByName('mid').Value:=hid;
    adoquery1.Parameters.ParamByName('mid').Value:=mid;
    adoquery1.Parameters.ParamByName('mdate').Value:=mdate;
    adoquery1.Parameters.ParamByName('utime').value:=utime;
    adoquery1.Parameters.ParamByName('lo').Value:=lo;
    adoquery1.Parameters.ParamByName('la').Value:=la;
    adoquery1.Parameters.ParamByName('hei').Value:=hei;
    adoquery1.Parameters.ParamByName('dir').Value:=dir;
    adoquery1.Parameters.ParamByName('spe').Value:=spe;
    adoquery1.Parameters.ParamByName('gtime').Value:=gtime;adoquery1.open;
    提示Parameter ‘hid’ not found  可断电调试可以发现hid变量是有值得 为‘394602’