Você está offline; aguardando reconexão

Como atualizar um banco de dados do SQL Server usando o objeto SqlDataAdapter no Visual C++ .NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 308510
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 308055.
Para um Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 308507.

Este artigo se refere ao seguinte namespace Microsoft .NET Framework Class Library:
  • System::Data::SqlClient

NESTA TAREFA

Sumário
O objeto SqlDataAdapter serve como uma ponte entre um objeto DataSet do ADO.NET e um banco de dados do Microsoft SQL Server. Ele é um objeto intermediário que você pode usar para fazer o seguinte:
  • Preencher um ConjuntoDeDados ADO.NET com dados recuperados de um SQL Server banco de dados.

    - e -
  • Atualiza o banco de dados para refletir as alterações (inserções, atualizações, exclusões) feitas nos dados usando o DataSet.
Este artigo fornece exemplos de código do Visual C++ .NET para demonstrar como o objeto SqlDataAdapter pode ser usado para atualizar um banco de dados do SQL Server com modificações de dados executadas em um objeto de DataSet que é preenchido com dados de uma tabela no banco de dados.

back to the top

Para mais informações

As propriedades InsertCommand , UpdateCommand e DeleteCommand do objeto SqlDataAdapter são usadas para atualizar o banco de dados com as modificações de dados executadas em um objeto DataSet . Cada uma dessas propriedades são objetos SqlCommand que especifique os respectivos INSERT, UPDATE e DELETE TSQL comandos usados para lançar as modificações de DataSet para o banco de dados destino. Os objetos SqlCommand atribuídos a essas propriedades podem ser criados manualmente no código ou podem ser gerados automaticamente usando o objeto SqlCommandBuilder .

O primeiro código de exemplo neste artigo demonstra como o objeto SqlCommandBuilder pode ser usado para gerar automaticamente a propriedade UpdateCommand do objeto SqlDataAdapter . O segundo exemplo usa um cenário no qual geração do comando automático não pode ser usada e, portanto, demonstra o processo pelo qual você pode manualmente criar e usar um objeto SqlCommand como a propriedade UpdateCommand de um objeto SqlDataAdapter .

back to the top

Criar na tabela de exemplo do SQL Server

Para criar uma tabela do SQL Server de exemplo para usar os exemplos de código do Visual C++ .NET documentados neste artigo, execute essas etapas:
  1. Abra o SQL Server Query Analyzer e, em seguida, conecte-se para um banco de dados no qual você deseja criar a tabela de exemplo. Os exemplos de código neste artigo usam o banco de dados Northwind que vem com o SQL Server.
  2. Execute seguintes instruções T-SQL para criar uma tabela de exemplo chamada CustTest e insira um registro para ele:
    Create Table CustTest( CustID int primary key, CustName varchar(20))Insert into CustTest values(1,'John')					
back to the top

Código de exemplo 1: gerado automaticamente comandos

Se a instrução SELECT para recuperar os dados usados para preencher um DataSet é baseada em uma tabela de banco de dados único, você pode tirar proveito do objeto CommandBuilder para gerar automaticamente as propriedades DeleteCommand , InsertCommand e UpdateCommand do DataAdapter. Isso simplifica e reduz o código necessário para executar operações INSERT, UDPATE e DELETE.

Como um requisito mínimo, você deve definir a propriedade SelectCommand para geração automática de comando trabalhar. O esquema da tabela recuperado pelo SelectCommand determina a sintaxe das instruções INSERT, UPDATE e DELETE geradas automaticamente.

O SelectCommand também deve retornar pelo menos uma chave primária ou de coluna exclusiva. Se nenhum presente, será gerada uma exceção InvalidOperation e os comandos não são gerados.

