{"id":941,"date":"2010-05-26T02:23:22","date_gmt":"2010-05-25T18:23:22","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=941"},"modified":"2011-03-08T12:16:25","modified_gmt":"2011-03-08T04:16:25","slug":"como-utilizar-parametros-em-dbexpress-dbx-framework","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/","title":{"rendered":"Como utilizar par\u00e2metros em dbExpress (DBX) Framework"},"content":{"rendered":"<p>Em reposta a d\u00favida do Rafael e Carlos Gonzaga sobre como criar consultadas parametrizadas com dbExpress Framework resolvi escrever sobre o tema.<\/p>\n<p>Para come\u00e7ar, existe uma pequena diferen\u00e7a ao utilizar par\u00e2metros em SQL com DBX Framework e VCL. Enquanto a VCL utiliza &#8220;:PARAMETRO&#8221; para definir par\u00e2metros em uma query, em DBX Framework par\u00e2metro \u00e9 representado pelo sinal de &#8220;?&#8221; e n\u00e3o inclui nome.<\/p>\n<p>Como estamos acostumados com a VCL e certamente \u00e9 muito mais leg\u00edvel codificar utilizando o nome dos par\u00e2metros, voc\u00ea espera trabalhar da mesma forma com DBX Framework e isso \u00e9 poss\u00edvel criando uma pequena extens\u00e3o ao DBX Framework.<\/p>\n<p>Para entender melhor, caso voc\u00ea utilize puramente o framework, seu c\u00f3digo seria assim:<\/p>\n<pre class=\"brush: delphi\">program DBX4Example;\r\n\r\n{$APPTYPE CONSOLE}\r\n\r\nuses\r\n  SysUtils,\r\n  DBXDynalink,\r\n  DBXCommon,\r\n  DBXInterbase;\r\n\r\nvar\r\n\r\n  aDBXConn: TDBXConnection;\r\n  aDBXTrans : TDBXTransaction;\r\n  aCmnd: TDBXCommand;\r\n  aReader: TDBXReader;\r\n\r\nbegin\r\n\r\n    aDBXConn := TDBXConnectionFactory.GetConnectionFactory.GetConnection('employee ib','sysdba','masterkey');\r\n\r\n    if aDBXConn &lt;&gt; nil then\r\n    begin\r\n\r\n      aCmnd := aDBXConn.CreateCommand;\r\n\r\n      \/\/ Start transaction\r\n      aDBXTrans:= aDBXConn.BeginTransaction(TDBXIsolations.ReadCommitted);\r\n\r\n      \/\/ Prepare and execute the SQL Statement\r\n      aCmnd.Text := 'SELECT * FROM Country  Where Country = ?';\r\n      aCmnd.Prepare;\r\n      aCmnd.Parameters.Parameter[0].Value.SetAnsiString('USA');\r\n      aReader := aCmnd.ExecuteQuery;\r\n\r\n      while aReader.Next do\r\n      begin\r\n        Writeln( aReader.Value['Country'].GetAnsiString );\r\n      end;\r\n\r\n      \/\/ Commit transaction\r\n      aDBXConn.CommitFreeAndNil(aDBXTrans);\r\n\r\n      Readln;\r\n      aReader.Free;\r\n      aCmnd.Free;\r\n      aDbxConn.Free;\r\n    end;\r\nend.<\/pre>\n<p>Veja que a query utiliza interroga\u00e7\u00e3o para definir o par\u00e2metro e ap\u00f3s o Prepare a longa linha para definir o valor do par\u00e2metro com posi\u00e7\u00e3o zero.<\/p>\n<p>Esta primeira parte responderia a pergunta do Rafael e do Carlos, mas podemos tornar esse c\u00f3digo mais amig\u00e1vel utilizando Class Helpers, recurso este que foi implementado no Delphi 2006 e nos ajuda a extender classes sem utilizar heran\u00e7a.<\/p>\n<p>Assim sendo vou estender a classe TDBXParameterList, o qual ir\u00e1 permitir que eu nomeie os par\u00e2metros e define seus respectivos valores por nome.<\/p>\n<p>O c\u00f3digo abaixo estende a classe utilizando a sintaxe <strong>class helper<\/strong>, veja bem isso n\u00e3o \u00e9 heran\u00e7a. Esta extens\u00e3o define os seguintes m\u00e9todos:<br \/>\nSetParamatersName: este m\u00e9todo ir\u00e1 receber uma lista de nomes, o qual ser\u00e1 usado para nomear os par\u00e2metros, voc\u00ea deve passar a quantidade de nomes igual a quantidade de par\u00e2metros;<br \/>\nByName: m\u00e9todo que nos permite acessar os par\u00e2metros atrav\u00e9s do nome, o DBX Framework traz o m\u00e9todo GetOrdinal que permite acessar os par\u00e2metros por nome, o ByName ir\u00e1 simplificar este acesso;<\/p>\n<pre class=\"brush: delphi\">unit DBXParameterListHelper;\r\n\r\ninterface\r\n\r\nuses\r\n  DBXCommon, SysUtils;\r\n\r\ntype\r\n  TDBXParameterListHelper = class helper for TDBXParameterList\r\n\r\n  public\r\n    procedure SetParamatersName(aNames: Array of String);\r\n    function ByName( Name : String ) : TDBXWritableValue;\r\n  end;\r\n\r\nimplementation\r\n\r\n{ TDBXParameterListHelper }\r\n\r\nfunction TDBXParameterListHelper.ByName(Name: String): TDBXWritableValue;\r\nbegin\r\n  Result := Self.Parameter[Self.GetOrdinal(Name)].Value;\r\nend;\r\n\r\nprocedure TDBXParameterListHelper.SetParamatersName(aNames: array of String);\r\nvar\r\n  i: Integer;\r\nbegin\r\n\r\n  if Length(aNames) &lt;&gt; Self.Count then\r\n     raise Exception.Create('aNames should have the same number of parameters');\r\n\r\n  for i := 0 to Self.Count - 1 do\r\n  begin\r\n    Self[i].Name := aNames[i];\r\n  end;\r\nend;\r\n\r\nend.<\/pre>\n<p>Com est\u00e1 extens\u00e3o esta parte do c\u00f3digo:<\/p>\n<pre class=\"brush: delphi\">      \/\/ Prepare and execute the SQL Statement\r\n      aCmnd.Text := 'SELECT * FROM Country  Where Country = ?';\r\n      aCmnd.Prepare;\r\n      aCmnd.Parameters.Parameter[0].Value.SetAnsiString('USA');<\/pre>\n<p>Ficaria assim:<\/p>\n<pre class=\"brush: delphi\">      \/\/ Prepare and execute the SQL Statement\r\n      aCmnd.Text := 'SELECT * FROM Country  Where Country = ?';\r\n      aCmnd.Prepare;\r\n      aCmnd.Parameters.SetParamatersName(['COUNTRYNAME']);\r\n      aCmnd.Parameters.ByName('COUNTRYNAME').SetAnsiString('USA');<\/pre>\n<p>Caso a query tenha v\u00e1rios par\u00e2metros, ficaria assim:<\/p>\n<pre class=\"brush: delphi\">      \/\/ Prepare and execute the SQL Statement\r\n      aCmnd.Text := 'SELECT * FROM Country  Where Country = ? and Currency = ?';\r\n      aCmnd.Prepare;\r\n      aCmnd.Parameters.SetParamatersName(['COUNTRYNAME', 'CURRENCY']);\r\n      aCmnd.Parameters.ByName('COUNTRYNAME').SetAnsiString('USA');\r\n      aCmnd.Parameters.ByName('CURRENCY').SetAnsiString('Dolar');<\/pre>\n<p>Ao final vimos como utilizar consultas parametrizadas com DBX Framework e como utilizar class helper para estender classes.<\/p>\n<p>Download do c\u00f3digo fonte <strong><a href=\"http:\/\/cc.embarcadero.com\/download.aspx?id=27740\" target=\"_blank\">aqui<\/a><\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em reposta a d\u00favida do Rafael e Carlos Gonzaga sobre como criar consultadas parametrizadas com dbExpress Framework resolvi escrever sobre o tema. Para come\u00e7ar, existe uma pequena diferen\u00e7a ao utilizar par\u00e2metros em SQL com DBX Framework e VCL. Enquanto a VCL utiliza &#8220;:PARAMETRO&#8221; para definir par\u00e2metros em uma query, em DBX Framework par\u00e2metro \u00e9 representado [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":781,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"","footnotes":""},"categories":[102],"tags":[33,181],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como utilizar par\u00e2metros em dbExpress (DBX) Framework | Andreano Lanusse | Tecnologia e Desenvolvimento de Software<\/title>\n<meta name=\"description\" content=\"Em reposta a d\u00favida do Rafael e Carlos Gonzaga sobre como criar consultadas parametrizadas com dbExpress Framework resolvi escrever sobre o tema. Para\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como utilizar par\u00e2metros em dbExpress (DBX) Framework | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"og:description\" content=\"Em reposta a d\u00favida do Rafael e Carlos Gonzaga sobre como criar consultadas parametrizadas com dbExpress Framework resolvi escrever sobre o tema. Para\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2010-05-25T18:23:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2011-03-08T04:16:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_Delphi.png\" \/>\n\t<meta property=\"og:image:width\" content=\"175\" \/>\n\t<meta property=\"og:image:height\" content=\"175\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"3 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_Delphi.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2010\/03\/Icon_Delphi.png\",\"width\":175,\"height\":175},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/\",\"name\":\"Como utilizar par\\u00e2metros em dbExpress (DBX) Framework | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#primaryimage\"},\"datePublished\":\"2010-05-25T18:23:22+00:00\",\"dateModified\":\"2011-03-08T04:16:25+00:00\",\"description\":\"Em reposta a d\\u00favida do Rafael e Carlos Gonzaga sobre como criar consultadas parametrizadas com dbExpress Framework resolvi escrever sobre o tema. Para\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"Como utilizar par\\u00e2metros em dbExpress (DBX) Framework\",\"datePublished\":\"2010-05-25T18:23:22+00:00\",\"dateModified\":\"2011-03-08T04:16:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#webpage\"},\"commentCount\":18,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#primaryimage\"},\"keywords\":[\"dbExpress\",\"Delphi\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/como-utilizar-parametros-em-dbexpress-dbx-framework\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/941"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=941"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/941\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media\/781"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=941"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}