none
openrowset RRS feed

  • Pergunta

  • Pessoal, estou usando o openrowset para fazer algumas consultas em uma base de dados foxpro.

    O exemplo abaixo, funciona perfeitamente:

    select * from
     openrowset('VFPOLEDB.1', 'C:\copyco_new\MOMDATA.DBC'; ' '; ' ',
    'select * from stock where number="BC006"')

    Por outro lado, se eu tenho dar um update:

    select * from
    openrowset('VFPOLEDB.1', 'C:\copyco_new\MOMDATA.DBC'; ' '; ' ',
    'Update stock set desc1= "Sun Screen 2" where number="BC006"')

    Eu recebo a seguinte mensagem de erro:

    Could not process object 'Update stock set desc1= "Sun Screen 2" where number="BC006"'. The OLE DB provider 'VFPOLEDB.1' indicates that the object has no columns.
    OLE DB error trace [Non-interface error:  OLE DB provider unable to process object, since the object has no columnsProviderName='VFPOLEDB.1', Query=Update stock set desc1= "Sun Screen 2" where number="BC006"'].

    Usei como exemplo o artigo abaixo:

    http://support.microsoft.com/kb/207595

    --* Need to use an error trapping routine with the UPDATE and DELETE functions:
    select * from
     openrowset('VFPOLEDB',
       'E:\VFP7Junk\Testdata.DBC';'Exclusive=No';'Data Source=DBC',
       'Update Customer Set city = "SEATTLE" where region = "WA" ')


    Obrigado desde já pela ajuda.

    terça-feira, 10 de março de 2009 09:42

Todas as Respostas

  • assim nao ____

    select * from
    openrowset('VFPOLEDB.1', 'C:\copyco_new\MOMDATA.DBC'; ' '; ' ',
    'Update stock set desc1= "Sun Screen 2" where number="BC006"')

    se vc. precisa dar um update, tente assim:

    Update OPENDATASOURCE(provider, local, catalgo etc.)...Tabela
    Set campo = novo_valor
    where ...

    segue exemplo para excel que tambem e jet.

    Update OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source="caminho\planilha.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...Sheet1$           
    set campo1 = 10

    Abs;

    mcolla@bol.com.br
    terça-feira, 10 de março de 2009 10:26
  • Marcelo, muito obrigado pela resposta.

    Tentei exatamente oq vc falou:

    UPDATE OPENDATASOURCE('VFPOLEDB.1','Data Source=''C:\copyco_new\MOMDATA.DBC''')...stock
    set desc1= 'Sun Screen 2'
    where number='BC006'

    Mas recebo a mensagem de erro:

    Could not fetch a row using a bookmark from OLE DB provider 'VFPOLEDB.1'.
    [OLE/DB provider returned message: Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.]
    OLE DB error trace [OLE/DB Provider 'VFPOLEDB.1' IRowsetLocate::GetRowsByBookmark returned 0x80040e21:  34000000].

    Obrigado mais uma vez.
    APJ
    terça-feira, 10 de março de 2009 11:02
  • APJ78,

    Tente assim:

    1 UPDATE OPENDATASOURCE([VFPOLEDB.1],'Data Source=''C:\copyco_new\MOMDATA.DBC''')...stock  
    2 set desc1= 'Sun Screen 2'   
    3 where number='BC006' 

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 10 de março de 2009 14:07
  • Bom Dia,

    Seu SQL Server é 2005 ? Se sim, recomendo tentar o seguinte:

    DECLARE @CMDSQL VARCHAR(200)  
    SET @CMDSQL = 'Update Stock Set Desc1 = "Sun Screen 2" WHERE Number = "BC006"' 
     
    EXEC @CMDSQL AT [VFPOLEBD.1] 

    Outra possibilidade é criar uma View e realizar o UPDATE contra a View (CTEs também podem ser utilizadas) embora a instrução acima seja mais performática.

    Estou recomendando, mas se a sugestão do Colla já retornou esses erros há uma grande chance de estar faltando alguma chave primária na tabela.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Será que LEFT OUTER JOIN e RIGHT OUTER JOIN são sinôminos de *= e =* ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!422.entry
    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 10 de março de 2009 14:29
  • Obrigado por todas as sugestoes.

    Estou usando o SQL 2000.

    Tentei a linha sugerida pelo Junior, mas infelizmente, nao funcionou. Erro de sintaxe.

    []s
    terça-feira, 10 de março de 2009 16:50
  • Apj,

    Esta extensão .DBC pertence a qual ferramenta?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 10 de março de 2009 17:35
  • Oi Junior.

    Pertence ao foxpro.

    Eu acabei de criar um código em c#, utilizando o mesmo provider (VFPOLEDB.1) para dar update no conteúdo:

    OleDbConnection momDB;

    momDB=new OleDbConnection("Provider=VFPOLEDB.1;Data Source=C:\\copyco_new\\MOMDATA.DBC;Mode=Share Deny None;Extended Properties='';User ID='';Mask Password=False;Cache Authentication=False;Encrypt Password=False;Collating Sequence=MACHINE;DSN='';DELETED=True;CODEPAGE=1252;MVCOUNT=16384;ENGINEBEHAVIOR=90;TABLEVALIDATE=3;REFRESH=5;VARCHARMAPPING=False;ANSI=True;REPROCESS=5");
    momDB.Open();

    OleDbCommand command = new OleDbCommand("Update stock set desc1= 'Sun Screen test' where number='BC006'", momDB);

    command.ExecuteNonQuery();

    momDB.Close();

    Funcionou perfeitamente.

    Só nao consigo fazer funcionar via Query Analyzer.

    Obrigado por toda a ajuda até agora.


    terça-feira, 10 de março de 2009 18:05
  • Boa Noite,

    Essa tabela tem índice ou chave primária na coluna Number ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Será que LEFT OUTER JOIN e RIGHT OUTER JOIN são sinôminos de *= e =* ?
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!422.entry
    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 11 de março de 2009 02:51
  • o exemplo que passei e para excel, veja o no book on line tem exemplos para xbasse tambem.

    qq coisa retorne,

    Abs
    mcolla@bol.com.br
    quarta-feira, 11 de março de 2009 10:34