none
Criar uma string de conexão que tenha auto reconhecimento entre PCs cada um com SQL Server... RRS feed

  • Pergunta

  • Boas a todos!
    -Preciso da ajudar de vcs pois não tenho ideia de como fazer isso acontecer, desenvolvi uma aplicação desktop em casa usando VS 2012 C# com Entity e SQL Server 2012.

    -Gostaria deixar meus 4 colegas testarem minha aplicação para eles avaliarem, meu problema e q cada colega possui seu SQL Server com autenticação local e acho q tem um q usa usuario e senha.

    Precisaria saber como eu faria que minha aplicação reconheça o tipo de conexão do app.config e conecte no SQL Server deles automaticamente ou como eu faço para criar um form que se possa digitar essas informações da "conexão local", "usuario e senha" e se for o caso escolher o arquivo do Banco e que essas informações fiquem a salvo em algum arquivo na aplicação para ser recuperado automaticamente.

    Como disse não tenho ideia de como fazer isso, procurei exemplos, mas só encontro de como montar string de conexão mono e para um pc, é quando parece alguma coisa fica muito vago de como fazer ou montar.

    Desde já agradeço!.


    quinta-feira, 21 de agosto de 2014 18:31

Todas as Respostas

  • A string de conexão é única por motivo de segurança, por isso você não encontrou nada. 

    O que você pode fazer é alocar seu BD na nuvem, e fazer sua string de conexão de acordo com isso, passar user e password para seus amigos acessarem. 

    Abraço.

    quinta-feira, 21 de agosto de 2014 20:32
  • Obrigado pela colaboração Fernando.

    Então BD nas nuvens não e viavel é outra eles já tem o SQL Express instalado, pois a aplicação e desktop e tem mais de 10 tabelas criadas.

    Gostaria de salvar em um arquivo o tipo de conexão seja "Autenticação Windows" ou "Usuario e Senha", e criar um form, que ao executar a aplicação em um outro pc verifique neste arquivo as informações para se conectar ao SQL se a "Autenticação Windows" ou "Usuario e Senha" caso não seja tenha os campos para cadastrar a nova "Autentificação windows" ou "User e Senha" e salvar?

    Isso seria possivel, caso seja como faria para colocar as variaveis no app.config e como seria o codigo no form?

    Fico no aguardo!

     

    quinta-feira, 21 de agosto de 2014 21:15
  • Você pode sim fazer login e senha, é até melhor. 

    Já que se trata de uma aplicação desktop, por que você não gera um executável para seus amigos? 

    Eles instalam na máquina deles e saem testando. 

    Cada um com seu login e senha.

    sexta-feira, 22 de agosto de 2014 20:30
  • Então amigo e isso mesmo e criar esse "SERVER NAME" ou "LOGIN E PASSWORD" q eu irei passar no executavel para eles, mas eu não sei e não tenho ideia de como começar o codigo para fazer com que seja pedido na janela(form) a "autenticação do windows" ou "autenticação por SQL" se do SQL dos meus amigos.

    E nisso que venho pedir ajuda pois tenho procurado e não tenho encontrado nenhuma ideia de como fazer, o maximo que vi foi que no app.config pode ser usado "variaveis" nos lugares q ficam a "autenticação do windows" ou a "SQL Server autentica", mas não tenho ideia de como fazer com que seja declarado essa variavel no XML pois não manjo muito xml e o app.config e xml e teria que interagir com o c# e fazer um codigo que possa realizar essa ligação app.config, form c# e SQL.

    Assim quando meus amigos executar minha aplicação aparecera essa janela perguntando qual o tipo de conexão SQL que ele usa se é por meio da "autenticação do windows" ou "SQL Server autentica" feito a escolha e só ele digitar as informações de "user name" ou "Login e password" e confirmar que esses dados serão salvos e não serão mais pedidos naquele pc com aquele SQL Server.

    Peço que vc ou alguém me ajude a montar esse codigo e o q me falta, eu fiz o form com o RadionButton para que possa ser feito a escolha entre "Windows Authentication" ou "SQL Server Authentication" e os campos "Server name" ou "Login e password"!

    Quando o programa fosse executado faria um teste de conexão(autentificação) e caso falha se abriria essa janela aki para q fosse feito a autentificação com o SQL , ao conectar os dados tem que ser salvo em algum arquivo para serem recuperados automaticamente pelo programa.

    Acho que tenho que usar o "ServerConnection" no C#.

    Encontrei esse codigo aqui:

    http://msdn.microsoft.com/pt-br/library/ms162132.aspx

    Que pode ser usado para fazer conexão, só preciso usa lo junto com o app.config, para que o app.config possa recuperar os dados da autenticação, craio que ao salvar num arquivo de texto e recuperar no app.config.

    Essa recuperação no app.config que não to conseguindo, já o codigo acima estarei adaptando para usar no form acima.

    sábado, 23 de agosto de 2014 18:22
  • Olá,

     bom pelo que vejo primeiro você deve tentar entender quais são os parametros que necessitam uma string de conexão. Vamos lá, 1 o Data Source que seria o nome de seu server ou de seus amigos no caso, depois o nome do banco de dados que é chamado de Initial Catalog, depois sim que vem a autenticação se é usado Sql server ou autenticação windows !!!

       Veja esse Thread que foi respondido a dúvida é a mesma só muda a linguagem tente tirar uma idéia para iniciar a criação desse form !! E os códigos !

    segunda-feira, 25 de agosto de 2014 10:33
  • Olá,

     bom pelo que vejo primeiro você deve tentar entender quais são os parametros que necessitam uma string de conexão. Vamos lá, 1 o Data Source que seria o nome de seu server ou de seus amigos no caso, depois o nome do banco de dados que é chamado de Initial Catalog, depois sim que vem a autenticação se é usado Sql server ou autenticação windows !!!

       Veja esse Thread que foi respondido a dúvida é a mesma só muda a linguagem tente tirar uma idéia para iniciar a criação desse form !! E os códigos !

    Salve meu camarada Daniel Brito.

    Apesar de estar em VB.Net consigo adaptar só uma coisa que talvez facilitaria, como minha aplicação será debugada e depois zipada e enviada para os caras, pelo q entendi toda vez que a aplicação for executada terá que ser digitado no form os dados da autenticação para o SQL.

    Para isso não ocorrer não daria para salvar em arquivo texto esses dados para ser recuperado?

    Creio que para fazer isso teria que compartilhar uma variavel publica entre os dados do app.config e o form, mais ou menos assim.

    Script de conexão do app.config q uso:

    <add name="SistemaControlePedidoEntities" connectionString="metadata=res://*/SistemaControlePedido.csdl|res://*/SistemaControlePedido.ssdl|res://*/SistemaControlePedido.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=Ailton-PC;initial catalog=SistemaControlePedido;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
          providerName="System.Data.EntityClient" />

    Nestes nomes teria que ter uma variavel publica que fosse carregado as informações no load do form de arquivos textos que foram salvos, na primeira execução

    Script de conexão do app.config com variavel, como fazer???

    <add name="SistemaControlePedidoEntities" connectionString="metadata=res://*/SistemaControlePedido.csdl|res://*/SistemaControlePedido.ssdl|res://*/SistemaControlePedido.msl;

    provider=System.Data.SqlClient;provider connection string=&quot;data source=VARIVAL1;initial catalog=VARIAVEL2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
          providerName="System.Data.EntityClient" />

    acho que essa string teria que ser toda modificada, caso seja autenticação pelo SQL usuario e senha ou nada haver?

    Mas creio que seria algo dessa forma o q acha?

    Até mais.

    segunda-feira, 25 de agosto de 2014 20:57
  • Olá beleza ?

     Isso mesmo, você pode salvar no app config ou em um arquivo xml ou arquivo texto isso fica a seu criterio, quando você for abrir o software toda vez você verifica se existe essa string de conexão e se a mesma conecta caso não conecte o usuario ou vai preencher ou irá verificar o motivo de não conectar porque pode ser falha na rede falha no usuario do windows, varios fatores e não somente erro na conncetion string, mas dessa forma que está pensando está correto sim, mas eu faria conforme o exemplo postado no outro thread ao meu ver fica mais simples a string de conexão ! Qualquer dúvida poste ai !!

    terça-feira, 26 de agosto de 2014 10:35
  • To fazendo a adaptação q vc colaborou no outro threate, só com dificuldades em saber em q parte os dados são salvos apos a alteração dentro do script q vc fez lá?

    Vou terminar o codigo e posta aki depois ok.

    quinta-feira, 28 de agosto de 2014 02:30
  • Olá beleza ?

     Isso mesmo, você pode salvar no app config ou em um arquivo xml ou arquivo texto isso fica a seu criterio, quando você for abrir o software toda vez você verifica se existe essa string de conexão e se a mesma conecta caso não conecte o usuario ou vai preencher ou irá verificar o motivo de não conectar porque pode ser falha na rede falha no usuario do windows, varios fatores e não somente erro na conncetion string, mas dessa forma que está pensando está correto sim, mas eu faria conforme o exemplo postado no outro thread ao meu ver fica mais simples a string de conexão ! Qualquer dúvida poste ai !!

    Olá Daniel tudo blz!

    Espero que esteja por aqui ainda ;D nós dando essa força e compartilhando esse dom da inteligencia.

    Andei sumido, mas voltei retornando ao meu projeto novamente.

    Eu vi seu thread só que tá em vb to encontrando dificuldades para adaptar em c#.

    Todo meu codigos que fiz ficou assim:

    Este e o form de conexão, se puder examinar e apontar meus erros fico grato utilizo metodos.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    using System.IO;
    using Microsoft.VisualBasic;
    using System.Data.SqlClient;
    using Microsoft.SqlServer.Server;
    using Microsoft.SqlServer.Management.Sdk;
    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Common;
    using Microsoft.SqlServer.Management.Trace;
    using Microsoft.SqlServer.Management.Sdk.Sfc;

    namespace ControlePedidoCostura
    {
        public partial class ConectarAoSQLServer : Form
        {
            public ConectarAoSQLServer()
            {
                InitializeComponent();
            }
            private static Server srvSql;

            #region - INICIO DOS METODOS
            private void meCarregaServer()
            {
                try
                {
                    // Create a DataTable where we enumerate the available servers
                    DataTable dtServers = SmoApplication.EnumAvailableSqlServers(true);
                    // If there are any servers at all
                    if (dtServers.Rows.Count > 0)
                    {
                        // Loop through each server in the DataTable
                        foreach (DataRow drServer in dtServers.Rows)
                        {
                            // Add the name to the combobox
                            txtCBServerName.Items.Add(drServer["Name"]);
                            txtCBServerName.SelectedIndex = 0;
                           // this.Close();
                        }
                    }
                }
                catch(Exception err)
                {
                    var varErroServerName = MessageBox.Show("Não foi possivel carregar o 'Nome do Servidor' do SQL Server\n\n"+
                        err.Message+ "\n\n Informar este erro ao administrador",
                        "Sistema avisa",
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            private void meSalvarDadosEmArquivosTexto()
            {
                try
                {
                    if (!Directory.Exists("C:\\PontoECorte\\Dados"))
                    {
                        Directory.CreateDirectory("C:\\PontoECorte\\Dados");
                    }
                    StreamWriter varSW = new StreamWriter("C:\\PontoECorte\\Dados\\DadosServidor.sde");

                        varSW.WriteLine(txtUserNameLogin.Text);
                        varSW.WriteLine(txtPassword.Text);
                        varSW.Close();

                        MessageBox.Show("Dados salvos com sucesso!", "Sistema avisa",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception err)
                {
                    var varMSGErrSalvaDados = MessageBox.Show("Não foi possivel Salvar os dados em arquivo.\n\n"+
                        err.Message+
                        "\n\n Informar o administrador!","Sistema avisa",
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    switch(varMSGErrSalvaDados)
                    {
                        case System.Windows.Forms.DialogResult.OK:
                            break;
                    }
                }
            }
            private void meWindowsAuthentication()
            {
                if(txtRBWinAuthen.Checked == true)
                {
                    try
                    {
                        // If a server was selected at all from the combobox
                        if (txtCBServerName.SelectedItem != null && txtCBServerName.SelectedItem.ToString() != "")
                        {
                            // Create a new connection to the selected server name
                            ServerConnection srvConn = new ServerConnection(txtCBServerName.SelectedItem.ToString(), txtUserNameLogin.Text, txtPassword.Text);
                            // Log in using SQL authentication instead of Windows authentication
                            if (txtPassword.Text == string.Empty)
                            {
                                srvConn.LoginSecure = true;
                            }
                            else
                            {
                                srvConn.LoginSecure = false;
                            }

                            //CRIAR BANCO DE DADOS NO SQL SERVER
                            string varStrBD;
                            varStrBD = "CREATE DATABASE SistemaControlePedido2";// +("NAME = SistemaControlePedido2_Data");
                            SqlCommand varComm = new SqlCommand(varStrBD);
                            //var varBDSQL = varComm.EndExecuteReader = "SistemaControlePedido2";
                            /**/
                            if (varStrBD != "SistemaControlePedido2")
                            {
                            varComm.ExecuteNonQuery();
                                
                                MessageBox.Show("Banco de dados criado com sucesso", "Sistema avisa");
                            }

                            // Create a new SQL Server object using the connection we created
                            srvSql = new Server(srvConn);                        

                            // Loop through the databases list
                            foreach (Database dbServer in srvSql.Databases)
                            {
                                // Add database to combobox
                                txtComboBDServer.Items.Add(dbServer.Name);
                                txtComboBDServer.SelectedItem = "SistemaControlePedido2";
                                
                            }
                                MessageBox.Show("Conexão ao banco de dados foram realizados com sucesso!", "Sistema aviso",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);

                        }
                        else
                        {
                            // A server was not selected, show an error message
                            MessageBox.Show("Escolha primeiro o servidor", "Sistema aviso",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }

                    catch (Exception err)
                    {
                        MessageBox.Show("Falha ao conectar ao servidor\n\n" + err.Message, "Sistema avisa",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    //SALVAR DADOS EM ARQUIVOS
                }
            }
            private void meSQLServerAuthentication()
            {
                if(txtRBSQLServerAuthen.Checked == true)
                {
                    try
                    {
                        // If a server was selected at all from the combobox
                        if (txtCBServerName.SelectedItem != null && txtCBServerName.SelectedItem.ToString() != "")
                        {
                            // Create a new connection to the selected server name
                            ServerConnection srvConn = new ServerConnection(txtCBServerName.SelectedItem.ToString(), txtUserNameLogin.Text, txtPassword.Text);

                            // Give the login username
                            srvConn.Login = txtUserNameLogin.Text;

                            // Give the login password
                            srvConn.Password = txtPassword.Text;

                            // Create a new SQL Server object using the connection we created
                            srvSql = new Server(srvConn);

                            // Loop through the databases list
                            foreach (Database dbServer in srvSql.Databases)
                            {
                                // Add database to combobox
                                txtComboBDServer.Items.Add(dbServer.Name);
                                txtComboBDServer.SelectedItem = "SistemaControlePedido2";
                            }
                            MessageBox.Show("Conexão ao banco de dados foram realizados com sucesso!", "Sistema aviso",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);

                            //CRIAR BANCO DE DADOS NO SQL SERVER
                            string varStrBD;
                            varStrBD = "CREATE DATABASE SistemaControlePedido2 ON PRIMARY";
                            SqlCommand varComm = new SqlCommand(varStrBD);

                           // if ( != "SistemaControlePedido2")
                           // {
                                varComm.ExecuteNonQuery();
                                MessageBox.Show("Banco de dados criado com sucesso", "Sistema avisa");
                           // }
                        }
                        else
                        {
                            // A server was not selected, show an error message
                            MessageBox.Show("Escolha primeiro o servidor", "Sistema aviso",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }

                    catch (Exception err)
                    {
                        MessageBox.Show("Falha ao conectar ao servidor\n\n" + err.Message, "Sistema avisa",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
            }
            private void meSalvandoDadosEConectar()
            {
                    /*PublicSub ConnectarBancosServidor4(ByVal nomeServidorBancodados AsString,ByVal nomeBancoDadosAsString,
                     * ByVal usuarioServidorAsString,ByVal senhaUsuarioAsString)
               'VEJA AQUI COMO ALTERAR SEU APPCONFIG USANDO
               'ESSA FUNCAO
               Dim XmlDocAsNewXmlDocument()
               XmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
               ForEach xElemAsXmlElementIn XmlDoc.DocumentElement
                   If xElem.Name ="connectionStrings"Then
                       ForEach xNodAsXmlNodeIn xElem.ChildNodes
                           xNod.Attributes(1).Value = ConnectarBancosServidor2(nomeServidorBancodados, nomeBancoDados, usuarioServidor, senhaUsuario)
                       Next
                   EndIf
               Next
               XmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
           EndSub*/

                if (txtRBWinAuthen.Checked == true)
                {

                }

                if (txtRBSQLServerAuthen.Checked == true)
                {
                }
            }
            #endregion - FIM DOS METODOS

            private void ConectarAoSQLServer_Load(object sender, EventArgs e)
            {
                meCarregaServer();
            }
            private void txtRBWinAuthen_CheckedChanged(object sender, EventArgs e)
            {
                if(txtRBWinAuthen.Checked == true)
                {
                    txtPassword.Enabled = false;
                }
            }

            private void txtRBSQLServerAuthen_CheckedChanged(object sender, EventArgs e)
            {
                if(txtRBSQLServerAuthen.Checked == true)
                {
                    txtPassword.Enabled = true;
                }
            }

            private void btFechar_Click(object sender, EventArgs e)
            {
                var varMSGFechar = MessageBox.Show("Deseja fechar está janela?", "Sistema avisa",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                switch(varMSGFechar)
                {
                    case System.Windows.Forms.DialogResult.Yes:
                        Close();
                        break;
                }
            }

            private void btConectaSQLServer_Click(object sender, EventArgs e)
            {
                meWindowsAuthentication();
                meSQLServerAuthentication();
                //meSalvarDadosEmArquivosTexto();
            }
        }
    }

    quarta-feira, 1 de outubro de 2014 16:56
  • Acho que esta parada nao esta bem explicada! sera que vai funcionar como queres?

    Deixa eu perguntar uma coisa:

    1- voce quer que os teus amigos acessem a tua base de dados apartir da casa deles?

    2- depois de acessar a base de dados eles vai colocar dados, alterar ect?

    Se a resposta for sim, entao a questao de string de conecao nao e problema. Voce vai ter de lidar com firewall tambem. 


    A flower cannot blossom without sunshine, and man cannot live without love.

    quarta-feira, 1 de outubro de 2014 20:52
    Moderador