<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom"><channel><title>Dicas Técnicas BufaloInfo</title><link>http://www.bufaloinfo.com.br/</link><description>Dicas Técnicas Produzidas pela Búfalo Informática</description><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1022</link><title>ADO.NET : Testando null em um campo ValueType no DataSet</title><description>&lt;br&gt;Vari&amp;#225;veis do tipo ValueType no .NET n&amp;#227;o podem receber valores nulos. Entre elas est&amp;#227;o incluidas vari&amp;#225;veis num&amp;#233;ricas e datetime.&lt;br&gt;&lt;br&gt;Por&amp;#233;m &amp;#233; natural que o banco de dados possua campos num&amp;#233;ricos e datetime que aceitem nulo. Neste caso o dataset marcar&amp;#225; os campos como aceitando DBNull.&lt;br&gt;&lt;br&gt;O nulo do banco &amp;#233; um tipo especial no .NET, o tipo DBNull, que pode ser recuperado atrav&amp;#233;s de DBNull.Value&lt;br&gt;&lt;br&gt;O problema &amp;#233; que voc&amp;#234; n&amp;#227;o pode comparar o campo do dataset com null (C#) com Nothing (VB.NET), usar a fun&amp;#231;&amp;#227;o IsNothing (VB.NET) ou usar a fun&amp;#231;&amp;#227;o IsDBNull, nada disso ir&amp;#225; funcionar, pois dentro do get da propriedade tipada ocorre um erro pelo fato do valueType ter valor nulo.&lt;br&gt;&lt;br&gt;Para resolver este problema, quando um campo do dataset tem a op&amp;#231;&amp;#227;o definida para aceitar DBNull, o dataset tipado cria uma propriedade para testar o nulo neste campo.&lt;br&gt;&lt;br&gt;Por exemplo, se o campo se chama Data, &amp;#233; criada uma propriedade chamada isDataNull, que deve ser usada para testar se o campo data &amp;#233; nulo antes de ser feito um acesso direto ao campo data.&lt;br&gt;&lt;br&gt;Por exemplo :&lt;br&gt;&lt;br&gt;dim l as linharegistro&lt;br&gt;....&lt;br&gt;&lt;br&gt;if l.isdatanull then&lt;br&gt;...&lt;br&gt;&lt;br&gt;end if&lt;br&gt;&lt;br&gt;C#&lt;br&gt;&lt;br&gt;linharegistro l;&lt;br&gt;&lt;br&gt;...&lt;br&gt;&lt;br&gt;if (l.isDataNull)&lt;br&gt;{&lt;br&gt;....&lt;br&gt;}&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=882</link><title>ADO.NET : Editando Schemas de dataSets no VS 2005 (e gerando RSS)</title><description>&lt;br&gt;No artigo que encontra-se em http://www.bufaloinfo.com.br/artigos/artigo0701.asp mostrei os detalhes de como produzir RSS facilmente utilizando um dataSet no VS 2003.&lt;br&gt;&lt;br&gt;O problema &amp;#233; que o editor de DataSets do VS 2005 deixou de ser t&amp;#227;o flexivel, n&amp;#227;o tendo os mesmos recursos de edi&amp;#231;&amp;#227;o de Schema que o editor do VS 2003.&lt;br&gt;&lt;br&gt;O segredo est&amp;#225; no fato de que os editores na verdade foram separados. O editor de dataSets possui apenas os recursos para editar dataSets, por&amp;#233;m nada nos impede de abrir o mesmo XSD do dataset no editor de schemas XSD.&lt;br&gt;&lt;br&gt;Para isso basta clicar com o bot&amp;#227;o direito no dataSet (pelo solution explorer), utilizar a instru&amp;#231;&amp;#227;o Open With e escolher o XML Schema Editor. Desta forma poderemos fazer tudo o que faziamos pelo dataSet Editor do 2003, chegando ao mesmo resultado.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=879</link><title>ADO.NET : Resolvendo concorrência de dados</title><description>&lt;br&gt;O .NET tipicamente faz a manipula&amp;#231;&amp;#227;o de dados de forma desconectada. Ou seja, um conjunto de dados &amp;#233; levado para a m&amp;#225;quina do usu&amp;#225;rio, manipulado e depois gravado na base de dados.&lt;br&gt;&lt;br&gt;A manipula&amp;#231;&amp;#227;o de dados de forma desconectada, por&amp;#233;m, causa um volume maior de problemas de concorr&amp;#234;ncia de dados. Ou seja : Dois usu&amp;#225;rios tentam alterar a informa&amp;#231;&amp;#227;o ao mesmo tempo. Na verdade os problemas de concorr&amp;#234;ncia deixam de se referir a  &amp;quot;ao mesmo tempo&amp;quot; : No momento em que um usu&amp;#225;rio vai gravar, algu&amp;#233;m alterou os dados antes, entre o tempo em que ele leu e o tempo em que ele est&amp;#225; gravando.&lt;br&gt;&lt;br&gt;O Framework .NET consegue perfeitamente identificar um problema quando este conflito acontece e avisa ao usu&amp;#225;rio que ocorreu um erro de concorr&amp;#234;ncia de dados. Neste caso a aplica&amp;#231;&amp;#227;o precisa estar pronta para fazer o devido tratamento deste erro.&lt;br&gt;&lt;br&gt;Neste caso o usu&amp;#225;rio tem em m&amp;#227;os uma informa&amp;#231;&amp;#227;o que n&amp;#227;o &amp;#233; mais a informa&amp;#231;&amp;#227;o atual no servidor de dados. A aplica&amp;#231;&amp;#227;o ent&amp;#227;o dever&amp;#225; obter para o usu&amp;#225;rio a informa&amp;#231;&amp;#227;o mais atual contida no banco de dados.&lt;br&gt;&lt;br&gt;O que ocorre em seguida pode depender muito da l&amp;#243;gica da aplica&amp;#231;&amp;#227;o. Por&amp;#233;m a aplica&amp;#231;&amp;#227;o pode permitir que o usu&amp;#225;rio compare a informa&amp;#231;&amp;#227;o que ele alterou com a informa&amp;#231;&amp;#227;o que est&amp;#225; no banco de dados e, afinal, decida qual ele deseja manter.&lt;br&gt;&lt;br&gt;Veja como ficariam alguns trechos da aplica&amp;#231;&amp;#227;o :&lt;br&gt;&lt;br&gt;        Dim cmd As New SqlClient.SqlCommand&lt;br&gt;&lt;br&gt;        cmd.CommandText = &amp;quot;Select * from tabela where id=@id&amp;quot;&lt;br&gt;        cmd.Parameters.AddWithValue(&amp;quot;@id&amp;quot;, id)&lt;br&gt;&lt;br&gt;At&amp;#233; este ponto a aplica&amp;#231;&amp;#227;o se preparou para ir ao servidor e trazer as informa&amp;#231;&amp;#245;es atuais sobre um determinado registro&lt;br&gt;&lt;br&gt;        Dim dt As New DataTable&lt;br&gt;        dt.Load(cmd.ExecuteReader)&lt;br&gt;&lt;br&gt;Essas informa&amp;#231;&amp;#245;es s&amp;#227;o ent&amp;#227;o carregadas em uma nova dataTable&lt;br&gt;&lt;br&gt;        minhatabela.Merge(dt, True)&lt;br&gt;&lt;br&gt;&amp;#201; realizada a mesclagem da nova dataTable com a dataTable existente com o usu&amp;#225;rio. Neste ponto est&amp;#225; o segredo : True significa manter as altera&amp;#231;&amp;#245;es do usu&amp;#225;rio. Ent&amp;#227;o os dados vindos do servidor ser&amp;#227;o guardados na dataTable como originalValue, o que significa que na pr&amp;#243;xima grava&amp;#231;&amp;#227;o o usu&amp;#225;rio vai sobrepor a vers&amp;#227;o do servidor. &lt;br&gt;&lt;br&gt;False, por outro lado, sobrep&amp;#245;e a vers&amp;#227;o do usu&amp;#225;rio com a vers&amp;#227;o do servidor.&lt;br&gt;&lt;br&gt;Neste exemplo estamos vendo o caso individual de um registro, mas o dataAdapter tamb&amp;#233;m possui op&amp;#231;&amp;#245;es para realizar esta tarefa para uma quantidade maior de registros.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=877</link><title>ADO.NET : Camadas com TableAdapter - Interceptando Fill e Update</title><description>&lt;br&gt;Neste artigo : http://www.microsoft.com/brasil/msdn/tecnologias/adonet/camadaDados.mspx#ERF expliquei bastante sobre uma t&amp;#233;cnica bem interessante de acesso a dados. Por&amp;#233;m deixei escapar uma informa&amp;#231;&amp;#227;o : E se, para implementar uma regra de neg&amp;#243;cio, voc&amp;#234; precisar alterar os m&amp;#233;todos Fill e Update seguindo o mesmo molde de partial classes que explico no artigo acima ?&lt;br&gt;&lt;br&gt;Existe um pequeno truque meio implicito para isso : Quando selecionamos o m&amp;#233;todo criado no tableAdapter (dentro da edi&amp;#231;&amp;#227;o do dataset) e abrimos a janela de propriedades, encontramos uma propriedade modifier para o m&amp;#233;todo Fill e para o m&amp;#233;todo getData, mas n&amp;#227;o uma op&amp;#231;&amp;#227;o modifier para o m&amp;#233;todo update, o que poderia nos levar a uma primeira conclus&amp;#227;o de que o update acabaria sempre como publico.&lt;br&gt;&lt;br&gt;Mas se o update acabar sempre como p&amp;#250;blico, ter&amp;#237;amos problemas ao implementar nossas regras de neg&amp;#243;cio. Ent&amp;#227;o como resolver ?&lt;br&gt;&lt;br&gt;Simples, um truque que passa despercebido : Se o modifier dos m&amp;#233;todos fill e getdata for colocado como private, o m&amp;#233;todo update tamb&amp;#233;m ser&amp;#225; colocado como private. Isso nos permite criar nossos pr&amp;#243;prios m&amp;#233;todos para fazer o fill e o update, deixando em aberto a possibilidade de implementa&amp;#231;&amp;#227;o de regras de neg&amp;#243;cio futuras.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=844</link><title>ADO.NET : Retornando o Identity em um Insert do TableAdapter</title><description>&lt;br&gt;As atualiza&amp;#231;&amp;#245;es feitas pelo tableAdapter na base de dados j&amp;#225; prev&amp;#234;em o retorno de valores identity para uma dataTable que esteja sendo atualizada.&lt;br&gt;&lt;br&gt;Mas notem : Para uma dataTable que esteja sendo atualizada.&lt;br&gt;&lt;br&gt;Na Web o uso de DataTables est&amp;#225; cada vez mais raro e eventualmente precisaremos que um m&amp;#233;todo insert selecionado em um objectDataSource retorne o identity de um elemento inserido.&lt;br&gt;&lt;br&gt;Ent&amp;#227;o vamos ver como resolver isso. Estamos falando de utilizar tableAdapters e objectDataSource, voc&amp;#234; pode ver mais detalhes em http://www.bufaloinfo.com.br/artigos/artigo26062006.asp&lt;br&gt;&lt;br&gt;O insert padr&amp;#227;o do tableAdapter n&amp;#227;o funciona para isso, pois devolve o n&amp;#250;mero de registros afetados e n&amp;#227;o o identity. Ent&amp;#227;o depois de criado o TableAdapter precisaremos fazer um Add Query para adicionar um novo insert.&lt;br&gt;&lt;br&gt;O Wizard nos pergunta se vamos usar SQL, vamos, nos pergunta o tipo de query, insert, e finalmente nos mostra o insert padr&amp;#227;o. Voc&amp;#234; observar&amp;#225; que por padr&amp;#227;o ele faz um select nos dados inseridos logo ap&amp;#243;s o insert.&lt;br&gt;&lt;br&gt;O problema &amp;#233; que se seguirmos adiante com o wizard para um insert, ele vai continuar nos devolvendo apenas as rowsAffected. Ent&amp;#227;o para resolver isso fazemos um copy na instru&amp;#231;&amp;#227;o insert, fazemos um back e selecionamos a op&amp;#231;&amp;#227;o &amp;quot;select wich return a sigle value&amp;quot;.&lt;br&gt;&lt;br&gt;Colamos ent&amp;#227;o a instru&amp;#231;&amp;#227;o insert (e o select que a acompanha) na janela do SQL, com pequenas mudan&amp;#231;as : &lt;br&gt;&lt;br&gt;INSERT INTO [dbo].[testeValores] ([valor]) VALUES (@valor);&lt;br&gt;SELECT SCOPE_IDENTITY()&lt;br&gt;&lt;br&gt;Damos nome ao nosso m&amp;#233;todo, &amp;quot;Inserir&amp;quot; e n&amp;#227;o nos preocuparemos com o fato de ele acusar um erro na gera&amp;#231;&amp;#227;o do m&amp;#233;todo.&lt;br&gt;&lt;br&gt;Por&amp;#233;m ao tentarmos configura-lo em uma p&amp;#225;gina web teremos problemas, pois o objectDataSource n&amp;#227;o ir&amp;#225; compreender este m&amp;#233;todo como um insert. Para resolver isso podemos adicionar a seguinte classe em nosso projeto de neg&amp;#243;cios :&lt;br&gt;&lt;br&gt;Namespace dsDadosTableAdapters&lt;br&gt;&lt;br&gt;    Public Class testeValoresTableAdapter&lt;br&gt;&lt;br&gt;        &amp;lt;System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, True)&amp;gt; _&lt;br&gt;        Public Function Inserir2(ByVal valor As Integer) As Integer&lt;br&gt;            Return (Inserir(valor))&lt;br&gt;        End Function&lt;br&gt;&lt;br&gt;    End Class&lt;br&gt;End Namespace&lt;br&gt;&lt;br&gt;Assim sendo o inserir2 utiliza nosso inserir e cont&amp;#233;m uma marca como sendo m&amp;#233;todo de insert, nosso inserir pode ficar privado, explica&amp;#231;&amp;#245;es a mais sobre isso est&amp;#227;o no artigo citado acima.&lt;br&gt;&lt;br&gt;Por fim, para recuperar o Identity retornado utilizamos o evento Inserted do objectDataSource, algo como :&lt;br&gt;&lt;br&gt;label1.text=e.AffectedRows &lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=804</link><title>ADO.NET : Truques com TableAdapter e ObjectDataSource</title><description>&lt;br&gt;O TableAdapter do ADO.NET foi feito para encaixar-se quase perfeitamente ao ObjectDataSource. Quase.&lt;br&gt;&lt;br&gt;Por default o TableAdapter utiliza a op&amp;#231;&amp;#227;o &amp;quot;Optimistic Concurrency&amp;quot;. Isso &amp;#233; comum em ambiente windows, mas n&amp;#227;o &amp;#233; comum no ambiente web. Mas &amp;#233; simples resolver : Na tela de defini&amp;#231;&amp;#227;o da query clica-se em Advanced e desmarca-se a op&amp;#231;&amp;#227;o &amp;quot;Optimistic Concurrency&amp;quot;.&lt;br&gt;&lt;br&gt;Pronto. O ObjectDataSource reconhece o TableAdapter e os m&amp;#233;todos de leitura e grava&amp;#231;&amp;#227;o do TableAdapter, o que &amp;#233; &amp;#243;timo.&lt;br&gt;&lt;br&gt;Por&amp;#233;m o m&amp;#233;todo de atualiza&amp;#231;&amp;#227;o do TableAdapter (Update) &amp;#233; criado recebendo duas vezes a chave da tabela como par&amp;#226;metro. Teoricamente isso &amp;#233; feito para uma poss&amp;#237;vel atualiza&amp;#231;&amp;#227;o do valor da chave prim&amp;#225;ria (valor antigo/valor novo), mas na pr&amp;#225;tica isso raramente &amp;#233; utilizado.&lt;br&gt;&lt;br&gt;O resultado disso &amp;#233; que a GridView e outros objetos n&amp;#227;o se encaixam com perfei&amp;#231;&amp;#227;o neste trabalho, pois n&amp;#227;o transmitem a chave duas vezes.&lt;br&gt;&lt;br&gt;Para resolver esse problema, devemos criar uma query de atualiza&amp;#231;&amp;#227;o separada no TableAdapter. Basta clicarmos com o bot&amp;#227;o direito no TableAdapter e selecionarmos Add Query. Selecionamos o tipo da query como Update e o TableAdapter nos traz a instru&amp;#231;&amp;#227;o de update montada, devemos ent&amp;#227;o ter apenas um cuidado : Trocamos o nome do par&amp;#226;metro de @original_&amp;lt;campo&amp;gt; (@original_productid, por exemplo) simplesmente pelo nome do campo (@productId, por exemplo).&lt;br&gt;&lt;br&gt;Como ultimo ajuste, altera-se a propriedade OldValuesParameterFormatString do ObjectDataSource. Normalmente esta propriedade cont&amp;#233;m Original_{0}, vamos altera-la para apenas {0} e desta forma os nomes de par&amp;#226;metros v&amp;#227;o bater com os nomes esperados pelo tableAdapter.&lt;br&gt;&lt;br&gt;Com estes ajustes simples, fazemos o acesso em camadas (o TableAdapter como objeto de acesso a dados) sem necessidade de codificar.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=800</link><title>ADO.NET : Personalizando os seus tableAdapters</title><description>&lt;br&gt;Os tableAdapters do .NET 2.0 s&amp;#227;o uma excelente ferramenta para acesso a dados no .NET 2, permitindo a cria&amp;#231;&amp;#227;o de camadas de dados - e em alguns casos camadas de neg&amp;#243;cio tamb&amp;#233;m - visualmente.&lt;br&gt;&lt;br&gt;Essa ferramenta fica ainda melhor com esse truque : Utilizando o recurso das Partial Classes, podemos personalizar o tableAdapter, inserindo nossos pr&amp;#243;prios m&amp;#233;todos e fun&amp;#231;&amp;#245;es neste componente.&lt;br&gt;&lt;br&gt;Basta declarar uma classe com o mesmo nome que o TableAdapter e a palavra chave Partial . A classe deve ser declarada como estando no mesmo nameSpace que o TableAdapter.&lt;br&gt;&lt;br&gt;Veja um exemplo :&lt;br&gt;&lt;br&gt;Namespace NorthwindDataSetTableAdapters&lt;br&gt;    Partial Public Class CustomersTableAdapter&lt;br&gt;&lt;br&gt;        Public Sub hello()&lt;br&gt;&lt;br&gt;        End Sub&lt;br&gt;    End Class&lt;br&gt;End Namespace&lt;br&gt;&lt;br&gt;&lt;br&gt;Neste exemplo a sub Hello ir&amp;#225; aparecer junto aos demais m&amp;#233;todos do TableAdapter, ir&amp;#225; fazer parte da classe.&lt;br&gt;&lt;br&gt;Repare tamb&amp;#233;m no seguinte : &amp;#233; poss&amp;#237;vel alterar os modifiers dos m&amp;#233;todos do tableAdapter, tornando-os private. Ent&amp;#227;o nos casos mais complexos pode-se ocultar os m&amp;#233;todos de acesso direto e criar os nossos pr&amp;#243;prios m&amp;#233;todos, sendo que internamente nossos m&amp;#233;todos podem implementar regras de neg&amp;#243;cio e chamar os m&amp;#233;todos private de acesso aos dados.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=793</link><title>ADO.NET : Marcando classes como origens de dados</title><description>&lt;br&gt;Quando utilizamos o ObjectDataSource, precisamos escolher a classe e o m&amp;#233;todo que utilizaremos como origem de dados. O ObjectDataSource j&amp;#225; lista algumas classes e m&amp;#233;todos, mas n&amp;#227;o todos, devido a op&amp;#231;&amp;#227;o &amp;quot;Show only data components&amp;quot;.&lt;br&gt;&lt;br&gt;Mas como ele identifica os data components ?&lt;br&gt;&lt;br&gt;&amp;#201; para este tipo de tarefa que temos os atributos de c&amp;#243;digo. O ObjectDataSource utiliza um atributo de c&amp;#243;digo especifico para identificar os componentes que s&amp;#227;o origens de dados.&lt;br&gt;&lt;br&gt;Ent&amp;#227;o, se marcarmos a nossa classe com este mesmo atributo, nosso componente tamb&amp;#233;m aparecer&amp;#225; no wizard quando a op&amp;#231;&amp;#227;o &amp;quot;Show only data components&amp;quot; estiver marcada. Isso &amp;#233; bem &amp;#250;til, pois do contr&amp;#225;rio ter&amp;#237;amos que navegar em uma quantidade muito grande de classes.&lt;br&gt;&lt;br&gt;O atributo em quest&amp;#227;o chama-se DataObject e fica localizado no namespace System.ComponentModel. Veja :&lt;br&gt;&lt;br&gt;Imports System.ComponentModel&lt;br&gt;&amp;lt;DataObject()&amp;gt; Public Class Funcionario&lt;br&gt;&lt;br&gt;Tamb&amp;#233;m &amp;#233; poss&amp;#237;vel marcarmos os m&amp;#233;todos, indicando a finalidade de cada um :&lt;br&gt;&lt;br&gt;&amp;lt;DataObjectMethod(DataObjectMethodType.Select)&amp;gt; Public function Calcular() as DataTable &lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=789</link><title>ADO.NET : Filtrando Nulls em uma dataTable</title><description>&lt;br&gt;Uma novidade das dataTables/views no .NET 2.0 &amp;#233; a possibilidade de utilizarmos a fun&amp;#231;&amp;#227;o ISNULL para filtrar registros que contenham valores nulos em seus campos.&lt;br&gt;&lt;br&gt;A fun&amp;#231;&amp;#227;o ISNULL funciona de forma semelhante ao ISNULL do SQL Server : voc&amp;#234; informa um campo e um valor. Se o campo estiver preenchido, o valor do campo &amp;#233; retornado, se estiver null, o outro valor &amp;#233; retornado.&lt;br&gt;&lt;br&gt;Veja um pequeno exemplo : &lt;br&gt;&lt;br&gt;DataView Dv = new DataView(MyDataTable);&lt;br&gt;Dv.RowFilter = &amp;quot;ISNULL(Amount,-9999)=-9999&amp;quot;;&lt;br&gt;&lt;br&gt;Utilizamos o rowFilter da dataview, exatamente como na vers&amp;#227;o 1.1. Neste exemplo estamos testando o campo Amount. A dataview neste exemplo vai ficar exatamente com os registros nos quais Amount for nulo.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=775</link><title>ADO.NET : Obtendo a chave como resposta em um INSERT do TableAdapter</title><description>&lt;br&gt;Os TableAdapters permitem a cria&amp;#231;&amp;#227;o de querys personalizadas com extrema facilidade e implementam para n&amp;#243;s um m&amp;#233;todo para executar estas querys e nos dar o resultado.&lt;br&gt;&lt;br&gt;Neste caso, quando digo query me refiro tamb&amp;#233;m a instru&amp;#231;&amp;#245;es de Update/Insert/Delete  .&lt;br&gt;&lt;br&gt;No caso de criarmos uma query de Insert, frequentemente desejaremos a devolu&amp;#231;&amp;#227;o de uma chave. Como fazer para que a query de insert devolva a chave auto-numera&amp;#231;&amp;#227;o do banco ?&lt;br&gt;&lt;br&gt;Simples: Na tela em que o tableAdapter nos pergunta o tipo de query, ao inv&amp;#233;s de selecionarmos o tipo INSERT, vamos selecionar o tipo &amp;quot;SELECT com devolu&amp;#231;&amp;#227;o de um &amp;#250;nico valor&amp;quot; (&amp;#233; claro que isso aparece em ingl&amp;#234;s).&lt;br&gt;&lt;br&gt;Na query, colocamos o seguinte :&lt;br&gt;&lt;br&gt;INSERT INTO TABELA (...) VALUES (...) ;&lt;br&gt;SELECT @@IDENTITY&lt;br&gt;&lt;br&gt;Com isso estamos, logo ap&amp;#243;s o select, recuperando o valor da chave. O m&amp;#233;todo gerado pelo TableAdapter ir&amp;#225; nos devolver este valor.&lt;br&gt;&lt;br&gt;</description></item></channel></rss>