【问题标题】:Installing stored procedure in .NET [closed]在.NET中安装存储过程[关闭]
【发布时间】: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);
    }
}

以下是一些参考资料:

  1. How to execute an .SQL script file using c#
  2. 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


【解决方案1】:

当然你可以在 .Net 中读取你的 SQL 文件。

您遇到的问题是File.ReadAllText 在您将 CR/LF 读入字符串时将其剥离:How to read a file into a string with CR/LF preserved?

解决方案:

  1. File.ReadAllBytes()获取所有字节

  2. Encoding.GetString() 将字节转换为字符串。

示例:

byte[] data = File.ReadAllBytes("myfile.sql");
string text = Encoding.UTF8.GetString(data);

【讨论】:

  • 当然,我知道有一个解决方案可以通过如何读取我的文件来解决我的问题,但我希望只是指定文件路径。我很惊讶这不是 .NET 中的一个选项。
  • 为什么不能像 server.ConnectionContext.ExecuteNonQuery(.sql 文件的路径)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多