Member 14044492 Ответов: 2

Сохраните среднее значение из первой таблицы во вторую таблицу и удалите данные из первой таблицы после сохранения


привет...
У меня есть две таблицы, и я хочу сохранить значение из датчика, когда значение датчика>0 в первой таблице и когда значение датчика=0 я хочу вычислить среднее значение датчика в первой таблице и сохранить результат во второй таблице и удалить данные в первой таблице в первой таблице. vb.net

Что я уже пробовал:

hi...
I have two tables and I want save  value from senser when the sensor value>0 in first table and when senser value=0 I want calculate the average sensor value in first table and save the resulat in second table and delete the data in first table in vb.net

MadMyche

SQL Server?

Member 14044492

да с sql server

Member 14044492

это мой код

Частная суб Timer1_Tick(как byval отправителя как объект, как byval E Как системы.EventArgs) Обрабатывает Timer1.Tick

Если s1.Тогда IsOpen = False

С1.Имя_порта = "порт com4"
С1.Скорость передачи = 9600
С1.Открыть()

Тусклое чтение как строка
значение = С1.С readline()

-lb_case.ForeColor = Цвет.Зеленый
-lb_case.Text = "подключено"

txt_read.Текст = Преобразовать.ToString(чтение)
Если txt_read.Текст <> "" Тогда
Выберите Case Val(txt_read.Текст)

