c# - 等待创建数据库完成

标签 c# sql-server database-connection

我有这样的代码:

using (var sqlConnection = new SqlConnection(connectionString))
{
  sqlConnection.Open();
  using (var sqlCommand = new SqlCommand(scriptText, sqlConnection))
  {
    sqlCommand.ExecuteNonQuery();
  }
}

我第一次调用它来创建一个数据库,然后我形成一个到这个数据库的连接字符串并尝试做一些工作(Open 工作正常并且说连接实际上是打开的第二连接)。但是我得到一个“现有连接被远程主机强行关闭”并且我可以看到 sql 日志“找不到数据库 ID 9。数据库可能尚未激活或可能正在转换中”。所以,实际上 ExecuteNonQuery 在作业完成之前返回。当然,我可以只发送垃圾邮件直到情况发生变化,但是有没有更好的方法来等待 DB 准备好工作?

最佳答案

这个完整的示例适合我。

它创建数据库,创建表,在表中放一行。

不确定您这边出了什么问题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace GranadaCoder.PlaygroundConsole.SqlStuff
{
    public class SqlPlayground
    {

        public static void EntryPointStuff()
        {
            string databaseName = "MyFirstDatabaseABC";
            string connectionString = string.Empty;
            string commandText = string.Empty;
            int returnValue = 0;
            string msg = string.Empty;

            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder["Initial Catalog"] = "master";
            builder["integrated Security"] = true;
            builder["Server"] = @"MyMachine\MyInstance";
            connectionString = builder.ConnectionString;


            commandText = string.Format("IF EXISTS (Select * from sys.databases where name = N'{0}') DROP DATABASE [{0}]", databaseName);
            returnValue = RunACommand(connectionString, commandText);
            msg = string.Format("'{0}', {1}", returnValue, commandText);
            Console.WriteLine(msg);

            commandText = string.Format("IF NOT EXISTS (Select * from sys.databases where name = N'{0}') CREATE DATABASE [{0}]", databaseName);
            returnValue = RunACommand(connectionString, commandText);
            msg = string.Format("'{0}', {1}", returnValue, commandText);
            Console.WriteLine(msg);

            /* Change the Catalog */
            builder["Initial Catalog"] = databaseName;
            connectionString = builder.ConnectionString;


            commandText = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CodeCategory]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)    BEGIN       DROP TABLE [dbo].[CodeCategory]     END ";
            returnValue = RunACommand(connectionString, commandText);
            msg = string.Format("'{0}', {1}", returnValue, commandText);
            Console.WriteLine(msg);

            commandText = "CREATE TABLE [dbo].[CodeCategory] (    CodeCategoryKey           [smallint] not null     , CodeCategoryName      varchar(64) not null  ) ";
            returnValue = RunACommand(connectionString, commandText);
            msg = string.Format("'{0}', {1}", returnValue, commandText);
            Console.WriteLine(msg);


            commandText = "INSERT INTO [dbo].[CodeCategory] (     CodeCategoryKey       , CodeCategoryName    ) Select 1001 , 'MyFirstCodeCategory' ";
            returnValue = RunACommand(connectionString, commandText);
            msg = string.Format("'{0}', {1}", returnValue, commandText);
            Console.WriteLine(msg);

            commandText = "Select Count(*) from [dbo].[CodeCategory]";
            returnValue = RunACommand(connectionString, commandText);
            msg = string.Format("'{0}', {1}", returnValue, commandText);
            Console.WriteLine(msg);

        }




        private static int RunACommand(string connectionString, string scriptText)
        {

            int returnValue = 0;

            using (var sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                using (var sqlCommand = new SqlCommand(scriptText, sqlConnection))
                {
                    returnValue = sqlCommand.ExecuteNonQuery();
                }
                sqlConnection.Close();
            }

            return returnValue;
        }






    }

}

这对我有用(无一异常(exception)):

    static void Main(string[] args)
    {

        try
        {

            SqlPlayground.EntryPointStuff();

            Console.WriteLine("Press Enter after deleting the database in SSMS manually with 'Close Existing Connections' checked.");
            Console.ReadLine();

            SqlPlayground.EntryPointStuff();


        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }


        Console.WriteLine("Pressing Enter To End");
        Console.ReadLine();

    }

关于c# - 等待创建数据库完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19123094/

相关文章:

sql-server - 通过 Linux 从 Zend2 访问 MSSQL

sql - 从 SQL Server 表填充和编辑数据网格

c# - 如何使用按位运算符和枚举生成动态表达式?

c# - 获取子字符串

c# - Environment.GetFolderPath(Environment.SpecialFolders.ApplicationData) 返回 C :

c# - SQL Server 选择和插入问题

php - 无法连接本地mysql

api - WSO2 - MSSQL 导致提交错误

c# - 设置连接设置的最佳方法

c# - 是否有用于解析字符串以创建 C# 函数的工具?