1

我有一个 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) 和表格等输出。

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

{{dbTableNames | count }}

{{db}}

我可以看到 db 参数在浏览器中呈现为“mssql”,就像在参数输入中一样,但是没有列出表名,也没有 sql 查询起作用。我没有看到任何错误消息或任何东西,所以我不知道发生了什么?我认为 SharpScript 能够以类似于 .ss 脚本文件如何访问数据库的方式呈现 html 页面?

4

1 回答 1

0

它们是非常不同的上下文。独立的 .ss Sharp 脚本Sharp 应用程序的上下文中执行,该应用程序由可以访问所有 ServiceStack 实现程序集的dotnet 工具执行。所以当脚本看到:

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

它创建一个ScriptContext预配置的#Script 数据库脚本和一个OrmLiteConnectionFactory配置了ServiceStack.OrmLite.SqlServer提供程序和您的连接字符串。

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

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

然后使数据库脚本可供您使用SharpPagesFeature,例如:

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

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

夏普应用

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

$ x new bare-webapp ProjectName

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

$ cd ProjectName
$ x run

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

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

请注意,从 v5.7 #Script 开始转换为使用 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
```
于 2020-01-29T18:25:48.560 回答