Случай 0.0
''''فحص جدول القراءات

Comm = New SqlClient.SqlCommand("SELECT * FROM first_tab", con)
SQLAdap.Команды Selectcommand = Комм
comBild = новый SqlClient.SqlCommandBuilder(SQLAdap)

SQLAdap.Заполнить(ДС, "ds_used1")

Если ДС.Таблицы ("ds_used1").строки.Тогда считайте > 0
'حساب معدل الوقود الصاعد
Comm = New SqlClient.SqlCommand("select AVG (reading) from first_tab ", con)


SQLAdap.Команды Selectcommand = Комм
comBild = новый SqlClient.SqlCommandBuilder(SQLAdap)
SQLAdap.Заполнить(ДС, "ds_avup")

Дим av_fuel_up как двойной
av_fuel_up = ds.Tables("ds_avup").Строки(0).Элемент(0)

'حساب تاريخ التشغيل
Comm = New SqlClient.SqlCommand("select read_date from first_tab where id=1", con)


SQLAdap.Команды Selectcommand = Комм
comBild = новый SqlClient.SqlCommandBuilder(SQLAdap)
SQLAdap.Заполнить(ДС, "ds_read_date")

Dim work_date как дата
work_date = ds.Tables("ds_read_date").Строки(0).Элемент(0)

'حساب مدة التشغيل
Комм = Новый Sqlclient Как.Команда sqlcommand("выберите datediff(с(выберите read_date от first_tab где id=1),(Выбрать read_date от first_tab где ID=(выбрать Макс(ид)от first_tab)))", кон)





SQLAdap.Команды Selectcommand = Комм
comBild = новый SqlClient.SqlCommandBuilder(SQLAdap)
SQLAdap.Заполнить(ДС, "ds_working_period")

Dim working_period как целое число
working_period = ds.Tables("ds_working_period").Строки(0).Элемент(0)

'اضافة البيانات الى جدول التشغيل
Comm = New SqlClient.SqlCommand("SELECT * FROM second_table", con)
SQLAdap.Команды Selectcommand = Комм
comBild = новый SqlClient.SqlCommandBuilder(SQLAdap)
SQLAdap.Заполнить(ДС, "ds_working")
Дим рп2 качестве объекта datarow

рп2 = ДС.Столы("ds_working").Невров

dr2.Item("working_date") = work_date
dr2.Item("read_av") = av_fuel_up
рп2.Пункт("период") = working_period

ДС.Столы("ds_working").Строк.Добавить(рп2)

комбильд.Getupdatecommand будет()
SQLAdap.Обновление(ds, "ds_working")
против.Закрывать()
'تصفير جدول الاستخدام

Дим УМК как нового sqlclient как.Команда sqlcommand
УМК.Свойство Commandtype = Значение Commandtype.Текст
УМК.CommandText = "усечь таблицу first_tab"
УМК.Подключение = кон

против.Открыть()
УМК.Метод executenonquery()

против.Закрывать()
Еще

MadMyche

Лучше всего было бы использовать виджет "улучшить вопрос" и вставить его в свой официальный пост.

Member 14044492

Большое спасибо!...
вы можете написать vb.net треска в событие таймера, чтобы работать ваш SQL-код, который отправлять ко мне

MadMyche

Я бы предпочел не делать этого по нескольким причинам:
1. Мое мнение заключается в том, что это задача базы данных, и что ваше приложение должно вызывать процедуру, которая содержит несколько операторов SQL
2. код должен быть изменен в соответствии с вашей схемой базы данных, которую я не знаю.
3. я считаю, что вам было бы лучше, если бы вы сами научились выполнять хранимые процедуры. Может потребоваться больше времени, чтобы написать их и включить их, но когда они написаны хорошо, они почти всегда превосходят любую рутину на стороне приложения или ORM.

Member 14044492

спасибо тебе большое....
Я успешно решил проблему, с которой столкнулся, и благодарю вас за помощь в ее решении

2 Ответов

Рейтинг:
2

Member 14044492

CREATE TABLE dbo.Table1 (
	ndx         INT IDENTITY(1,1) NOT NULL,
	SensorID    INT,
	SensorTime  DATETIME,
	SensorValue Decimal,
	CONSTRAINT PK_Table1 PRIMARY KEY ([SensorID], [ndx]) ON [PRIMARY]
) ON [PRIMARY]
GO




CREATE TABLE dbo.Table2 (
	ndx             INT IDENTITY(1,1) NOT NULL,
	SensorID        INT,
	SensorTimeStart DATETIME,
	SensorTimeEnd   DATETIME,
        period          Int,
	SensorValue     Decimal,
	CONSTRAINT PK_Table2 PRIMARY KEY ([SensorID], [ndx]) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE PROCEDURE dbo.Sensor_LogValue (
@SensorID     INT,
	@SensorValue  Decimal 
) AS 
BEGIN
	IF (@SensorValue > 0) BEGIN
		INSERT Table1 ( SensorID,  SensorValue, SensorTime)
		VALUES (       @SensorID, @SensorValue, GetDate() )
	END; ELSE IF (@SensorValue = 0) BEGIN
		
		INSERT Table2 (	SensorID,	SensorTimeStart,	SensorTimeEnd , period,		SensorValue)
		SELECT			SensorID,	Min(SensorTime),	Max(SensorTime),DATEDIFF(s,Min(SensorTime),Max(SensorTime)),	Avg(SensorValue)
		FROM		Table1 
		WHERE	SensorID = @SensorID group by SensorID

		truncate table Table1

END; 
END


Рейтинг:
17

MadMyche

Если вы делаете это с помощью SQL Server, то лучшим вариантом, вероятно, было бы использовать хранимую процедуру для выполнения логики и последующих действий.

Не имея от вас более конкретной информации, я придумал концепцию, которая будет отвечать вашим потребностям.
В нем есть несколько дополнительных предметов:
- Возможность использования нескольких датчиков
- Отслеживает индивидуальное время при использовании таблицы 1
- Агрегирует время работы датчика так, чтобы у вас был диапазон (временной интервал) в таблице 2.

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

CREATE TABLE dbo.Table1 (
	ndx         INT IDENTITY(1,1) NOT NULL,
	SensorID    INT,
	SensorTime  DATETIME,
	SensorValue INT,
	CONSTRAINT PK_Table1 PRIMARY KEY ([SensorID], [ndx]) ON [PRIMARY]
) ON [PRIMARY]
GO


CREATE TABLE dbo.Table2 (
	ndx             INT IDENTITY(1,1) NOT NULL,
	SensorID        INT,
	SensorTimeStart DATETIME,
	SensorTimeEnd   DATETIME,
	SensorValue      INT,
	CONSTRAINT PK_Table2 PRIMARY KEY ([SensorID], [ndx]) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE PROCEDURE dbo.Sensor_LogValue (
	@SensorID     INT,
	@SensorValue  INT 
) AS 
BEGIN
	IF (@SensorValue > 0) BEGIN
		INSERT Table1 ( SensorID,  SensorValue, SensorTime)
		VALUES (       @SensorID, @SensorValue, GetDate() )
	END; ELSE IF (@SensorValue = 0) BEGIN
		
		INSERT Table2 (	SensorID,	SensorTimeStart,	SensorTimeEnd,		SensorValue)
		SELECT			SensorID,	Min(SensorTime),	Max(SensorTime),	Avg(SensorValue)
		FROM		Table1 
		WHERE	SensorID = @SensorID

		DELETE Table1	WHERE SensorID = @SensorID

	END; ELSE BEGIN
		-- ToDo: What happens if negative value passed in
		Print 'Some error occurred......'
	END
END
GO


Member 14044492

Я успешно решил эту проблему

Member 14044492

код c# :
использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
использование System.Data;
использование системы.Рисование;
использование System.Linq;
использование System.Text;
использование системы.Окна.Формы;

пространство имен csharp_save_reading
{
общественности частичного класс form1 : форма
{
cls_products ТЗ=новый cls_products();
открытый form1()
{
метод InitializeComponent();
}

частный недействительными timer1_Tick(объект отправителя, EventArgs в электронной)
{
if (s1.IsOpen == false)
{

С1.Имя_порта = "порт com4";
С1.Скорость передачи = 9600;
С1.Открыть();
Строковое значение;
значение = С1.С readline();
txt_read.Текст = Преобразовать.ToString(чтение);

если (txt_read.Текст != null)
{
двойной x;
x = преобразовать.Метод todouble(txt_read.Текст);
prd.add_product(10,x);

}



}

еще
{
С1.Рядом();
}

}
}
}