{"id":20507280,"url":"https://github.com/carlosast/speed-orm","last_synced_at":"2025-09-06T16:35:36.796Z","repository":{"id":144107468,"uuid":"142194065","full_name":"carlosast/Speed-ORM","owner":"carlosast","description":"Faster ORM to .NET","archived":false,"fork":false,"pushed_at":"2023-08-21T23:54:01.000Z","size":68809,"stargazers_count":6,"open_issues_count":3,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-10T13:17:51.543Z","etag":null,"topics":["database","faster","firebird","mariadb","mysql","oracle","orm","orm-framework","speed","sql-server","sqlite"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/carlosast.png","metadata":{"files":{"readme":"README - Copy (2).md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-24T17:52:56.000Z","updated_at":"2024-09-06T13:01:56.000Z","dependencies_parsed_at":"2024-11-14T13:20:31.086Z","dependency_job_id":"92304eb0-cf13-4b1e-acb6-da9e601adddd","html_url":"https://github.com/carlosast/Speed-ORM","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosast%2FSpeed-ORM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosast%2FSpeed-ORM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosast%2FSpeed-ORM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosast%2FSpeed-ORM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/carlosast","download_url":"https://codeload.github.com/carlosast/Speed-ORM/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248788867,"owners_count":21161726,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","faster","firebird","mariadb","mysql","oracle","orm","orm-framework","speed","sql-server","sqlite"],"created_at":"2024-11-15T20:13:10.248Z","updated_at":"2025-04-13T21:52:26.697Z","avatar_url":"https://github.com/carlosast.png","language":"C#","readme":"# **Speed.ORM - Born to be fast**\n\n\n\n​\t**O que é o Speed ORM?**\n\nO Speed é composto \t\n\n1. \n\n**Download do programa Speed (ClickOnce):**\n\n\u003chttps://github.com/carlosast/Speed-ORM/raw/master/publish/setup.exe\u003e\n\n\n\n![](media/4fa6b2eac1bc8b34edbb818ecf0fc18c.png)\n\n\n\n![](media/27e49ce81ce34cd758bf06a8bf04c38a.png)\n\nComo usar\n=========\n\nSe não deseja perder tempo e ter classes para acessar toda sua base de dados em\npoucos minutos clique no link abaixo para ter uma introdução rápida do uso:\n\nhttps://github.com/carlosast/Speed-ORM/blob/master/Resumo.md\n\n\n\n\n\nIntrodução\n==========\n\nSpeed.ORM foi desenvolvido com 3 pré-requisitos:\n\n1.  Ser o mais rápido ORM no mundo .NET;\n\n2.  Produtividade: gerar todo o código Sql, liberando o desenvolvedor para se\n    focar no que interessa;\n\n3.  Em alguns minutos, gera a camada de dados e a de negócios, automatizando 90%\n    deste processo. Caberá ao desenvolvedor escrever alguns métodos na camada de\n    negócios.\n\nNão tem objetivo de ter todos recursos que alguns frameworks têm, tal como o\nEntity Framework ou NHibernate, mas tem o objetivo de ser muito mais rápido e\nusar muito menos memória\n\n1 - História\n============\n\n​\tTrabalho como especialista em performance de aplicações e bancos de dados há\nmais de 15 anos. Através das análises, detectei que um dos problemas era como\nframework de ORM que estava sendo usado ou mesmo como foram desenvolvidas as\ncamadas de dados e de negócios, usando procedures e ADO.NET.\n\nUsando o Entity Framework como ORM, tente fazer um loop para inserir 10000000 de\nregistros: ele usa vários gigabytes de memória, e se o computador não tiver\nmemória pra isso, vai travar. Além disso, apesar do Entity Framework possuir\nvários recursos interessantes, tal como o LINQ TO SQL, não é adequado para um\nsistema que precise ser rápido e escalável. O mesmo vale pra o NHibernate\n\nPor outro lado, há os puristas, que acreditam que todo o sistema, inclusive as\nrotinas de CRUD, devam ser feitos com procedures. Que têm o discurso que é mais\nrápido, e é assim que tem que ser feito. Não sou contra o uso de Stored\nProcedures, mas sim no seu uso apenas quando é necessário. Por exemplo, tem\nsentido trazer um volume enorme do banco de dados para o ORM para aplicar um\naumento de preços de 10% para 100000 produtos. Neste caso deve-se usar\nprocedure. Mas para fazer o CRUD básico isso não é necessário, devido os\nseguintes fatores:\n\n-   **Custo**: contabilize quantas horas são gastas para fazer as rotinas e\n    procedures de CRUD pra uma banco de dados médio, de 300 tabelas por exemplo?\n    Considerando que se gaste 15 minutos para fazer cada procedure de Insert,\n    Select, Update e Delete, mais 15 minutos para a classe de DTO e mais 60\n    minutos para a classe de business.\n\n-   **Manutenção**: é muito comum, num desenvolvimento diário, o caso de se\n    colocar uma coluna nova numa tabela. O desenvolvedor, devido ao prazo curto,\n    acaba colocando na procedure de “Insert”, e não coloca na procedure de\n    “Update”. Entre muitos outros casos que acontecem\n\n-   **Lógica**: Vamos supor que, para salvar um registro na tabela de Customers,\n    usando procedure demore 10ms, enquanto que usando ORM demore 12ms. Isto\n    causa algum impacto na performance do sistema? O purista dirá que sim, mas\n    se perguntar para quem vai pagar pelo software (que geralmente não sabe\n    disso), com certeza responderá que não\n\n-   **Portanto, sou a favor da seguinte filosofia:**\n\n-   **A ORM o que é de ORM e a Procedure o que é de Procedure**\n\nEspero que esta biblioteca possa ser útil à comunidade.\n\n3 - Bancos de dados suportados:\n===============================\n\n-   Sql Server\n\n-   Oracle\n\n-   PostgreSQL\n\n-   MySql\n\n-   Firebird\n\n-   SqlServerCe\n\nCaso haja necessidade suportar outros bancos de dados, não demora mais que\nalgumas horas para fazer esta implementação\n\n4 - Estrutura do Speed\n======================\n\nA biblioteca Speed é composta de 1 DLL principal \"Speed.Data\":\n\n-   **Namespace Speed.Common** – Classes úteis. Por exemplo:\n\n-   CollectionUtil: Classe que alguns métodos adicionais a IEnumerable e\n    Dictionary\n\n-   Conv: a classe mais usada em Speed. Possui métodos de conversões\n\n-   Cryptography: Criptografia\n\n-   DataTimer\\\u003cT\\\u003e: É uma classe de um cache simples, em memória. Um seu\n    constructor se define uma function que carregará os valores, e um Timeout.\n    Assim, pode ler o valor da propriedade Value. Se estourou o Timeout,\n    DataTimer recarrega os valores, senão retorna o valor da memória\n\n-   CloneCompiler: Gera uma proxy compilado em memória para fazer clone de\n    classes (properties e fields). Milhares de vezes mais rápido que reflection\n\n-   ETC\n\n-   **Namespace Speed. Data** – Classes de manipulação de dados e metadados para\n    vários bancos de dados\n\n-   A classe principal do Speed.Data é a Database, que encapsula uma connection\n    para o banco de dados selecionado, e possui também vários métodos úteis de\n    acesso de dados. Ex: ExecutaDataTable, ExecuteScalar, ExecuteInt32, etc.\n\n-   A classe Database possui uma propriedade chamada “Provider”, que possui\n    métodos de extração de metadados específico para cada banco de dados\n\n5 - Programa Speed\n==================\n\nPrograma que permite a configuração e geração de códigos de base de dados.\n\nO programa permite a configuração (banco de dados a usar, diretórios) e a\nseleção das tabelas e views à serem geradas as classes. A parte de geração de\ncódigos pra Stored Procedures será liberada em breve\n\nÉ composto de 2 abas:\n\n5.1 - Aba “Configuration”\n-------------------------\n\n![](media/c46f89c3ebd57e99fe800451d70ce4ca.png)\n\n-   **Database Type**: Selecione o tipo de banco de dados: Firebird, MySql,\n    Oracle, PostgreSql e Sql Server. Speed suporta também SqlServerCE, mas ainda\n    precisa de mais testes\n\n-   **Build Connection String**: se gera a Connection String através dos valores\n    de Server, Database, Integrated Security, User ID e Password\n\n-   **Enter Connection String**: permite que se entre o valor da connection\n    string\n\n-   **Host:** Server. Ex: localhost\n\n-   **Database:** database name\n\n-   **Integrated Security:** se usa segurança integrada. Neste caso não serão\n    entrados valores de User ID e Password\n\n-   **User ID:** nome do usuário do banco de dados\n\n-   **Password:** senha\n\n-   **Port:** porta do banco de dados. Deixe 0, para ser usada a porta padrão\n\nGlobal Parameters:\n\n-   **Entity Namespace**: namespace das classes de dados\n\n-   **Business Namespace**: namespace das classes de negócios\n\n-   **Entity Directory**: diretórios onde serão gravas as classes de dados\n\n-   **Business Directory**: diretórios onde serão gravas as classes de negócios\n\n-   **Suggestion:** botão que permite selecionar o arquivo de solution (.sln),\n    que serão sugeridos valores para os parâmetros acima. Isto não é\n    obrigatório. O desenvolvedor pode colocas os valores que desejar nos\n    parâmetros\n\n5.2 - Aba “Object Browser”\n--------------------------\n\n![](media/44f9ff7c5c3f875d4be1c6237e138966.png)\n\nDo lado esquerdo, permite selecionar os objetos do banco de dados que serão\ngeradas as classes. Somente serão gerados códigos pra os objetos selecionados no\ntreeview\n\nDo lado direito aparecem “Tables” e “Views”. Para cada linha, temos as seguintes\ncolunas:\n\n-   **Schema name**: Nome do schema no banco de dados. Não pode ser alterado\n\n-   **Table name**: Nome da table/view no banco de dados. Não pode ser alterado\n\n-   **Data Class Name**: nome da classe de dados correspondente à table/view\n\n-   **Business Class Name**: nome da classe negócios correspondente à table/view\n\n-   **Enum column name**: às vezes, precisamos gerar um enum dos dados de uma\n    tabela. Column name corresponde à coluna que possui os valores de texto do\n    enum\n\n-   **Enum column Id**: coluna que possui os valores numéricos do enum\n\n-   **Enum name**: nome da classe do enum\n\n-   **Naming**: Groupbox com funções que facilitam a geração de nomes para\n    classes. Não é obrigatório seu uso. É apenas um facilitador. Se desejar, o\n    desenvolvedor pode digitar os nomes das classes e enums.\n\n    -   **Name case**: o tipo de case usado para gerar os nomes de classes e\n        enums:\n\n        -   **Original name**: usado o mesmo valor que vem do banco de dados\n\n        -   **Camel:** notação camel. Quando os valores possuírem ‘_’, este será\n            removido\n\n        -   **Pascal:** notação pascal. Quando os valores possuírem ‘_’, este\n            será removido\n\n        -   **Lowercase**: todas as letras serão convertidas para minúsculas\n\n        -   **Uppercase**: todas as letras serão convertidas para maiúsculas\n\n    -   **Prefix:** um prefixo que serão colocado antes do nome da classes\n\n    -   **Start names with schema**: se coloca o Schema Name antes do nome da\n        classes. Porém este virá depois de “Prefix”\n\n    -   **Remove:** lista de valores que serão removidos dos nomes, separados\n        por ‘;’. Pode conter espaços para ficar com uma formatação melhor, que\n        estes caracteres não serão considerados\n\n| **Importante**: Para cada objeto (table / view) serão gerados 4 arquivos separados. Ex: considere uma table chamada Customer. Considere que a Data class chama-se “Customer” e Business class chama-se “Customers”. Serão gerados os seguintes arquivos: |\n|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n\n\n-   Entity\n\n    -   **Customer.cs** – classe de dados que possui as propriedades com os\n        nomes das colunas da table ou view do banco. Quando houver alguma\n        alteração no objeto, na próxima vez que for gerada, essa classe será\n        sobreposta. Portanto, qualquer alteração manual feita nessa classe será\n        perdida\n\n    -   **Customer_Ext.cs** – classe de extensão de customer. Usa o atributo\n        “partial”. Coloque aqui propriedades adicionais se desejar. Este arquivo\n        será gerado apenas 1 vez, e jamais será sobreposto. Todas as alterações\n        feitas aqui serão preservadas\n\n-   Business\n\n    -   **Customers.cs** – classe de negócios que possui as propriedades com os\n        nomes das colunas da table ou view do banco. Quando houver alguma\n        alteração no objeto, na próxima vez que for gerada, essa classe será\n        sobreposta. Portanto, qualquer alteração manual feita nessa classe será\n        perdida\n\n    -   Customers_Ext**.cs** – classe de extensão de customers. Usa o atributo\n        “partial”. Coloque aqui os métodos se desejar. Este arquivo serão gerado\n        apenas 1 vez, e jamais será sobreposto. Todas as alterações feitas aqui\n        serão preservadas\n\n5.3 - Exemplo de uso\n====================\n\nDescreverei, em detalhes, como usar o **Speed** para um projeto novo. Considere\num projeto chamado **MyProject**. Neste exemplo será um Windows Forms, mas pode\nser um projeto web, console ou qualquer outro projeto. Os diretórios e nomes\nusados aqui são apenas para exemplo. O desenvolvedor pode usar os valores que\ndesejar\n\n-   Crie o diretório “**C:\\\\Projects**”. Eu costumo colocar todos meus projetos\n    dentre de um diretório padrão, chamado “Projects”. E MyProject será mais uma\n    solução dentro deste\n\n-   Considere que o banco de dados, também chamado **MyProjet**, possui as\n    seguintes tabelas\n\n![](media/80051311c43bdd71d875fe35acb00bb7.png)\n\n-   No Visual Studio\n\n    -   selecione “New Project”\n\n![](media/1cfc46c0b7dca849dc9c5c1deb1bdea1.png)\n\n-   A solution será criada em “C:\\\\Projects\\\\MyProject\\\\MyProject.sln”\n\n    -   Em File/ Add / New Project\n\n        -   Selecione um projeto do tipo “Class Library”, e chame-o de\n            “MyProject.Data”.  \n            Este será o projeto de dados\n\n            -   Delete Class1.cs\n\n    -   Em File/ Add / New Project\n\n        -   Selecione um projeto do tipo “Class Library”, e chame-o de\n            “MyProject.BL” Este será o projeto de negócios\n\n            -   Delete Class1.cs\n\n    -   No projeto “MyProject.BL”, some uma referência a “MyProject.Data”\n\n    -   No projeto “MyProject”, some referências a “MyProject.Data” e\n        “MyProject.BL”\n\n-   Execute o aplicativo Speed e clique no botão “New”\n\n    -   Print das telas com as configurações que vou detalhar abaixo:\n\n![](media/6596e4c278acf658cd8bbdf6fc1671e6.png)\n\n![](media/32f0108cdf3f47efb33489b13809c2d0.png)\n\n-   **Aba “Configuration”**\n\n    -   **Server type**: Sql Server\n\n        -   **Build Connection string**: marque\n\n            -   **Host:** localhost. Nesse caso está na máquina local, mas pode\n                ser qualquer servidor remoto, até num provedor\n\n            -   **Database**: MyProject\n\n            -   **“Integrated Security”**: marque. Pode-se usar também User ID e\n                Password se desejar\n\n            -   **Clique no botão “Connect” pra checar se está correta a conexão\n                com o banco de dados**\n\n        -   **Global Parameters:**\n\n            -   **Entity Namespace**: MyProject.Data  \n                **Business Namespace**: MyProject.BL  \n                **Entity Directory**:\n                **“C:\\\\Projects\\\\MyProject\\\\MyProject.Data\\\\Data”**. Repare que\n                uso o subdiretório Data. Assim, todas as classes geradas ficarão\n                dentro deste subdiretório, e não se misturarão com outras\n                classes que você possa adicionar depois no projeto\n\n            -   **Business Directory**:\n                **“C:\\\\Projects\\\\MyProject\\\\MyProject.BL”**. Repare que uso o\n                subdiretório “BL”. Assim, todas as classes geradas ficarão\n                dentro deste subdiretório, e não se misturarão com outras\n                classes que você possa adicionar depois no projeto\n\n    -   **Aba “Object Browser”**\n\n        -   Nesse caso, não vou fazer grandes mudanças nos nomes. Selecione\n            todos os objetos que desejar e clique no notão “Apply”, que serão\n            gerados os nomes de “Data class” e “Business class”.  \n            No de caso de “Data Class”, os nomes gerados foram no plural, tal\n            como estão nas tabelas. Eu prefiro nome de Entity no singular. Assim\n            altero manualmente esses valores. Não aplique novamente “Apply”,\n            senão esses valores serão alterados. No caso de se ter novos\n            objetos, selecione apenas o novos objetos para aplicar “Apply”,\n            assim serão mantidos os valores dos demais, porque “Apply” é\n            aplicado apenas nos objetos selecionados no treeview.\n\n        -   **CustomerTypes é uma tabela que é interessante gerar um enum** de\n            seus valores. Isto permitirá que façamos comparações em código\n            usando o Enum ao invés de valores numéricos. Para isso, criei em\n            CustomerTypes uma coluna chamada **“Enum”** (poderia ter outro\n            nome). Chamei o “Enum Name” de EnumDbCustomerType. Costumo usar\n            EnumDb pra indicar que é um Enum e que é originários da base de\n            dados. Colocando Enum antes também facilita o auto complete.\n\n        -   **Está tudo pronto**. Agora clique no botão **“Generate”**, e sua\n            camada de dados e de negócios estará pronta.  \n            Repare que o Speed apenas gera os arquivos. Caberá ao desenvolvedor\n            adicioná-los nos projetos.\n\n    -   **“Visual Studio”**\n\n        -   **Como adiciono as classes geradas pelo Speed no meu projeto?**  \n            No Visual Studio, para os projetos “MyProject.Data” e\n            “MyProject.BL”, vá no “Solution Explorer” e clique no botão “Show\n            All Files”, que aparecerão pastas e arquivos que não fazem parte da\n            solution, como mostrado na figura abaixo\n\n![](media/306a336bde16ddf1f134773004bdb40c.png)\n\n-   Clique com o botão direito do mouse sobre a pasta “Data” e selecione\n    “Include in Project”. Repita este procedimento para a pasta “BL”.\n    Posteriormente, quando se gerar código para novos objetos, o desenvolvedor\n    terá que fazer o include para os 4 arquivos individuais para cada objeto.\n\n    -   Estou planejando fazer um **Add-in**, para automatizar todo este\n        processo no Visual Studio. É por isto que, na Solution Speed, coloquei\n        as telas do projeto Speed numa DLL separada (Speed.UI), porque vou\n        compartilhá-la com o projeto de Add-in\n\n        -   Passos finais:\n\n            -   Como este projeto usa o Sql Server, adicione o nuget\n                Speed.ORM.SqlServer aos projetos 3 projetos\n\n            -   No projeto “MyProject.Data” some as seguintes referências:\n\n                -   Speed.Common\n\n                -   Speed.Data\n\n                -   System.Runtime.Serialization. Esta DLL é necessária, porque\n                    as “Data classes” usam os atributos “DataMember”, para\n                    serialização em Web Services ou WCF\n\n            -   No projeto “MyProject.BL” some as seguintes referências:\n\n                -   MyProject.Data\n\n            -   No projeto “MyProject” some as seguintes referências:\n\n                -   MyProject.Data\n\n                -   MyProject.BL\n\n    -   **Programando**\n\n        -   **Aqui descreverei como se usar uma simples tela de cadastro usando\n            o os projetos zerados pelo Speed**\n\n-   Os projetos ficaram com a seguinte estrutura:\n\n![](media/bfc09a7ea55b1a28960b37cc986638ad.png)\n\n-   Repare que a table “Customer” possui 4 arquivos. Os arquivos com “_Ext”\n    serão os arquivos que você poderá colocar propriedades ou métodos\n    adicionais. Os arquivos sem “_Ext”, serão sobrepostos, sempre que o objeto\n    for alterado na base dados e se usar a aplicação Speed para gerar novamente\n    o código.\n\n-   Classe **MyProject.Data\\\\Data\\\\Customer\\\\Base\\\\Customer.cs**  \n    Classe base de Customer. Repare no atributo “partial” na class\n\n![](media/8eab890ea27fa571c6fc26c900c11fbf.png)\n\n-   Classe **MyProject.Data\\\\Data\\\\Customer\\\\Customer.cs**  \n    Classe de extensão da classe base. Repare no atributo “partial” na class\n\n![](media/dc3df25a94d3bdbd2e49cd8265b66b83.png)\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    Vamos criar aqui uma propriedade para usar o Enum, assim poderemos\n    fazer comparações usando o Enum em código ao invés de valores\n    numéricos, como mostrado na figura abaixo, da mesma classe  \n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n![](media/9142b4aa8271fb29964f97cfd7653e9d.png)\n\n-   Classe **MyProject.Data\\\\BL\\\\Customer\\\\Base\\\\Customers.cs**  \n    Classe base de negócios. Repare no atributo “partial” na class\n\n-   \\*\\*IMPORTANTE: Repare que todo método possui como primeiro parâmetro  \n    um objeto do tipo “Database”. Isto é para o programador ter o  \n    “controle” da base de dados. Assim cabe a ele abrir uma connection  \n    (usando db.BeginTransaction())” e chamar quantos métodos desejar\\*\\*\n\n![](media/921574300dccc579655d2d2152e735f0.png)\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    **Repare que são gerados métodos para retornar um registro pela PK e\n    das tabelas filhas e pais relacionadas**  \n    **Toda classe de negócios herda de BLClass, que possui vários\n    métodos úteis que são compartilhados por todas as classes**  \n\n-   Classe **MyProject.Data\\\\BL\\\\Customer\\\\Customers_Ext.cs**  \n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nClasse de extensão de negócios. Repare no atributo “partial” na class\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    ![](media/04fe774899d457431bba7c69aec1f33c.png)\n\n    -   Como exemplo, vamos um criar método para fazer um “like” pelo\nnome do cliente  \n\n\n\n        ![](media/8293a9ef96d69b3d01388a357ade6ee0.png)\n\n        \u003e     \n\u003e   repare que não se usa a palavra SQL “WHERE”. Coloque somente\n        \u003e   o que vai aparecer depois do “WHERE” no comando Sql.\n\n    -   Configurando a aplicação “MyProject”  \n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n-   ConnectionString: Coloque no arquivo App.config, ou Web.config:\n\n![](media/a9ff4afae1dd795ead3f5987c0b82609.png)\n\n-   Usando a classe Sys (no namespace Speed.Data) para acessar o banco de dados.  \n    A classe Sys possui propriedades e métodos para trabalhar com o banco de\n    dados. Apenas que não é obrigatório o uso desta classe, mas facilita\n    bastante. Numa aplicação “Windows Forms” podemos inicializa-la no método\n    “Main” e numa aplicação “Web” pode ser no método “Application_Start” do\n    Global.asx:\n\n![](media/3c11195d7e77ad202289f18b1e258043.png)\n\n-   **Abrir uma connection com o banco Usando Sys:**\n\n![](media/758d6534e6ffc0701daa9efa69b54496.png)\n\n-   **Abrir uma connection com o banco sem uso da classe Sys**:\n\n![](media/d30ba2f0f90ace04e7fdb25ae76f6d8d.png)\n\n-   **Fazendo um Select sem usar a BL:**\n\n    -   var customers = db.Select\\\u003cCustomer\\\u003e();\n\n        -   **Executando um comando no banco de dados:**\n\n        -   db.ExecuteNonQuery(\"delete from Customers\");\n\n        -   **Usando o método ExecuteInt32:**\n\n        -   int count = db.ExecuteInt32(\"select count(\\*) from Customers\");\n\n    -   **Usando Transaction:**\n\n![](media/597f42522b6ad5a9e534d9f898f87230.png)\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    \u003e     \n\u003e   **Repare que no final do bloco using existe o Commit. Se, ao\n    \u003e   sair do bloco using, não for aplicado um Commit, será dado um\n    \u003e   Rollback automaticamente**  \n    \u003e   \n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n-   **Retornando o valor de um campo “IDENTITY”:**\n\n    -   O Speed pode ler o valor de um campo **IDENTITY** automaticamente. Por\n        padrão ele não o faz, justamente considerando a performance. Se você não\n        precisa carregar esse valor, para que o Speed fará isso?  \n        Mas se precisar, nos método “Insert”, “ ou “Update”, passe o valor\n        “EnumSaveMode.Requery” para o parâmetro “EnumSaveMode saveMode”\n\n![](media/69e898d9f7c88a3dfcc2029d5eaf9715.png)\n\n-   **Retornando um DataTable**\n\n-   DataTable tb = db.ExecuteDataTable(\"select \\\\\\* from Customers\");\n\n    -   A classe Database possui muitos outros métodos adicionais que são muito\n        úteis no desenvolvimento de um sistema\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarlosast%2Fspeed-orm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarlosast%2Fspeed-orm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarlosast%2Fspeed-orm/lists"}