SharpScript .ss 文件可以连接到数据库,但相同的代码在提供给本地网络浏览器时不起作用?

SharpScript .ss file works to connect to database, but same code doesn't work when served to local web-browser?

我有一个 SharpScript .ss 脚本文件,其中包含一些小代码,可以轮询数据库并格式化要显示的内容。输出对于命令行输出来说太不守规矩了,所以我想生成 html 并查看类似的东西。使用 .ss 文件中的 htmlDump 生成 html 效果很好,但是当我从他们的模板之一创建一个小型 Web 项目时,数据库连接停止工作?

在指定网站连接字符串和 .ss 脚本文件方面有什么不同吗?

我只是在文件开头有常规的 args 规范

<!--
db mssql
db.connection Server=ble\bla;Database=blu;user id=blo;password=#blingblong#
-->

这在 .ss 脚本文件中工作正常,然后我可以做类似

的事情
```code
{{ 
    "select * from View drv
        join [Project] p on drv.ProjectId = p.ProjectId
        where DocumentId = 'GUID' " 
    | dbSelect
    | map => {it.RecordId, it.Text, it.Name}
    | to => sqlMap 
}}

sqlMap | count
sqlMap | textDump
```

并从 textDump 中获得类似计数 (21) 和 table 的输出。

然后我使用 web new bare-webapp Name 从模板创建了一个 "bare-webapp" 并添加了一个具有相同内容的新 html 文件,但这不起作用?如果我这样做

{{dbTableNames | count }}

{{db}}

我可以看到 db 参数在浏览器中呈现为 "mssql" 就像在参数输入中一样,但是没有列出 table 名称,并且没有 sql 查询工作.我没有看到任何错误消息或任何内容,所以我不知道发生了什么?我认为 SharpScript 能够呈现 html 页面,类似于 .ss 脚本文件如何访问数据库?

它们是非常不同的上下文。 stand-alone .ss Sharp Scripts are executed within the context of a Sharp App that's executed by the dotnet tools 可以访问所有 ServiceStack 实现程序集。所以当脚本看到:

<!--
db mssql
db.connection Server=ble\bla;Database=blu;user id=blo;password=#blingblong#
-->

它会创建一个 ScriptContext 预配置 #Script Database Scripts and an OrmLiteConnectionFactory configured with the ServiceStack.OrmLite.SqlServer 提供程序和您的连接字符串。

相比之下,在网页中执行的 #Script Pages 只能访问在您的应用程序中配置的 SharpPagesFeature 上下文。因此,您需要像往常一样在 AppHost 中配置 OrmLite,例如:

container.AddSingleton<IDbConnectionFactory>(() => 
    new OrmLiteConnectionFactory(connectionString, SqlServer2012Dialect.Provider));

然后让 Database Scripts 可供您的 SharpPagesFeature 使用,例如:

Plugins.Add(new SharpPagesFeature {
    ScriptMethods = {
        new DbScriptsAsync()
    }
});

这将使您的页面可以访问数据库脚本,该脚本将使用您注册的 OrmLiteConnectionFactory

Sharp Apps

Sharp Apps 是一种快速开发完全使用 #Script 创建的 Web 应用程序的方法,它支持即时反馈实时开发模型,因为您的应用程序不需要重新编译或重新启动。 Sharp Apps,就像你的 Sharp Scripts 一样 运行

$ x new bare-webapp ProjectName

然后您可以在您的应用程序目录中使用 x run 启动您的 Sharp 应用程序,例如:

$ cd ProjectName
$ x run

Sharp Scripts 中的相同功能也可用于 Sharp Apps,但不是将应用配置添加到脚本顶部,而是将其添加到 app.settings,例如:

db mssql
db.connection Server=ble\bla;Database=blu;user id=blo;password=#blingblong#

请注意从v5.7开始#Script是transitioning to use the JS Pipeline Operator Syntax,所以现在建议写成:

```code
{{ 
    "select * from View drv
        join [Project] p on drv.ProjectId = p.ProjectId
        where DocumentId = 'GUID' " 
    |> dbSelect
    |> map => {it.RecordId, it.Text, it.Name}
    |> to => sqlMap 
}}

sqlMap |> count
sqlMap |> textDump
```