Este artigo passo a passo mostra como tirar um DataSet que contém dados (que são carregados de um banco de dados), como modificar os dados e, em seguida, como enviá-lo de volta para o banco de dados para atualizar a fonte original.
objetos DataSet , uma parte fundamental do acesso a dados no Microsoft .NET Framework, são objetos na memória que podem conter tabelas, exibições e relações.
A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você precisa:
Um dos seguintes: Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Server ou Microsoft Windows NT 4.0 Server
Um dos seguintes: Microsoft SQL Server versão 7.0, Microsoft SQL Server 2000 ou Microsoft Data Engine (MSDE) com o banco de dados de exemplo PUBS instalado com as permissões apropriadas, UserID e senha valores.
Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005
Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:
Terminologia de banco de dados
Linguagem de consulta estruturada (SQL)
Como atualizar um banco de dados de um objeto de DataSet
Esta seção demonstra como usar o objeto de DataSet para atualizar dados em um banco de dados.
importante Você também pode usar um objeto SqlCommand para inserir, atualizar e excluir dados em um banco de dados diretamente.
Depois que o DataSet é carregada, você pode modificar os dados. O DataSet irá controlar essas alterações. O objeto DataSet pode ser considerado um cache na memória dos dados que são recuperados de um banco de dados. O objeto DataSet consiste em um conjunto de tabelas, relacionamentos e restrições.
Para atualizar um DataSet e enviar as atualizações de volta para o banco de dados, execute estas etapas:
Abra o Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
Crie um novo Aplicativo de C++ gerenciado no Visual C++ NET.. O Visual Studio cria uma função main() . Remove a função main() qualquer código gerado.
Para adicionar uma referência aos namespaces System.Data e de sistema , adicione o código a seguir
Use a instrução USING sobre os espaços para nome System.Data.SqlClient , System.Data e sistema para que não é necessário para qualificar declarações desses namespaces posteriormente no seu código. Você deve usar estas instruções antes de qualquer outra declaração.
using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Data::SqlClient;
Antes de modificar os dados e enviar que as alterações de volta para o banco de dados, você deve carregar as informações em DataSet .
A seqüência de conexão no código a seguir aponta para um SQL Server que está localizado no computador local (ou o computador onde o código está sendo executado). Substitua esta seqüência de caracteres por suas próprias configurações.
Para resumir, uma conexão é criada, e um adaptador de dados é criado, que é usado para preencher o DataSet com dados.
SqlConnection *objConn;
String *sConnectionString;
sConnectionString = "Password=StrongPassword;User ID=UserName;Initial Catalog=pubs;Data Source=(local)";
objConn = new SqlConnection(sConnectionString);
objConn->Open();
// Create an instance of a DataAdapter.
SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);
// Create an instance of a DataSet, and retrieve data from the Authors table.
DataSet* dsPubs = new DataSet("Pubs");
daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
daAuthors->Fill(dsPubs,"Authors");
Observação você deve adicionar o common language runtime oferecem suporte a compilador opção (/ CLR: oldSyntax) no Visual C++ 2005 a compilar com êxito o exemplo de código anterior. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum no Visual C++ 2005, siga estas etapas:
Clique em Project e clique em <ProjectName> propriedades .
Observação <ProjectName> é um espaço reservado para o nome do projeto.
Expanda Configuration Properties e, em seguida, clique em Geral .
Clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) no projeto oferece suporte a Common Language Runtime configuração no painel à direita, clique em Aplicar e em seguida, clique em OK .
Para obter mais informações sobre o common language runtime oferece suporte à opção do compilador, visite o seguinte site da Microsoft:
Agora que os dados são carregados, você pode modificá-lo. Há várias maneiras para adicionar uma linha (ou registro). Este exemplo de código usa um procedimento três etapas:
Obtenha um novo objeto DataRow DataTable .
Defina os valores de campo DataRow conforme necessário.
Passe esse novo objeto para o método Add da coleção DataTable.Rows .
Cole o seguinte código após o código na etapa 5:
// BEGIN ADD CODE
// Create a new instance of a DataTable.
DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];
// Obtain a new DataRow object from the DataTable.
DataRow* drCurrent = tblAuthors->NewRow();
// Set the DataRow field values as necessary.
drCurrent->set_Item("au_id",new String("993-21-3427"));
drCurrent->set_Item("au_fname",new String("George"));
drCurrent->set_Item("au_lname",new String("Johnson"));
drCurrent->set_Item("phone",new String("800 226-0752"));
drCurrent->set_Item("address", new String ("1956 Arlington Pl."));
drCurrent->set_Item("city", new String("Winnipeg"));
drCurrent->set_Item("state", new String("MB"));
drCurrent->set_Item("contract",__box(1));
// Pass that new object into the Add method of the DataTable.
tblAuthors->Rows->Add(drCurrent);
Console::WriteLine("Add was successful, Click any key to continue!!");
Console::ReadLine();
// END ADD CODE
Para editar linhas existentes, obtenha o objeto DataRow apropriado e fornecer novos valores para uma ou mais colunas. Primeiro você deve localizar a linha correta, que é muito mais fácil porque você carregou o esquema da tabela, bem como os dados (a chamada para FillSchema na etapa 5). Com o esquema no lugar, a tabela sabe qual coluna é sua chave primária e o método Find da coleção de linhas está disponível.
O método Find retorna o objeto DataRow com um valor específico na sua chave primária (no caso, au_id). Depois de ter que DataRow , você pode modificar as colunas. Não é necessário que quebrar as modificações no BeginEdit e EndEdit , mas isso simplifica o trabalho que o DataSet tem a ver e permite que o DataSet executar suas verificações de validação simultaneamente quando EndEdit é chamado.
Cole o seguinte código após o código na etapa 6:
// BEGIN EDIT CODE
drCurrent = tblAuthors->Rows->Find(new String("213-46-8915"));
drCurrent->BeginEdit();
drCurrent->set_Item("phone",String::Concat(S"342",(static_cast<String *>(drCurrent->Item["phone"]))->Substring(3)));
drCurrent->EndEdit ();
Console::WriteLine("Record edited successfully, Click any key to continue!!");
Console::ReadLine();
// END EDIT CODE
Para atualizar o banco de dados original com todas essas alterações, passe o DataSet para o método Update do objeto DataAdapter .
No entanto, antes de chamar Update , você deve definir as propriedades InsertCommand , UpdateCommand e DeleteCommand do objeto DataAdapter . Você pode escrever SQL e preencher essas três propriedades com os objetos correspondentes do SqlCommand manualmente, mas você também pode usar o Visual Studio .NET para gerar esses três comandos automaticamente.
Para gerar os comandos necessários quando forem necessários, você deve criar uma instância do objeto SqlCommandBuilder e use o DataAdapter no construtor. Se você desejar usar esse método (mostrado no exemplo de código que segue), você deve ter informações de chave primária disponíveis para a sua tabela. Para acessar informações de chave primária, chamada FillSchema e em seguida, defina a propriedade MissingSchemaAction do DataAdapter para AddWithKey ou definir manualmente a chave primária no seu código.
Cole o seguinte código após o código na etapa 7.
// BEGIN SEND CHANGES TO SQL SERVER
SqlCommandBuilder* objCommandBuilder = new SqlCommandBuilder(daAuthors);
daAuthors->Update(dsPubs, "Authors");
Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
Console::ReadLine();
// END SEND CHANGES TO SQL SERVER
Para excluir uma linha completamente, use o método Delete do objeto DataRow .
Observação A coleção Rows contém dois métodos, Remove e RemoveAt , que parecer excluir a linha, mas em vez disso, remover apenas a linha da coleção. Somente o método Delete envia sua exclusão de volta ao banco de dados de origem.
Cole o seguinte código após o código na etapa 8:
//BEGIN DELETE CODE
drCurrent = tblAuthors->Rows->Find(new String("993-21-3427"));
drCurrent->Delete();
Console::WriteLine("Record deleted successfully, Click any key to continue!!");
Console::ReadLine();
//END DELETE CODE
Envie as alterações para SQL Server para remover o registro que você adicionou anteriormente.
Cole o seguinte código após o código na etapa 9:
// CLEAN UP SQL SERVER
daAuthors->Update(dsPubs, "Authors");
Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
Console::ReadLine();
objConn->Close ();
Salve seu projeto.
No menu Debug , clique em Iniciar para executar o projeto.
Observe que várias caixas de mensagem aparecerem, que indicar o andamento do código e permitem que você revise o estado atual dos dados conforme o andamento do código.
Concluir a listagem de código
// This is the main project file for VC++ application project
// generated using an Application Wizard.
#include "stdafx.h"
#using <mscorlib.dll>
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.dll>
#include <tchar.h>
using namespace System;
using namespace System::Xml;
using namespace System::Data;
using namespace System::Data::SqlClient;
// This is the entry point for this application
int _tmain(void)
{
SqlConnection *objConn;
try
{
String *sConnectionString;
sConnectionString = "Password=StrongPassword;User ID=UserName;Initial Catalog=pubs;Data Source=(local)";
objConn = new SqlConnection(sConnectionString);
objConn->Open();
// Create an instance of a DataAdapter.
SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);
// Create an instance of a DataSet, and retrieve data from the Authors table.
DataSet* dsPubs = new DataSet("Pubs");
daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
daAuthors->Fill(dsPubs,"Authors");
// BEGIN ADD CODE
// Create a new instance of a DataTable.
DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];
// Obtain a new DataRow object from the DataTable.
DataRow* drCurrent = tblAuthors->NewRow();
// Set the DataRow field values as necessary.
drCurrent->set_Item("au_id",new String("993-21-3427"));
drCurrent->set_Item("au_fname",new String("George"));
drCurrent->set_Item("au_lname",new String("Johnson"));
drCurrent->set_Item("phone",new String("800 226-0752"));
drCurrent->set_Item("address", new String ("1956 Arlington Pl."));
drCurrent->set_Item("city", new String("Winnipeg"));
drCurrent->set_Item("state", new String("MB"));
drCurrent->set_Item("contract",__box(1));
// Pass that new object into the Add method of the DataTable.
tblAuthors->Rows->Add(drCurrent);
Console::WriteLine("Add was successful, Click any key to continue!!");
Console::ReadLine();
// END ADD CODE
// BEGIN EDIT CODE
drCurrent = tblAuthors->Rows->Find(new String("213-46-8915"));
drCurrent->BeginEdit();
drCurrent->set_Item("phone",String::Concat(S"342",(static_cast<String *>(drCurrent->Item["phone"]))->Substring(3)));
drCurrent->EndEdit ();
Console::WriteLine("Record edited successfully, Click any key to continue!!");
Console::ReadLine();
// END EDIT CODE
// BEGIN SEND CHANGES TO SQL SERVER
SqlCommandBuilder* objCommandBuilder = new SqlCommandBuilder(daAuthors);
daAuthors->Update(dsPubs, "Authors");
Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
Console::ReadLine();
// END SEND CHANGES TO SQL SERVER
//BEGIN DELETE CODE
drCurrent = tblAuthors->Rows->Find(new String("993-21-3427"));
drCurrent->Delete();
Console::WriteLine("SRecord deleted successfully, Click any key to continue!!");
Console::ReadLine();
//END DELETE CODE
// CLEAN UP SQL SERVER
daAuthors->Update(dsPubs, "Authors");
Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
Console::ReadLine();
}
catch (Exception* ex)
{
Console::WriteLine (ex->Message );
}
__finally
{
objConn->Close ();
}
}
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: 815660
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.