使用 C# 代码 ASP.NET Core 运行 SQL 脚本
Posted
技术标签:
【中文标题】使用 C# 代码 ASP.NET Core 运行 SQL 脚本【英文标题】:Running SQL script using C# code ASP.NET Core 【发布时间】:2020-09-20 15:43:12 【问题描述】: 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();
所以我有两个问题
-
当我使用 C# 运行此 SQL 文件时,出现错误
'CREATE SCHEMA' 必须是查询批处理中的第一条语句。
如何解决这个问题?
-
如果创建数据库不存在,如何修改代码?
【问题讨论】:
观察:如果您的 ASP.NET 域帐户有权创建数据库:它可能以太多的数据库权限运行 - 所以通常我会说“不要解决这个问题” - 单独创建数据库,不是在网站中 哪一行会抛出你的错误? 第9行RunScript显示错误 【参考方案1】:-
运行脚本检查数据库是否存在
DECLARE @dbname nvarchar(128)
SET @dbname = N'DatabaseName'
IF (EXISTS (SELECT name
FROM master.dbo.sysdatabases
WHERE ('[' + name + ']' = @dbname
OR name = @dbname)))
【讨论】:
这是脚本代码..?这将取代我的 sqlCreateDBQuery...?【参考方案2】:出现此错误是因为某些 SQL DDL 命令必须作为 SQL Batch 的第一条语句执行,该语句在 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) ...
【讨论】:
非常感谢您的回答,但是当我这样做时,它给了我新错误“无法从 'System.Data.SqlClient.SqlConnection' 转换为 Microsoft.SqlServer.Management.Common.IRenewable.Token '' 我不确定是什么原因造成的。 SqlConnection 是一个普通的 ADO.Net SqlConnection 对象,上面有一个有效的连接字符串。它甚至不需要打开,但您应该确保连接字符串将打开连接。如果你发布你的代码,我会看看它。 您好@kgw 感谢您的快速响应我正在为代码添加我的新 git 存储库并让我知道我在哪里做错了这对我来说将是一个很大的帮助顺便说一句我正在使用 asp net core点网核心3.1版 github.com/John786007/SqlDemo Repo 获取代码@kgw Smo 的 nuget 包不是很完整。我使用以下内容来获得正确的参考: Install-Package Microsoft.SqlServer.ConnectionInfo -Version 150.18097.0-xplat Install-Package Microsoft.Data.Tools.Sql.BatchParser -Version 150.18097.0-xplat 那时我得到了同样的错误非常奇怪,因为传入 SqlConnection 对象是每个docs.microsoft.com/en-us/dotnet/api/… 的有效构造函数以上是关于使用 C# 代码 ASP.NET Core 运行 SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core MVC(C#) 文件上传及后台输出响应Aspose.Words处理后文件
如何使用 DataAnnotations & Regex - c# - ASP.NET Core
在 asp.net core 5 MVC 视图中从 C# 代码调用 JavaScript 函数
如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量
如何在 Asp.NET Core WEB API 中使用 .Net (C#) 在 Payload 中创建具有自定义 JSON 声明的 JWT 令牌