Para criar um aplicativo console Visual C++ .NET de exemplo que demonstra como usar o objeto SqlCommandBuilder para gerar automaticamente o InsertCommand , DeleteCommand e propriedades de objeto UpdateCommand SqlCommand para um objeto SqlDataAdapter , execute essas etapas:
  1. Inicie o Visual Studio.NET e crie um novo C++ gerenciado aplicativo. Nome updateSQL.
  2. Copie e cole o código a seguir no updateSQL.cpp (substituindo o conteúdo padrão):
    #include "stdafx.h"#using <mscorlib.dll>#using <System.dll>#using <System.Data.dll>#using <System.Xml.dll>using namespace System;using namespace System::Data;using namespace System::Data::SqlClient;#ifdef _UNICODEint wmain(void)#elseint main(void)#endif{        SqlConnection *cn = new SqlConnection();        DataSet *CustomersDataSet = new DataSet();        SqlDataAdapter *da;        SqlCommandBuilder *cmdBuilder;          //Set the connection string of the SqlConnection object to connect        //to the SQL Server database in which you created the sample        //table in Section 1.0        cn->ConnectionString =  "Server=server;Database=northwind;UID=login;PWD=password;";        cn->Open();              //Initialize the SqlDataAdapter object by specifying a Select command         //that retrieves data from the sample table        da = new SqlDataAdapter("select * from CustTest order by CustId", cn);        //Initialize the SqlCommandBuilder object to automatically generate and initialize        //the UpdateCommand, InsertCommand and DeleteCommand properties of the SqlDataAdapter        cmdBuilder = new SqlCommandBuilder(da);        //Populate the DataSet by executing the Fill method of the SqlDataAdapter        da->Fill(CustomersDataSet, "Customers");        //Display the Update, Insert and Delete commands that were automatically generated        //by the SqlCommandBuilder object 	Console::WriteLine("Update command Generated by the Command Builder : ");	Console::WriteLine("==================================================");	Console::WriteLine(cmdBuilder->GetUpdateCommand()->CommandText);	Console::WriteLine("         ");	Console::WriteLine("Insert command Generated by the Command Builder : ");	Console::WriteLine("==================================================");	Console::WriteLine(cmdBuilder->GetInsertCommand()->CommandText);	Console::WriteLine("         ");        	Console::WriteLine("Delete command Generated by the Command Builder : ");	Console::WriteLine("==================================================");	Console::WriteLine(cmdBuilder->GetDeleteCommand()->CommandText);	Console::WriteLine("         ");        //Write out the value in the CustName field before updating the data using the DataSet	DataRow *rowCust = CustomersDataSet->Tables->Item["Customers"]->Rows->Item[0];	Console::WriteLine("Customer Name before Update : {0} ", rowCust->Item["CustName"]);		        //Modify the value of the CustName field	String *newStrVal = new String("Jack");          rowCust->set_Item("CustName", newStrVal);        //Modify the value of the CustName field again        String *newStrVal2 = new String("Jack2");          rowCust->set_Item("CustName", newStrVal2);        //Post the data modification to the database        da->Update(CustomersDataSet, "Customers");                Console::WriteLine("Customer Name after Update : {0} ", rowCust->Item["CustName"]);        //Close the database connection        cn->Close();        //Pause	Console::ReadLine(); 	    		return 0;} 					
  3. O código copiado e colado na etapa 2, modifique a linha de código de seqüência de caracteres de conexão para corretamente conectar ao computador SQL Server, da seguinte maneira:
    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";						
    após você executa este código, você pode se conectar com o SQL Server instalação e, em seguida, logon.
  4. Salvar e executar o aplicativo. Uma janela do console será aberto e exibirá a seguinte saída:
    Update command generated by the Command Builder: ==================================================UPDATE CustTest SET CustID = @p1 , CustName = @p2 WHERE ( (CustID = @p3) AND ((CustName IS NULL AND @p4 IS NULL) OR (CustName = @p5)) )         Insert command generated by the Command Builder : ==================================================INSERT INTO CustTest( CustID , CustName ) VALUES ( @p1 , @p2 )         Delete command generated by the Command Builder : ==================================================DELETE FROM  CustTest WHERE ( (CustID = @p1) AND ((CustName IS NULL AND @p2 IS NULL) OR (CustName = @p3)) )         Customer Name before Update : JohnCustomer Name after Update : Jack2					
  5. Pressione qualquer tecla para fechar a janela do console e interromper o aplicativo.
back to the top

Código de exemplo 2: criar e inicializar a propriedade UpdateCommand manualmente

