Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
117 / 110 / 31
Регистрация: 05.04.2014
Сообщений: 224
.NET 2.x

Выполнить операции по формуле, которая хранится в базе данных

05.01.2017, 10:56. Показов 1470. Ответов 8

Студворк — интернет-сервис помощи студентам
Можно ли выполнить операции по формуле, которая хранится в базе данных.
Например, динамически будут созданы тектбоксы с именами А1, А2, А3.... Аn, имена которых берутся также из БД.
Надо выполнить формулу A1 + A2 - A3 + ... - An и результат поместить в текстбокс с именем Asumm

таблица:
FldName | FldFormula
A1 |
A2 |
A3 |
Asumm | A1+A2-A3

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        dbt.Open()
        Dim commmand As New OleDbCommand("SELECT * FROM Tabl;", dbt)
        Dim reader As OleDbDataReader = commmand.ExecuteReader()
        Dim Counter As Integer = 0
        For Each recotd As DbDataRecord In reader
                    Dim l As New TextBox With {.name = recotd("FldName"), .tag = recotd("FldFormula"), .Width = 100, .Height = 22, .Left = 100, .Top = Counter * 25}
                    Me.Panel1.Controls.Add(l)
                    AddHandler l.LostFocus, AddressOf txt_LostFocus
        Next
    End Sub
    Private Sub txt_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs)
        Asumm.text = A1+A2-A3 'здесь надо выполнить формулу из Asumm.tag
    End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2017, 10:56
Ответы с готовыми решениями:

Подключение к базе данных, кторая хранится в памяти устройста
Добрый день! Есть база данных sqlite, которая лежит в sdcard. Подключаюсь к базе следующим образом: String dbfile =...

Вывод переменной из массива, значение которой хранится в базе данных
Долго пробую сделать вывод переменной из массива, но не выходит. Я новичок. чуть более месяца как начал разбираться. Извиняюсь заранее,...

Как выполнить SQL запрос к базе данных
Доброго времени суток. Первый раз в жизни разрабатываю приложение на WPF. Содержимое таблички удалось показать на экране через DataSet, а...

8
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
06.01.2017, 13:22
Bidgo,
Посмотрите здесь Динамическое выполнение условия из TextBox, м.б. что-то из этого будет полезно.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
06.01.2017, 14:17
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Bidgo, можно использовать пакет System.Linq.Dynamic:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Imports System.Linq.Expressions
...
Dim textBoxes() As TextBox = Controls.OfType(Of TextBox)().Where(Function(tb) tb.Name.StartsWith("A")).ToArray()
Dim lambdaParameters() As ParameterExpression = textBoxes.Select(Function(tb) ParameterExpression.Variable(GetType(Integer), tb.Name)).ToArray()
' Приходится использовать тип Object т.к. DynamicInvoke принимает массив Object
Dim values() As Object = textBoxes.Select(Function(tb) CType(Convert.ToInt32(tb.Text), Object)).ToArray()
 
Dim formula As String = "A0 + A1"
Dim result As Integer = Convert.ToInt32(System.Linq.Dynamic.DynamicExpression.ParseLambda( _
    lambdaParameters, _
    GetType(Integer), _
    formula _
).Compile().DynamicInvoke(values))
2
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
07.01.2017, 00:37
Вариации на ту же тему. Операции с базой данных естественно опущены.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Imports Tech.DynamicCoding
Imports Tech.DynamicCoding.Compilers
Public Class Form3
    'добавлен компонент AxMSScriptControl
    Private Sub Script_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim action As String = CType(Asumm.Tag, String)
        Asumm.Text = action
        action = action.Replace("A1", A1.Text)
        action = action.Replace("A2", A2.Text)
        action = action.Replace("A3", A3.Text)
        AxScriptControl1.Reset()
        TextBoxOut.Text = AxScriptControl1.Eval(action)
    End Sub
    'с генерацией кода Net, источник: [url]https://habrahabr.ru/post/199266/[/url]
    Private Sub DyCoding_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        Dim action As String = CType(Asumm2.Tag, String)
        Asumm2.Text = action
        action = action.Replace("B1", B1.Text)
        action = action.Replace("B2", B2.Text)
        action = action.Replace("B3", B3.Text)
        TextBoxOut2.Text = CodeGenerator.ExecuteCode(Of Integer)("return " & action & ";").ToString
    End Sub
    Private Sub DyCoding2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        'то же самое, но с параметрами
        Dim action As String = CType(Asumm2.Tag, String)
        Asumm2.Text = action
        Dim rz As Integer = CodeGenerator.ExecuteCode(Of Integer)("return " & action & ";", _
                            CodeParameter.Create(B1.Name, CInt(B1.Text)), _
                            CodeParameter.Create(B2.Name, CInt(B2.Text)), _
                            CodeParameter.Create(B3.Name, CInt(B3.Text)))
        TextBoxOut2.Text = rz
    End Sub
End Class
Миниатюры
Выполнить операции по формуле, которая хранится в базе данных  
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
07.01.2017, 19:25
Лучший ответ Сообщение было отмечено Bidgo как решение

Решение

Использование скриптов бывает очень полезно.
Если нужно просто вычислить некоторое элементарное выражение (в рамках рассматриваемой задачи)
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Private Sub Script_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim action As String = CType(Asumm.Tag, String)
    Asumm.Text = action
    For Each ob As Control In Me.Panel1.Controls
        If TypeOf ob Is TextBox AndAlso ob.Name.StartsWith("A") Then
            action = action.Replace(ob.Name, ob.Text)
        End If
    Next
    AxScriptControl1.Reset()
    TextBoxOut.Text = AxScriptControl1.Eval(action)
