#c# #visual-studio-2008 #windows-services #date #oracle8i
#c# #visual-studio-2008 #windows-services #Дата #oracle8i
Вопрос:
Я пытаюсь создать инструкцию SQL, которая позволит мне удалить все строки в таблице, которые старше самой приличной даты, сохраняя при этом самую последнюю. Это используется для проекта, над которым я работаю. Я беру данные из базы данных MS Access и перетаскиваю эти данные в таблицу oracle. Эта программа встраивается в приложение-службу Windows, которое я создаю в Visual Studio 2008 C #, чтобы я мог периодически запускать ее для получения самой последней информации.
Мне просто нужно выяснить еще несколько вещей, которые можно добавить в мой код:
-
Найдите какой-нибудь способ удалить эти старые строки из моей таблицы Oracle
-
Скажите моей службе, чтобы она запускалась так часто, каждый час или 2
-
Проверьте наличие ошибок в соединениях, отсутствующих файлов и т.д.
Буду признателен за любую помощь с моим основным вопросом и другими шагами.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Data.OracleClient;
using System.Data.SqlClient;
using System.IO;
using System.Data.Odbc;
namespace GasReportservice
{
public partial class GasReportService : ServiceBase
{
public GasReportService()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource("MySource", "MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
string connectionString = "Dsn=Gas_meter";
string col0 = "";
string col1 = "";
string col2 = "";
string col3 = "";
string col4 = "";
string col5 = "";
string col6 = "";
string col7 = "";
string col8 = "";
OdbcConnection DbConnection = new OdbcConnection(connectionString);
OdbcCommand DbCommand = DbConnection.CreateCommand();
DbConnection.Open();
DbCommand.CommandText = "SELECT DateTime, S1Flow, S2Flow, S3Flow, S4Flow, S1FlowTotal, S2FlowTotal, S3FlowTotal, S4FlowTotal FROM CommonStation WHERE Format(DateTime, 'mm/dd/yyyy') >=(select Format(max(DateTime),'mm/dd/yyyy') from CommonStation)";
OdbcDataReader DbReader = DbCommand.ExecuteReader();
int fCount = DbReader.FieldCount;
/*
for (int i = 0; i < fCount; i )
{
String fName = DbReader.GetName(i);
Console.Write(fName "t");
}
*/
try
{
while (DbReader.Read())
{
string connString = "DSN=Gas_meter_proj;Uid=cm;Pwd=cmdev123";
OdbcConnection conn = new OdbcConnection(connString);
string sqlins = @"insert into Commonstation(CommStatDate_Time, S1_Flow, S2_Flow, S3_Flow, S4_Flow, S1_Flow_Total, S2_Flow_Total, S3_Flow_Total, S4_Flow_Total ) values (to_date('" col0 "', 'MM/DD/YYYY HH:MI:SS AM' ),to_number('" col1 "'), to_number('" col2 "'), to_number('" col3 "'), to_number('" col4 "'),to_number('" col5 "'),to_number('" col6 "'),to_number('" col7 "'),to_number('" col8 "'))";
OdbcCommand cmdnon = new OdbcCommand(sqlins, conn);
cmdnon.Parameters.Add(col0, OdbcType.DateTime);
cmdnon.Parameters.Add(col1, OdbcType.Numeric);
cmdnon.Parameters.Add(col2, OdbcType.Numeric);
cmdnon.Parameters.Add(col3, OdbcType.Numeric);
cmdnon.Parameters.Add(col4, OdbcType.Numeric);
cmdnon.Parameters.Add(col5, OdbcType.Numeric);
cmdnon.Parameters.Add(col6, OdbcType.Numeric);
cmdnon.Parameters.Add(col7, OdbcType.Numeric);
cmdnon.Parameters.Add(col8, OdbcType.Numeric);
conn.Open();
col0 = DbReader["DateTime"].ToString();
col1 = DbReader["S1Flow"].ToString();
col2 = DbReader["S2Flow"].ToString();
col3 = DbReader["S3Flow"].ToString();
col4 = DbReader["S4Flow"].ToString();
col5 = DbReader["S1FlowTotal"].ToString();
col6 = DbReader["S2FlowTotal"].ToString();
col7 = DbReader["S3FlowTotal"].ToString();
col8 = DbReader["S4FlowTotal"].ToString();
int rowsAffected = cmdnon.ExecuteNonQuery();
conn.Close();
Console.WriteLine(rowsAffected);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
DbReader.Close();
DbCommand.Dispose();
DbConnection.Close();
}
}
protected override void OnContinue()
{
eventLog1.WriteEntry("My service has resumed action.");
}
protected override void OnPause()
{
eventLog1.WriteEntry("My service has been paused.");
}
protected override void OnStop()
{
eventLog1.WriteEntry("My service has been stopped.");
}
}
}
Ответ №1:
Это базовый SQL.
DELETE FROM <yourtable>
WHERE <yourdatefield> < (SELECT Max(<yourdatefield>) FROM <yourtable>)
Что касается других ваших вопросов, они должны быть отдельными вопросами. Это совершенно разные темы, и ответы на них (и с возможностью поиска) следует искать независимо от этой.