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