Как запустить приложение с базой данных SQL на машине, на которой не установлен SQL Server

Я разработал приложение, в котором есть ползунок, показывающий некоторые данные из базы данных SQL. Я использую Visual Studio 2010 и Microsoft SQL Server 2008.

На самом деле я не сталкиваюсь с какими-либо проблемами с моим приложением, когда я развертываю его и запускаю на своем персональном компьютере. Проблема возникает, когда я пробую это на другой машине, и проблема в том, что приложение не может быть подключено к базе данных SQL. Я попытался выяснить причину проблемы, поэтому я попробовал его после его развертывания на двух машинах, на одной из которых установлен SQL-сервер, а на другой нет SQL-сервера. Приложение отлично работало на машине, на которой был установлен SQL Server, и не могло быть подключено к базе данных на другой машине.

Это строка подключения, которую я использовал в своем приложении >>

connectionString="Источник данных=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\KBank.mdf;Интегрированная безопасность=True;Экземпляр пользователя=True"

поэтому, если есть способ, который позволил бы мне запустить приложение, не требуя, чтобы на машине был установлен SQL Server, я был бы признателен. Спасибо


person Hassanation    schedule 17.08.2012    source источник
comment
Вы ищете встроенную базу данных. Взгляните на SqlCE и, возможно, на SQLite.   -  person Simon Whitehead    schedule 17.08.2012
comment
Вам нужна единая база данных, совместно используемая пользователями в локальной сети, или у каждого пользователя вашего приложения своя база данных?   -  person Steve    schedule 17.08.2012
comment
@Steve, это одна и та же база данных, совместно используемая пользователями. и его не изменить.   -  person Hassanation    schedule 17.08.2012
comment
В этом случае ответ Дэниела Хилгарта является правильным. Конечно, перед этим вам потребуется немного административной работы: установите SqlServer на сервер в вашей локальной сети. Дайте правильные разрешения клиентским машинам и пользователям (брандмауэр, права пользователей, протоколы и т. д.), создайте/загрузите базу данных один раз и измените строку подключения для каждой локальной машины. (уберите AttachDbFileName и используйте Initial Catalog) и все готово :-)   -  person Steve    schedule 17.08.2012


Ответы (5)


Вам нужно изменить строку подключения, чтобы указать компьютер, на котором установлена ​​база данных. Что-то вроде следующего:

connectionString="Источник данных=машина\SQLEXPRESS;AttachDbFilename=|DataDirectory|\KBank.mdf;Интегрированная безопасность=True;Экземпляр пользователя=True"

Обратите внимание: база данных на другом компьютере должна быть правильно настроена, чтобы к ней можно было получить доступ с других компьютеров.

person Daniel Hilgarth    schedule 17.08.2012
comment
приложение будет общедоступным, я имею в виду, что локальная сеть не может знать имена клиентских машин, есть ли способ получить имя машины пользователей, чтобы прикрепить его к строке подключения? и что вы предпочитаете, используя SQLite или изменяя строку подключения, как вы предложили? - person Hassanation; 17.08.2012
comment
Это полностью зависит от того, нужна ли каждой установке собственная база данных или все установки должны использовать одну и ту же базу данных. - person Daniel Hilgarth; 17.08.2012
comment
Это одна и та же база данных для всех пользователей приложения. - person Hassanation; 17.08.2012
comment
Затем вам нужен центральный сервер, и имя сервера необходимо настроить для каждой установки клиента. - person Daniel Hilgarth; 17.08.2012

Вам необходимо выполнить одно из следующих действий:

  • Включите установку SQL Server Express на клиентский компьютер как часть процесса установки.
  • Используйте централизованный SQL-сервер на сервере, к которому у вас и ваших клиентов есть доступ

Существуют и другие стратегии доступа к данным, которые вы можете использовать, такие как сериализация данных в формате XML или использование другой базы данных, такой как SQLite. или с помощью веб-служб, но проще говоря, если SQL Server Express не установлен на компьютере вашего клиента, вы не можете заставить его работать.

person David    schedule 17.08.2012
comment
если бы я использовал SQLite, не было бы необходимости устанавливать SQL Server на клиентские машины, не так ли? - person Hassanation; 17.08.2012
comment
Нет. SQLite — это совершенно отдельный продукт, отличный от SQL Server Express или SQL Server. Ваш код нужно будет изменить, и вам нужно будет прочитать документацию по SQLite, но если вам нужна небольшая локальная база данных без настройки, это вариант. Я бы начал здесь decoding.wordpress.com/2009/ 14/01/using-sqlite-with-net, а также Google с использованием sqlite из .net - person David; 17.08.2012

