繁体   English   中英

使用 C# 代码 ASP.NET 内核运行 SQL 脚本

[英]Running SQL script using C# code ASP.NET Core

    public class ClassApp
    {
        static string ServerName = "LAPTOP-xxxxxxRK\\SQLEXPRESS";
        static string DatabaseName = "NewDbInstance";
        private SqlConnection tmpConn;

        public void CreateDb()
        {
            SqlConnection tmpConn;
            string sqlCreateDBQuery;
            tmpConn = new SqlConnection();
            tmpConn.ConnectionString = "SERVER = " + ServerName + "; Trusted_Connection=True;";
            sqlCreateDBQuery = " CREATE DATABASE " + DatabaseName;

            SqlCommand myCommand = new SqlCommand(sqlCreateDBQuery, tmpConn);
            try
            {
                tmpConn.Open();
                Console.WriteLine(sqlCreateDBQuery);
                var result = myCommand.ExecuteNonQuery();
                Console.WriteLine(result);
                Console.WriteLine("Database has been created successfully!");

                if (result == -1)
                {
                    RunScript(DatabaseName);
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

        }

        public void RunScript(string dbName)
        {
            FileInfo file = new FileInfo("C:\\Users\\ADMIN\\script.sql");
            string script = file.OpenText().ReadToEnd();
            script = script.Replace("GO", "");

            SqlConnection tmpConn;
            tmpConn = new SqlConnection();
            tmpConn.ConnectionString = "Server=LAPTOP-xxxxxxRK\\SQLEXPRESS;" + "Database=" + dbName + "; Trusted_Connection=True;";
            tmpConn.Open();
            SqlCommand myCommandnew = new SqlCommand(script, tmpConn);
            var resultnew = myCommandnew.ExecuteNonQuery();   //Error comes here
            Console.WriteLine(resultnew);
            tmpConn.Close();
        }

所以我有两个问题

  1. 当我使用 C# 运行此 SQL 文件时,出现错误

'CREATE SCHEMA' 必须是查询批处理中的第一条语句。

如何解决这个问题呢?

  1. 如果创建数据库不存在,如何修改代码?
  1. 运行脚本检查数据库是否存在
    DECLARE @dbname nvarchar(128)
    SET @dbname = N'DatabaseName'

    IF (EXISTS (SELECT name 
    FROM master.dbo.sysdatabases 
    WHERE ('[' + name + ']' = @dbname 
    OR name = @dbname)))

发生该错误是因为某些 SQL DDL 命令必须作为 SQL 批处理的第一条语句执行,该批处理在 SSMS 中由“GO”语句分隔。

要使用“GO”语句运行脚本,而不是解析它们并创建其他错误,请使用 Microsoft.SqlServer.Smo 库。 它将脚本作为单独的批次处理,而不会遇到从现有脚本中删除“GO”的麻烦问题。

您的代码看起来非常类似于:

using (SqlConnection connection = ...)
        {
            Server server = new Server(new ServerConnection(connection));

            try
            {
                server.ConnectionContext.ExecuteNonQuery(script);
            }
            catch (Exception e) {...}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM