【问题标题】:Executing a SQL script stored as a resource执行存储为资源的 SQL 脚本
【发布时间】:2023-03-28 18:15:01
【问题描述】:

我想在我的解决方案中存储冗长的 .sql 脚本并以编程方式执行它们。我已经弄清楚如何执行包含我的 sql 脚本的字符串,但我还没有弄清楚如何从将存储在解决方案中的文件中读取字符串(例如在 /Scripts 子文件夹下)。

【问题讨论】:

标签: c# .net sql


【解决方案1】:

将 SQL 文件添加到您的项目中,然后创建一个新的资源文件。打开 SQL 文件并从左上角的下拉菜单中选择“文件”(默认为字符串)。然后点击添加资源并导航到/选择 SQL 文件。这允许您从资源文件中获取 SQL,而不会像这样丢失类型安全:

以上是Visual Studio 2010中的过程。我也在my blog上写过这个。

【讨论】:

  • 知道这是一篇旧帖子。看起来很整洁,但是如何在脚本中添加参数?
  • 您应该可以使用string.Format
  • 添加到资源,并将文件设置为资源,在代码中写入 NAMESPACE.Properties.Resources.ScriptDB.ToString()
  • 参数见我的回答。 QueryFirst 将检测 SQL 中使用的参数,从数据库中检索它们的类型,在特殊的 cmets 部分中将它们声明为局部变量,以便您可以在编辑器窗口中测试运行查询,然后生成参数加载代码。您的参数作为生成的 Execute() 方法的类型输入参数弹出。 (执行、ExecuteScalar、GetOne)。正确的方式成为最简单的方式,错误的方式(串联)变得不可能:-)
【解决方案2】:

首先,编辑 .sql 文件的属性,使其作为资源嵌入。

然后使用类似于以下的代码来检索脚本:

string commandText;
Assembly thisAssembly = Assembly.GetExecutingAssembly();
using (Stream s = thisAssembly.GetManifestResourceStream(
      "{project default namespace}.{path in project}.{filename}.sql"))
{
   using (StreamReader sr = new StreamReader(s))
   {
      commandText = sr.ReadToEnd();
   }
}

【讨论】:

  • @Will - 在 SQL CLR 项目中似乎无法添加强类型资源文件。
  • @Will 资源也是一个糟糕的解决方案,恕我直言。似乎没有办法修改生成的 XML cmets,并且像 Looks up alocalized string 类似于 create table dbo.Foo ( ... 这样的摘要几乎没有用处。
【解决方案3】:

使用QueryFirst。您将您的 sql 放入该工具提供的 .sql 模板中。在幕后,QueryFirst 将其编译为资源并连接调用以在运行时检索它。您只需要担心在生成的包装类上调用 Execute(),您的结果可以通过生成的 POCO 访问。端到端类型安全。永远不必记住列名或数据类型,再加上将 sql 放在上帝想要的地方……在 .sql 文件中的相当大的优势。

免责声明:我写的是 QueryFirst

【讨论】:

  • 路过的读者,欣赏 stackoverflow 对工具的绝对令人难以置信的偏见。问:我该怎么做? A. 以下是一些您可以复制和粘贴的代码行。 (荣誉) A. 这是我编写的一个免费的开源工具,它正是这样做的。 (否决票)
【解决方案4】:

将文件添加到Resources,并将文件设置为Resource,在代码编写中:

String SQLCommand = NAMESPACE.Properties.Resources.ScriptDB.ToString()

【讨论】:

    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多