【发布时间】:2015-11-11 18:03:48
【问题描述】:
我的目标是尝试安装 .sql 文件中的存储过程。经过一番研究,大家建议我的程序将 .sql 文件读入一个字符串,并从该字符串创建一个命令对象。
using System.Data.SqlClient;
public partial class ExecuteScript
{
static void Main(string[] args)
{
string sqlConnectionString = [connection string];
string script = File.ReadAllText([.sql file path]);
SqlConnection conn = new SqlConnection(sqlConnectionString);
Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);
}
}
以下是一些参考资料:
- How to execute an .SQL script file using c#
- https://social.msdn.microsoft.com/Forums/en-US/43e8bc3a-1132-453b-b950-09427e970f31/run-a-sql-script-file-in-c?forum=adodotnetdataproviders
有趣的是 sqlcmd.exe 接受 .sql 文件,但 .NET 中的 SqlClient 没有。有谁知道为什么或如何?我不想将 .sql 文件作为字符串读取的原因是我所有的存储过程的顶部都有 cmets 并将它们读入字符串会使整个过程变成 sql 注释。我知道我可以通过各种方式解决这个问题,但我希望看看是否有更简单的方法。我最终做了以下,但请赐教!
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = "-E -d [database] -S [server\\instance] -i " + storedProcFullPath;
startInfo.FileName = "sqlcmd.exe";
Process.Start(startInfo);
谢谢!
【问题讨论】:
-
问:sqlcmd.exe 接收 .sql 文件,但 .NET 中的 SqlClient 没有。 A:苹果和橙子——它们是完全不同的两个东西!还值得注意的是,“GO”是“sqlcmd.exe 的东西”——它不在您可能从 .Net(或 Java JDBC,就此而言)调用的 SQL 中理解。
-
问:您是否能够将您的 .sql 文件读入一个字符串,并成功地使用该字符串创建您的存储过程?正如我在下面提到的,问题很可能是“ReadAllText()”。通过使用 不同的 API(如 ReadAllBytes()/GetString( )”,例如)。
-
如果可能的话,我希望只指定文件路径。我很惊讶我不能在 .NET 中。
-
如果我的问题具有误导性,我深表歉意。我希望有人能回答为什么不能像 server.ConnectionContext.ExecuteNonQuery(.sql 文件的路径)?
-
问:为什么微软没有以我认为对我来说非常方便的方式编写 API?答:1)因为:他们没有:)。 2)因为你可以很容易地写一个两行函数来完成完全相同的事情。
标签: sql .net c#-4.0 stored-procedures sqlconnection