Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序运行时动态连接到服务器并创建数据库_C#_Sql Server_Database_Dynamic - Fatal编程技术网

C# 应用程序运行时动态连接到服务器并创建数据库

C# 应用程序运行时动态连接到服务器并创建数据库,c#,sql-server,database,dynamic,C#,Sql Server,Database,Dynamic,我希望我的应用程序连接到服务器,并在运行的任何pc上创建数据库。我有代码,但它只能在我的计算机上运行,而不能在其他计算机上运行。当我在其他计算机上运行它时,它不会连接到该计算机服务器,也不会创建数据库 这是我的代码,我有闪屏表单,当应用程序运行时,我想检查这台电脑上是否存在数据库,如果不存在,我想创建它。我的问题是,我的代码没有捕获服务器名称,只是显示消息“坏服务器名称” 我还有一个助手类,每当我使用sql命令时都会用到它 class Helper { public s

我希望我的应用程序连接到服务器,并在运行的任何pc上创建数据库。我有代码,但它只能在我的计算机上运行,而不能在其他计算机上运行。当我在其他计算机上运行它时,它不会连接到该计算机服务器,也不会创建数据库

这是我的代码,我有闪屏表单,当应用程序运行时,我想检查这台电脑上是否存在数据库,如果不存在,我想创建它。我的问题是,我的代码没有捕获服务器名称,只是显示消息“坏服务器名称”

我还有一个助手类,每当我使用sql命令时都会用到它

 class Helper
    {
        public static SqlConnection ConnectionToDatabase()
        {
            string con = string.Format(@"Data Source=DESKTOP-RFJ38NM;Initial Catalog=MyDb;Integrated Security=True", Properties.Settings.Default.Server);
            return new SqlConnection(con);
        }
        public static SqlConnection ConnectionToServer()
        {
            string con = string.Format(@"Data Source=DESKTOP-RFJ38NM;Integrated Security=True", Properties.Settings.Default.Server);
            return new SqlConnection(con);
        }

    }

下面的逻辑创建一个新数据库,即两个表。在前面,我不是在一个splash表单中这样做的,而是在一个普通表单中,其中有一个部分我觉得应该是异步的,它用于使用SmoApplication获取默认的SQL Server实例名称,您可以在其中添加对它的引用,在我的例子中,dll在这里找到,在您的计算机上可能会有很多不同

C:\Program Files\Microsoft SQL Server\130\SDK\Assembly\Microsoft.SqlServer.Smo.dll

表单中有一个按钮和按钮的单击事件。单击后,代码将转移到一个单独的类中,在该类中我将您的代码混合在一起

using System;
using System.Windows.Forms;

namespace StackOverFlow
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private async void button1_Click(object sender, EventArgs e)
        {
            var ops = await Operations.Create();

            if (ops.FoundServerInstanceName)
            {
                if (ops.CheckDatabase())
                {
                    MessageBox.Show("Ready to work with tables!!!");
                }
                else
                {
                    if (ops.HasException)
                    {
                        MessageBox.Show($"Encountered the following issue(s)\n{ops.ExceptionMessage}");
                    }
                    else
                    {
                        MessageBox.Show("Failed");
                    }
                }
            }
        }
    }
}
在Operations类的顶部(下面)有几个属性

  • 用来记住抛出的异常的方法
  • 一个用于指示数据库是否存在
  • 找到了指示SQL Server默认实例名称的属性
  • 用于创建新数据库的连接字符串
  • 用于使用新数据库的连接字符串
Initialize方法获取SQL Server的实例名称。然后检查数据库是否存在,如果不存在,则创建数据库和表

为了实现这一点,我使用VS2015,在这里我利用了消息中的字符串插值,并设置了属性

希望这对当前任务有所帮助

using Microsoft.SqlServer.Management.Smo;
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Threading.Tasks;

namespace StackOverFlow
{

    public class Operations
    {
        string mExceptionMessage;
        public string ExceptionMessage { get { return mExceptionMessage; } }
        public bool HasException { get; set; }

        bool _databaseExists = false;

        bool mFoundServerInstanceName;
        public bool FoundServerInstanceName { get { return mFoundServerInstanceName; } }

        static string databaseServer;
        static string masterDefaultCatalog = "Master";
        string _masterConnectionString = $"Data Source={databaseServer};Initial Catalog={masterDefaultCatalog};Integrated Security=True";
        string MasterConnectionString
        {
            get
            {
                return _masterConnectionString;
            }
            set
            {
                _masterConnectionString = value;
            }
        }

