Файл SharpScript .ss работает для подключения к базе данных, но тот же код не работает, когда подается в локальный веб-браузер? - PullRequest
1 голос
/ 29 января 2020

У меня есть файл сценария SharpScript .ss с небольшим кодом, который опрашивает базу данных и форматирует объекты для отображения. Вывод становится слишком неуправляемым для вывода из командной строки, поэтому я хотел сгенерировать html и посмотреть подобные вещи. Генерация html прекрасно работает с htmlDump в файле .ss, но когда я создаю небольшой веб-проект из одного из их шаблонов, соединение с базой данных перестает работать?

Есть ли разница в том, как указать строку подключения для веб-сайта против файла сценария .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
```

и получить вывод, например, count (21) и таблицу из textDump.

Затем я создал «голое веб-приложение» из шаблона с web new bare-webapp Name и добавил новый файл html с тем же содержимым, но это не работает? Если я сделаю

{{dbTableNames | count }}

{{db}}

, я увижу, что аргумент db отображается в браузере как "ms sql", как при вводе аргумента, но имена таблиц не перечислены, и нет sql запросы работают. Я не вижу сообщений об ошибках или чего-то еще, поэтому я понятия не имею, что происходит? Я думал, что SharpScript сможет отобразить страницу html так же, как файлы сценариев .ss могут обращаться к базе данных?

1 Ответ

0 голосов
/ 29 января 2020

Это очень разные контексты. автономные сценарии .ss Sharp выполняются в контексте приложения Sharp , которое выполняется инструментами do tnet , которые имеют доступ ко всем ServiceStack реализация сборок. Поэтому, когда сценарий видит:

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

, он создает ScriptContext, предварительно настроенный с помощью # сценариев базы данных сценариев и OrmLiteConnectionFactory, настроенный с помощью ServiceStack.OrmLite. SqlServer Поставщик и строка подключения.

В отличие от этого # Страницы сценария , выполняющиеся на веб-странице, имеют доступ только к контексту SharpPagesFeature, настроенному в вашем приложении. Поэтому вам нужно настроить OrmLite в вашем AppHost как обычно, например:

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

Затем сделать Сценарии базы данных доступными для SharpPagesFeature, например:

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

, который даст вашим страницам доступ к сценариям базы данных, которые будут использовать ваши зарегистрированные OrmLiteConnectionFactory.

Sharp Apps

Sharp Apps - способ быстрого разрабатывать веб-приложения, созданные полностью с использованием #Script, что позволяет использовать модель оперативной разработки с мгновенной обратной связью, поскольку ваше приложение не требует повторной компиляции или перезапуска. Приложения Sharp, как и ваши сценарии Sharp, запускаются

$ x new bare-webapp ProjectName

. Затем вы можете запустить приложение Sharp с x run в каталоге приложения, например:

$ cd ProjectName
$ x run

Та же функциональность в Sharp Scripts также доступно для приложений Sharp, но вместо добавления конфигурации вашего приложения в начало вашего сценария вы вместо этого добавили бы ее в app.settings, например:

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

Обратите внимание, с версии 5.7 #Script is переходит на использование JS Синтаксис оператора конвейера , поэтому теперь рекомендуется писать:

```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
```
...