Я занимаюсь разработкой приложения, в котором я создаю базу данных и развертываю несколько таблиц с использованием c # и SMO.
Я могу без проблем создать базу данных и все таблицы внутри базы данных.Я использую сценарий SQL в качестве шаблона и использую шаблон. Я устанавливаю таблицы внутри вновь созданной базы данных.Ниже приведен мой код.
public void CreateClientDatabase(string sDeployserver, string database)
{
SDeployServer = txtNbServer.Text.Trim().ToString();
string sConStr = string.Concat(Utilities.Decrypt(sEncDataSource), SDeployServer, Utilities.Decrypt(sCoreConn));
string sScriptText = "CREATE DATABASE " + database + string.Empty;
try
{
using(sqlConnection = new SqlConnection(sConStr))
{
ServerConnection svrConnection = new ServerConnection(sqlConnection);
Server server = new Server(svrConnection);
server.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect;
try
{
btnReset.Enabled = false;
btnExit.Enabled = false;
sqlConnection.Open();
server.ConnectionContext.ExecuteNonQuery(sScriptText);
}
catch (Exception ex)
{
MessageBox.Show(Resources.standard_error);
//RollbackDeployment(SDeployServer, database);
throw ex;
}
finally
{
sqlConnection.Close();
}
}
}
После создания базы данных я развертываю таблицы, используя приведенный ниже код;Что я делаю, я заменяю имя базы данных в шаблоне и запускаю скрипт, используя ExecuteNonQuery
public void DeployCoreTable(string sConStr, string database, SqlConnection sqlConnection, string SDeployServer)
{
SScriptFile = string.Empty;
SUpdatedScript = string.Empty;
try
{
FileInfo file = new FileInfo(Path.GetFullPath(Application.StartupPath + "/scripts/core_script.sql"));
SScriptFile = file.OpenText().ReadToEnd();
SUpdatedScript = SScriptFile.Replace("db_project", database);
Server sUpdateServer = new Server(new ServerConnection(sqlConnection));
sUpdateServer.ConnectionContext.ExecuteNonQuery(SUpdatedScript);
lstInfo.Items.Add(Properties.Resources.coretable_success);
lstInfo.Refresh();
}
catch (Exception e)
{
lstInfo.Items.Add(Resources.coretable_error);
lstInfo.Items.Add(e);
lstInfo.Refresh();
MessageBox.Show(Resources.standard_error);
if (sqlConnection.State == ConnectionState.Open)
{
sqlConnection.Dispose();
sqlConnection.Close();
}
RollbackDeployment(SDeployServer, database);
}
}
Все работает нормально, и таким же образом я пытаюсь сопоставить существующий логин SQL с недавно созданнымбаза данных.Ниже приведен мой код SQL Script, который я использую в качестве шаблона;
USE [db_project]
GO
/****** Object: User [acuitydbuser] Script Date: 02-04-2019 18:40:34 ******/
CREATE USER [dbuser] FOR LOGIN [dbuser] WITH DEFAULT_SCHEMA=[dbo]
GO
ALTER ROLE [db_owner] ADD MEMBER [dbuser]
GO
Однако, когда я выполняю вышеуказанный файл SQL из приложения форм c # windows, я получаю сообщение об ошибке, что пользователь уже существует с другой базой данных иследовательно не удалось.
Я пробовал много способов, однако я не могу связать существующий логин SQL с недавно созданной базой данных.Кто-нибудь может дать мне знать, как это сделать?Есть ли что-то, что мне нужно изменить в моем коде?
Любая помощь высоко ценится.