        static string DefaultCatalog = "MyDb";
        string _ConnectionString = $"Data Source={databaseServer};Initial Catalog={DefaultCatalog};Integrated Security=True";
        string ConnectionString
        {
            get
            {
                return _ConnectionString;
            }
            set
            {
                _ConnectionString = value;
            }
        }
        public static async Task<Operations> Create()
        {
            var ops = new Operations();
            await ops.Initialize();
            return ops;
        }
        async Task<bool> Initialize()
        {
            return await GetDefaultInstanceAsync();
        }
        public async Task<bool> GetDefaultInstanceAsync()
        {
            var serverInstanceTable = new DataTable();
            try
            {
                await Task.Run(() => { serverInstanceTable = SmoApplication.EnumAvailableSqlServers(true); });
                if (serverInstanceTable != null)
                {
                    databaseServer = serverInstanceTable.Rows[0].Field<string>("name");
                    mFoundServerInstanceName = true;
                }
                else
                {
                    mFoundServerInstanceName = false;
                }

                return true;

            }
            catch (Exception ex)
            {
                mExceptionMessage = ex.Message;
                HasException = true;
                return false;
            }

        }
        /// <summary>
        /// Determine if the database exists
        /// </summary>
        /// <returns></returns>
        public bool CheckDatabase()
        {

            try
            {
                using (SqlConnection conn = new SqlConnection() { ConnectionString = MasterConnectionString })
                {
                    using (SqlCommand cmd = new SqlCommand($"IF EXISTS (SELECT name FROM sys.databases WHERE name = '{DefaultCatalog}') SELECT 1 ELSE SELECT 0", conn))
                    {
                        conn.Open();
                        int value = (int)cmd.ExecuteScalar();
                        conn.Close();

                        if (value != 1)
                        {
                            CreateDatabase();
                            _databaseExists = true;
                        }
                        else
                        {
                            _databaseExists = true;
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                mExceptionMessage = ex.Message;
                _databaseExists = false;
                HasException = true;
            }

            return _databaseExists;

        }
        /// <summary>
        /// create the database and two tables
        /// </summary>
        /// <returns></returns>
        bool CreateDatabase()
        {
            string tableCreateScript = $@"
            USE [{DefaultCatalog}]
            CREATE TABLE [dbo].[Article](
                [ItemName] [nvarchar](50) NOT NULL,
                [Barcode] [nvarchar](50) NOT NULL,
                [Price] [money] NOT NULL,
             CONSTRAINT [PK_Article] PRIMARY KEY CLUSTERED 
            (
                [Barcode] ASC
            )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
            ) ON [PRIMARY];
            CREATE TABLE [dbo].[Worker](
                [FirstName] [nvarchar](50) NOT NULL,
                [Password] [nvarchar](50) NOT NULL,
                [LastName] [nvarchar](50) NOT NULL,
            PRIMARY KEY CLUSTERED 
            (
                [Password] ASC
            )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
            ) ON [PRIMARY];";

            using (SqlConnection conn = new SqlConnection() { ConnectionString = MasterConnectionString })
            {
                try
                {
                    using (SqlCommand comm = new SqlCommand($"CREATE DATABASE [{DefaultCatalog}];", conn))
                    {
                        conn.Open();

                        comm.ExecuteNonQuery();

                        comm.CommandText = tableCreateScript;
                        comm.ExecuteNonQuery();

                        return true;

                    }
                }
                catch (Exception ex)
                {
                    mExceptionMessage = ex.Message;
                    HasException = true;
                    return false;
                }

            }

        }
    }
}
使用Microsoft.SqlServer.Management.Smo;
使用制度;
使用系统数据;
使用System.Data.Sql;
使用System.Data.SqlClient;
使用System.Threading.Tasks;
命名空间堆栈溢出
{
公营业务
{
字符串mExceptionMessage;
公共字符串异常消息{get{return mExceptionMessage;}}
公共bool有异常{get;set;}
bool_databaseExists=false;
布尔mFoundServerInstanceName;
public bool FoundServerInstanceName{get{return mFoundServerInstanceName;}}
静态字符串数据库服务器;
静态字符串masterDefaultCatalog=“Master”;
字符串_masterConnectionString=$“数据源={databaseServer};初始目录={masterDefaultCatalog};集成安全性=True”;
字符串主连接字符串
{
得到
{
返回主连接字符串;
}
设置
{
_masterConnectionString=值;
}
}
静态字符串DefaultCatalog=“MyDb”;
字符串_ConnectionString=$“数据源={databaseServer};初始目录={DefaultCatalog};集成安全性=True”;
字符串连接字符串
{
得到
{
返回连接字符串;
}
设置
{
_ConnectionString=值;
}
}
公共静态异步任务Create()
{
var ops=新操作();
等待操作。初始化();
返回操作;
}
异步任务初始化()
{
return wait GetDefaultInstanceAsync();
}
公共异步任务GetDefaultInstanceAsync()
{
var serverInstanceTable=新数据表();
尝试
{
wait Task.Run(()=>{serverInstanceTable=SmoApplication.EnumAvailableSqlServers(true);});
if(serverInstanceTable!=null)
{
databaseServer=serverInstanceTable.Rows[0]。字段(“名称”);
mFoundServerInstanceName=true;
}
其他的
{
mFoundServerInstanceName=false;
}
返回true;
}
捕获(例外情况除外)
{
MEExceptionMessage=例如消息;
HasException=true;
返回false;
}
}
/// 
///确定数据库是否存在
/// 
/// 
公共bool CheckDatabase()
{
尝试
{
使用(SqlConnection conn=new SqlConnection(){ConnectionString=MasterConnectionString})
{
使用(SqlCommand cmd=new SqlCommand($”如果存在(从sys.databases中选择名称,其中名称=“{DefaultCatalog}”)选择1,否则选择0,conn))
{
conn.Open();
int value=(int)cmd.ExecuteScalar();
康涅狄格州关闭();
如果(值!=1)
{
CreateDatabase();
_databaseExists=true;
}
其他的
{
_databaseExists=true;
}
}
}
}
捕获(例外情况除外)
{
MEExceptionMessage=例如消息;
_databaseExists=false;
HasException=true;
}
return_数据库存在;
}
/// 
///创建数据库和两个表
/// 
/// 
bool CreateDatabase()
{
字符串tableCreateScript=$@”
使用[{DefaultCatalog}]
创建表[dbo]。[文章](
[项目名称][nvarchar](
using Microsoft.SqlServer.Management.Smo;
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Threading.Tasks;

namespace StackOverFlow
{

    public class Operations
    {
        string mExceptionMessage;
        public string ExceptionMessage { get { return mExceptionMessage; } }
        public bool HasException { get; set; }

        bool _databaseExists = false;

        bool mFoundServerInstanceName;
        public bool FoundServerInstanceName { get { return mFoundServerInstanceName; } }

        static string databaseServer;
        static string masterDefaultCatalog = "Master";
        string _masterConnectionString = $"Data Source={databaseServer};Initial Catalog={masterDefaultCatalog};Integrated Security=True";
        string MasterConnectionString
        {
            get
            {
                return _masterConnectionString;
            }
            set
            {
                _masterConnectionString = value;
            }
        }

        static string DefaultCatalog = "MyDb";
        string _ConnectionString = $"Data Source={databaseServer};Initial Catalog={DefaultCatalog};Integrated Security=True";
        string ConnectionString
        {
            get
            {
                return _ConnectionString;
            }
            set
            {
                _ConnectionString = value;
            }
        }
        public static async Task<Operations> Create()
        {
            var ops = new Operations();
            await ops.Initialize();
            return ops;
        }
        async Task<bool> Initialize()
        {
            return await GetDefaultInstanceAsync();
        }
        public async Task<bool> GetDefaultInstanceAsync()
        {
            var serverInstanceTable = new DataTable();
            try
            {
                await Task.Run(() => { serverInstanceTable = SmoApplication.EnumAvailableSqlServers(true); });
                if (serverInstanceTable != null)
                {
                    databaseServer = serverInstanceTable.Rows[0].Field<string>("name");
                    mFoundServerInstanceName = true;
                }
                else
                {
                    mFoundServerInstanceName = false;
                }

                return true;

            }
            catch (Exception ex)
            {
                mExceptionMessage = ex.Message;
                HasException = true;
                return false;
            }

        }
        /// <summary>
        /// Determine if the database exists
        /// </summary>
        /// <returns></returns>
        public bool CheckDatabase()
        {

            try
            {
                using (SqlConnection conn = new SqlConnection() { ConnectionString = MasterConnectionString })
                {
                    using (SqlCommand cmd = new SqlCommand($"IF EXISTS (SELECT name FROM sys.databases WHERE name = '{DefaultCatalog}') SELECT 1 ELSE SELECT 0", conn))
                    {
                        conn.Open();
                        int value = (int)cmd.ExecuteScalar();
                        conn.Close();

                        if (value != 1)
                        {
                            CreateDatabase();
                            _databaseExists = true;
                        }
                        else
                        {
                            _databaseExists = true;
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                mExceptionMessage = ex.Message;
                _databaseExists = false;
                HasException = true;
            }

            return _databaseExists;

        }
        /// <summary>
        /// create the database and two tables
        /// </summary>
        /// <returns></returns>
        bool CreateDatabase()
        {
            string tableCreateScript = $@"
            USE [{DefaultCatalog}]
            CREATE TABLE [dbo].[Article](
                [ItemName] [nvarchar](50) NOT NULL,
                [Barcode] [nvarchar](50) NOT NULL,
                [Price] [money] NOT NULL,
             CONSTRAINT [PK_Article] PRIMARY KEY CLUSTERED 
            (
                [Barcode] ASC
            )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
            ) ON [PRIMARY];
            CREATE TABLE [dbo].[Worker](
                [FirstName] [nvarchar](50) NOT NULL,
                [Password] [nvarchar](50) NOT NULL,
                [LastName] [nvarchar](50) NOT NULL,
            PRIMARY KEY CLUSTERED 
            (
                [Password] ASC
            )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
            ) ON [PRIMARY];";

            using (SqlConnection conn = new SqlConnection() { ConnectionString = MasterConnectionString })
            {
                try
                {
                    using (SqlCommand comm = new SqlCommand($"CREATE DATABASE [{DefaultCatalog}];", conn))
                    {
                        conn.Open();

                        comm.ExecuteNonQuery();

                        comm.CommandText = tableCreateScript;
                        comm.ExecuteNonQuery();

                        return true;

                    }
                }
                catch (Exception ex)
                {
                    mExceptionMessage = ex.Message;
                    HasException = true;
                    return false;
                }

            }

        }
    }
}