w14243 Ответов: 1

Как создать SQL server 2016 localdb с помощью кода C#?


SQL Server 2016 LocalDB установлен, а экземпляр 'FFw1a' создан и запущен:
C:\Program Files\Microsoft SQL Server\130\Tools\Binn>sqllocaldb i Ffw1a
Name:               FFw1a
Version:            13.0.2151.0
Share name:
Owner:              MinKyung\icey.dong
Auto Create:        No
Status:             Running
Start Time:    2017/3/3 16:48:38
Pipe name: np:\\.\pipe\LOCALDB#E10BE0E6\tsql\query


Я хочу создать локальный файл БД с помощью приведенного ниже кода C# :
private void CreateDatabase()
        {
            System.Data.SqlClient.SqlConnection tmpConn;
            string sqlCreateDBQuery;
            tmpConn = new SqlConnection();

            tmpConn.ConnectionString = @"Data Source=(LocalDB)\FFw1a;AttachDbFilename='D:\y\2\TestDB_Data.mdf'; Integrated Security=True;Connect Timeout=30;Encrypt=False";

            sqlCreateDBQuery = "CREATE DATABASE TestDB ON PRIMARY "+
                @"(NAME = TestDB_Data, FILENAME = 'D:\y\2\TestDB_Data.mdf', SIZE = 2MB, FILEGROWTH = 10%) "+
                @"LOG ON (NAME = TestDB_Log, FILENAME = 'D:\y\2\TestDB_Log.ldf', SIZE = 1MB, FILEGROWTH = 10%)";

            SqlCommand myCommand = new SqlCommand(sqlCreateDBQuery, tmpConn);
            try
            {
                tmpConn.Open();
                myCommand.ExecuteNonQuery();

                MessageBox.Show("Database has been created successfully!", "Create Database", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Create Database", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {
                tmpConn.Close();
            }
            return;
        }

Но это вызывает исключение на 'tmpConn. Open ()', и сообщение:
Попытка прикрепить базу данных с автоматическим именем для файла D:\y\2\TestDB_Data.mdf не получилось. База данных с таким же именем существует, или указанный файл не может быть открыт,или он находится на общем ресурсе UNC.

Как я могу изменить строку подключения и sqlCreateDBQuery, чтобы успешно создать файл базы данных?

Что я уже пробовал:

private void CreateDatabase()
        {
            System.Data.SqlClient.SqlConnection tmpConn;
            string sqlCreateDBQuery;
            tmpConn = new SqlConnection();

            tmpConn.ConnectionString = @"Data Source=(LocalDB)\FFw1a;AttachDbFilename='D:\y\2\TestDB_Data.mdf'; Integrated Security=True;Connect Timeout=30;Encrypt=False";

            sqlCreateDBQuery = "CREATE DATABASE TestDB ON PRIMARY "+
                @"(NAME = TestDB_Data, FILENAME = 'D:\y\2\TestDB_Data.mdf', SIZE = 2MB, FILEGROWTH = 10%) "+
                @"LOG ON (NAME = TestDB_Log, FILENAME = 'D:\y\2\TestDB_Log.ldf', SIZE = 1MB, FILEGROWTH = 10%)";

            SqlCommand myCommand = new SqlCommand(sqlCreateDBQuery, tmpConn);
            try
            {
                tmpConn.Open();
                myCommand.ExecuteNonQuery();

                MessageBox.Show("Database has been created successfully!", "Create Database", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Create Database", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {
                tmpConn.Close();
            }
            return;
        }

1 Ответов

Рейтинг:
2

OriginalGriff

Посмотрите на сообщение об ошибке:

An attempt to attach an auto-named database for file D:\y\2\TestDB_Data.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

Это довольно откровенно!
Любой:
1) в SQL server уже есть БД с таким же именем. Проверьте, что SQL БД держит в данный момент, Вы не можете прикрепить БД с тем же именем, так как она не будет знать, какой из них вы имели в виду.
2) проверьте права доступа к файлу и дереву папок, содержащему его: SQL server не работает под вашим идентификатором пользователя, поэтому ему нужны достаточные разрешения для использования SQL.
3) где находится диск" D:"? Если он физически не находится на том же компьютере, SQL не может подключиться к нему.

И еще 2 вещи кстати:
1) Никогда не используйте жесткие кодовые строки подключения. Это означает, что вы должны изменить код между разработкой и производством - что означает, что вы не можете протестировать программное обеспечение выпуска, кроме как против живой производственной базы данных, и это очень, очень плохая идея. Конфигурационные файлы - это правильный путь!
2) Не привыкайте присоединять БД - это специальный режим для разработки, и он доступен только в экспресс - выпусках-производственная БД не сможет его использовать (и это медленнее, чем "обычное" соединение, а также она должна раскручивать новый экземпляр SQL специально для файла).