Ваша строка подключения использует localhost, который представлен через . в строке подключения. Это не сработает, если на компьютере не установлен SQL Server, поэтому вам необходимо изменить строку подключения на удаленный компьютер (машина с установленным SQL Server, т. е. ваш персональный компьютер).

person Darren    schedule 17.08.2012
comment
@Hassan - вам нужно изменить строку подключения на IP-адрес машины с установленным SQL Server, например: connectionString=Data Source=0.0.0.1\SQLEXPRESS;AttachDbFilename=|DataDirectory|\KBank.mdf;Integrated Security=True; Экземпляр пользователя = Истина - person Darren; 17.08.2012
comment
где 0.0.0.1 — это IP-адрес машины с включенным SQL Server. - person Darren; 17.08.2012

Если вы не хотите устанавливать SQL Server Express, вы можете выбрать встроенный SQL-сервер через sql server compact (http://en.wikipedia.org/wiki/SQL_Server_Compact) или, в качестве альтернативы, иметь доступ к фактической сетевой базе данных.

person Robert H    schedule 17.08.2012
comment
Я пробовал SQL Server Compact 3.5, и возникла та же проблема. приложение попросило меня установить компактный сервер sql на компьютере пользователя. - person Hassanation; 26.08.2012
comment
моя строка подключения: Data Source=|DataDirectory|\KBank.sdf;Encrypt Database=True;File Mode=shared read;Persist Security Info=False - person Hassanation; 26.08.2012
comment
приложение хорошо работает с моей машиной, но ошибка возникает на машинах пользователей ›› спасибо - person Hassanation; 26.08.2012

Если вы используете центральную базу данных, установленную на серверном компьютере, а другие клиентские компьютеры могут получить доступ к этому серверу.

Если это можно сделать следующим образом:

сначала вы меняете свою программу, чтобы записывать файл DSN на жесткий диск при запуске программы

Используйте следующий код в качестве образца

 private void MakeDSN()
        {
            try
            {
                if (!System.IO.Directory.Exists(@"C:\OTPub"))
                {
                    System.IO.Directory.CreateDirectory(@"C:\OTPub");
                }

                if (File.Exists(@"C:\OTPub\Ot.dsn"))    //delete ErrorLogFile
                {
                    File.SetAttributes(@"C:\OTPub\Ot.dsn", FileAttributes.Temporary);
                    File.Delete(@"C:\OTPub\Ot.dsn");
                }
                string con = "[ODBC]";
                string driver = "DRIVER=SQL Server";
                string uid = "UID=sa";
                string DB = "DATABASE=OTData";
                string server = "SERVER=10.63.210.111";

                var tw = new StreamWriter(@"C:\OTPub\Ot.dsn", true); // make file in location
                using (tw)
                {
                    tw.WriteLine(con);   //write  dataline
                    tw.WriteLine(driver);
                    tw.WriteLine(uid);
                    tw.WriteLine(DB);
                    tw.WriteLine(server);
                }

                lbserver.Text="LOGIN "+server;
            }
            catch (Exception)
            {
                MessageBox.Show("File DSN Error!");
            }
        }

Введите IP-адрес вашего сервера как string server

Теперь вы можете использовать соединение в отдельном классе

using System.Data.Odbc;

  class DataBaseConnection
    {
        private OdbcConnection conn1 = new OdbcConnection(@"FILEDSN=C:/OTPub/Ot.dsn;" + "Uid=sa;" + "Pwd=123;"); 

        //insert,update,delete
        public int SetData(string query)
        {
            try
           {
                conn1.Open();
                OdbcCommand command = new OdbcCommand(query, conn1);
                int rs = command.ExecuteNonQuery();
                conn1.Close();
                return rs;
            }
            catch (Exception ex)
            {
                conn1.Close();
                throw ex;
            }
        }

        //select
        public System.Data.DataTable GetData(string sql)
        {
            try
            {
                conn1.Open();
                OdbcDataAdapter adpt = new OdbcDataAdapter(sql, conn1);
                DataTable dt = new DataTable();
                adpt.Fill(dt);
                conn1.Close();
                return dt;
            }
            catch (Exception ex)
            {
                conn1.Close();
                throw ex;
            }
        }
    }

Теперь вы можете написать следующий код в другом необходимом месте для подключения к базе данных,

 DataBaseConnection db = new DataBaseConnection();

Если вам нужен запрос SELECT:

DataTable dt = db.GetData("SELECT * From TestTable");

Если вам нужно вставить, обновить, удалить запрос

int i=db.SetData("INSERT INTO TestTable(name,address,tel) VALUES (testname,Colombo,0777125896) ");

Этот метод может использовать подключение к базе данных без каких-либо настроек.

Важно: не забывайте удалять файл DSN при выходе из приложения в целях безопасности.

Надеюсь, что это поможет вам!

person Gayan Chinthaka Dharmarathna    schedule 30.03.2017