End Sub

Так можно оформить вычисление более сложной функции записанной в строке
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Private Sub Script_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim action As String = "function sol(a,b,c)" & vbCrLf & "sol=sqr(a*b)+c" & vbCrLf & "End function"
    'или так
    'action = "function sol(a,b,c) : sol=sqr(a*b)+c : End function" 
    Asumm.Text = action
    AxScriptControl1.Reset()
    AxScriptControl1.Language = "VBScript"
    AxScriptControl1.AddCode(action)
    Dim pr() As Object = {A1.Text, A2.Text, A3.Text}
    TextBoxOut.Text = AxScriptControl1.Run("sol", pr)
End Sub

Можно и далее приводить примеры разумного использования Script-ов.
Когда имеет смысл прибегать к динамической компиляции кода? На мой взгляд, это целесообразно когда на входе достаточно обширный блок кода, включающий специальные типы Net. При этом нужно учесть, что скорость выполнения динамической компиляции невысока. Хотя в случаях разовых вычислений это, наверное, несущественно.
Для проверки было выполнено тестирование скорости вычисления простого выражения sqr(A1*A2)+A3 с использованием VBScript и динамической компиляции.
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub testTo(ByVal nn As Integer)
    Dim sw As New Stopwatch
    Dim action As String = "sqr(A1*A2)+A3"
    Dim action2 As String = "Math.Sqrt(A1*A2)+A3"
    sw.Start()
    For i = 1 To nn
        toScript(action)
        'toDyCoding(action2)
    Next
    sw.Stop()
    MsgBox("Реализаций: " & nn.ToString & "  Время (ms): " & sw.ElapsedMilliseconds.ToString)
End Sub
Private Sub toScript(ByVal action As String)
    For Each ob As Control In Me.Panel1.Controls
        If TypeOf ob Is TextBox AndAlso ob.Name.StartsWith("A") Then
            action = action.Replace(ob.Name, ob.Text)
        End If
    Next
    AxScriptControl1.Reset()
    Dim result As Double = AxScriptControl1.Eval(action)
End Sub
Private Sub toDyCoding(ByVal action As String)
    Dim textBoxes() As TextBox = Me.Panel1.Controls.OfType(Of TextBox)().Where(Function(tb) tb.Name.StartsWith("A")).ToArray()
    Dim lambdaParameters() As ParameterExpression = textBoxes.Select(Function(tb) ParameterExpression.Variable(GetType(Double), tb.Name)).ToArray()
    Dim values() As Object = textBoxes.Select(Function(tb) CType(Convert.ToDouble(tb.Text), Object)).ToArray()
    Dim result As Double = Convert.ToDouble(System.Linq.Dynamic.DynamicExpression.ParseLambda( _
                    lambdaParameters, GetType(Double), action).Compile().DynamicInvoke(values))
End Sub

Получены следующие результаты (ms)
ntoScripttoDyCodingk
1000402005.0
1000031518455.9
1000003230182405.6
1
117 / 110 / 31
Регистрация: 05.04.2014
Сообщений: 224
08.01.2017, 20:28  [ТС]
ovva, спасибо.
Единственный вопрос..
Будет работать на .NET2.0?
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
08.01.2017, 22:12
Не вижу никаких противопоказаний.
0
117 / 110 / 31
Регистрация: 05.04.2014
Сообщений: 224
10.11.2019, 09:21  [ТС]
Снова подниму старую тему....
Все получилось, но теперь нужно в формуле использовать условие.
Например, когда в eval передавалась строка "а*(b+с)" все было хорошо.
Сейчас надо передать "if a>b then a-b else a-c"
Как правильно записать формулу?

VB.NET
1
2
3
4
5
Dim objScript As Object = CreateObject("MSScriptControl.ScriptControl")
objScript.Language = "VBScript"
sFormula = "5*2-4" ' так возвращает ответ 6
sFormula = "If (5>2) then (5-2) else (5-4)"  ' так возвращает ошибку "Синтаксическая ошибка"
tmpF = objScript.Eval(sFormula)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 1
10.11.2019, 11:55
Bidgo,
VB.NET
1
2
3
4
5
6
7
8
9
objScript.AddCode("Function IIF(Expression,TruePart,FalsePart)
                If Expression Then
                    IIF=TruePart
                Else
                    IIF=FalsePart
                End IF
            End Function")
sFormula = "IIf(5>2, 5-2, 5-4)"
tmpF = objScript.Eval(sFormula) ' 3
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2019, 11:55
Помогаю со студенческими работами здесь

Не удаётся подключиться к базе данных и выполнить запрос
Доброго времени суток всем участникам форума. Надо подключиться к базе данных и достать из неё данные. Использую вот этот код: ...

Ежедневник c календарём в RAD Studio, пример на скрине. (По нажатию на дату на календаре должна редактироваться запись, которая хранится в бае данных)
Программа должна использовать базу данных microsoft access. По нажатию на день на календаре, в поле должна открыться запись на этот день,...

Как подключиться к базе данных, которая расположена на web-сервере
Подскажите плз, как на C# подключиться к базе данных, которая расположена на web-сервере, если известен ип сервера, название базы логин и...

Как будет выглядеть строка подключения к базе данных, которая лежит на хостинге
Здравствуйте, форумчане! Пробую подключится к базе данных, которая расположена на сервере www.hostinger. Моя строка подключения: ...

Реализовать структуру данных, которая имеет все те же операции, что массив длины n. Сложность операций
Реализовать структуру данных, которая имеет все те же операции, что массив длины n, а именно начать работу ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru