Как заставить бот-фреймворк отправлять обратно ячейку базы данных, если я ввожу параметр поиска?

Я хочу, чтобы бот в платформе Microsoft Bot Framework, C #, отправлял обратно значение любимого цвета человека, если вы отправляете имя. Данные хранятся в базе данных на лазурном сервере. Соединение в порядке, проблема в том, что как только я пытаюсь реализовать какой-либо объект чтения, он выдает ошибку с кодом 500.

Пример:

пользователь: счет

бот: любимый цвет Билла - красный! Хотите узнать чей-то любимый цвет?

Следовательно, логика должна принимать пользовательский ввод счета, использовать его в качестве входного параметра в инструкции sql, а затем считывать возвращаемое значение и возвращать его пользователю через бот.

Мой класс MessagesController.cs не отличается от шаблона бота, я попытался поместить всю логику в RootDialog.cs, который ниже:

using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System.Data.SqlClient;

namespace ColourBot.Dialogs
{
[Serializable]
public class RootDialog : IDialog<object>
{

    public Task StartAsync(IDialogContext context)
    {

        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;
        string result10; 



        var cb = new SqlConnectionStringBuilder();
        cb.DataSource = "my_server.database.windows.net";
        cb.UserID = "user_id";
        cb.Password = "pass_word";
        cb.InitialCatalog = "ColourDB";

        using (var connection = new SqlConnection(cb.ConnectionString))
        {
            connection.Open();

            SqlCommand command = new SqlCommand("SELECT Colour FROM People Where Name=ed", connection);

            result10 = Submit_1_Tsql_SelectEmployees(connection);

            await context.PostAsync(

            $"The name you sent was {activity.Text}, their favourite colour is {result10}!");

            context.Wait(MessageReceivedAsync);

            string Build_1_Tsql_SelectEmployees()
            {
                return $@"SELECT
                                 Colour
                          FROM
                                 People
                          Where
                                  Name={activity.Text};";
            }
            string Submit_1_Tsql_SelectEmployees(SqlConnection conn)
            {
                string tsql = Build_1_Tsql_SelectEmployees();
                string nameString = "";

                using (var command = new SqlCommand(tsql, conn))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var nameReturned = reader.GetName(0);
                            nameString = nameReturned.ToString();

                        }
                    }
                }
                return nameString;
            }
        }
    }
}

}


person preb2018    schedule 07.06.2018    source источник
comment
Вероятно, вам лучше использовать Entity Frameworks для уровня доступа к данным. Вы можете найти пример использования EF6 для простых функций CRUD в боте в этом репо   -  person D4RKCIDE    schedule 08.06.2018


Ответы (1)


Я создал приложение-бот для тестирования предоставленного вами кода и отладки приложения-бота с помощью Эмулятор Bot Framework, я обнаружил, что исключение вызвано отсутствием одинарных кавычек вокруг значения Name={activity.Text}.

Вы можете изменить queryString, добавив одинарные кавычки:

string Build_1_Tsql_SelectEmployees()
{
    return $@"SELECT Colour FROM People Where [Name]='{activity.Text}';";
}

Кроме того, чтобы показать любимый цвет пользователя, вы можете использовать следующий код для возврата данных, установленных при вызове reader.GetName(0) для возврата имени столбца.

using (SqlDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        //var nameReturned = reader.GetName(0);
        //nameString = nameReturned.ToString();
        nameString = reader[0].ToString();
    }
}

Результат теста:

введите описание изображения здесь

person Fei Han    schedule 08.06.2018