A saída gerada pelo código exemplo 1 indica que a lógica para gerar comandos automaticamente para instruções UPDATE se baseia em simultaneidade otimista . Ou seja, registros não estão bloqueados para edição e podem ser modificados por outros usuários ou processos em qualquer momento. Como um registro pode tiver sido modificado depois que ele foi retornado da instrução SELECT, mas antes do UPDATE instrução é emitida, a instrução UPDATE gerada automaticamente contém uma cláusula WHERE para que uma linha seja atualizada somente se ele contém todos os valores originais e não foi excluído. Isso é feito para garantir que novos dados não são substituídos. Em casos onde uma atualização gerada automaticamente tenta atualizar uma linha que foi excluída ou não contém os valores originais encontrados no DataSet, o comando não afeta todos os registros e um DBConcurrencyException é lançada.

Se você desejar UPDATE para concluir independentemente dos valores originais, você precisará explicitamente definir o UpdateCommand para o DataAdapter vez dependem de geração automática de comando.

Para criar e inicializar a propriedade UpdateCommand do objeto SqlDataAdapter usado no código exemplo 1 manualmente, execute essas etapas:
  1. Copie e cole o código seguinte (substituindo o código existente) na função Main() dentro do arquivo UpdateSQL.cpp no aplicativo de C++ criado no código exemplo 1:
    SqlConnection *cn = new SqlConnection();DataSet *CustomersDataSet = new DataSet();SqlDataAdapter *da;SqlCommand *DAUpdateCmd;cn->ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";cn->Open();da = new SqlDataAdapter("select * from CustTest order by CustId", cn);//Initialize the SqlCommand object that will be used as the DataAdapter's UpdateCommand//Notice that the WHERE clause uses only the CustId field to locate the record to be updatedDAUpdateCmd = new SqlCommand("Update CustTest set CustName = @pCustName where CustId = @pCustId", da->SelectCommand->Connection);//Create and append the parameters for the Update commandDAUpdateCmd->Parameters->Add(new SqlParameter("@pCustName", SqlDbType::VarChar));DAUpdateCmd->Parameters->Item["@pCustName"]->SourceVersion = DataRowVersion::Current;DAUpdateCmd->Parameters->Item["@pCustName"]->SourceColumn = "CustName";DAUpdateCmd->Parameters->Add(new SqlParameter("@pCustId", SqlDbType::Int));DAUpdateCmd->Parameters->Item["@pCustId"]->SourceVersion = DataRowVersion::Original;DAUpdateCmd->Parameters->Item["@pCustId"]->SourceColumn = "CustId";//Assign the SqlCommand to the UpdateCommand property of the SqlDataAdapterda->UpdateCommand = DAUpdateCmd;        da->Fill(CustomersDataSet, "Customers");        DataRow *rowCust = CustomersDataSet->Tables->Item["Customers"]->Rows->Item[0];Console::WriteLine("Customer Name before Update : {0} ", rowCust->Item["CustName"]);//Modify the value of the CustName fieldString *newStrVal = new String("Jack"); rowCust->set_Item("CustName", newStrVal);//Modify the value of the CustName field againString *newStrVal2 = new String("Jack2");  rowCust->set_Item("CustName", newStrVal2);da->Update(CustomersDataSet, "Customers");        Console::WriteLine("Customer Name after Update : {0} ", rowCust->Item["CustName"]);cn->Close();Console::ReadLine();return 0;					
  2. Modifique a linha de código de seqüência de caracteres de conexão no exemplo de código anterior da seguinte maneira:
    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";					
  3. Se você já tiver executado o código no "código exemplo 1" seção deste artigo, abrir seu CustTest tabela no SQL Server e em seguida, altere o valor CustName no primeiro registro novamente para José .
  4. Salvar e executar o aplicativo. Uma janela do console será aberto e exibirá a seguinte saída:
    Customer Name before Update : JohnCustomer Name after Update : Jack2					
back to the top

Propriedades

ID do Artigo: 308510 - Última Revisão: 02/27/2006 20:56:14 - Revisão: 3.3

Microsoft ADO.NET 1.0, Microsoft ADO.NET 1.1, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft Visual C++ .NET 2003 Standard Edition

  • kbmt kbhowtomaster kbsqlclient kbsystemdata KB308510 KbMtpt
Comentários
pt>"); ocument.getElementsByTagName("head")[0].appendChild(m); cript>