Я создал службу Windows, которая анализирует некоторые файлы, для каждого обработанного файла я записываю его в базу данных Oracle, но всякий раз, когда я вставляю одну запись, она дублирует ее в БД, ниже приводится полная информация
Оконная служба принимает файл, помещенный в папку, и обрабатывает его, после обработки вызывает веб-API и пытается опубликовать запись, затем веб-API пытается вызвать процедуру Oracle для сохранения записи.
Я пытался создать отдельную таблицу, но тот же результат также, когда я вставляю ее непосредственно через процедуру с использованием PL / SQL, она работает нормально и вставляет только одну строку.
как только веб-сервис запускается, я подключаю его к своему веб-API следующим образом:
private void connectToAPI()
{
using (var client = new HttpClient())
{
//setup client
client.BaseAddress = new Uri(apiBaseUri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//setup login data
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("grant_type", "password"),
new KeyValuePair<string, string>("username", "someuser"),
new KeyValuePair<string, string>("password", "Password"),
});
HttpResponseMessage result = client.PostAsync("/Token", formContent).Result;
var Acesstoken = "";
if (result.IsSuccessStatusCode)
{
string resultContent = result.Content.ReadAsStringAsync().Result;
var jObject = JObject.Parse(resultContent);
Acesstoken = jObject.GetValue("access_token").ToString();
token = string.Format("Bearer {0}", Acesstoken);
}
//return RedirectToLocal(returnUrl);
}
}
После этого я пытаюсь опубликовать запись при разборе файла,
ApiHelper.APIHelper.PostRequest(token, "InsertLogs", edLog);
вот код для PostRequest
public static HttpResponseMessage PostRequest(string Token, string requestPath, object _obj_To_Pass)
{
using (var client = new HttpClient())
{
//setup client
client.BaseAddress = new Uri(apiBaseUri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));//application/json
if (Token != null)
{
client.DefaultRequestHeaders.Add("Authorization", Token);
}
//make request
string strjson = JsonConvert.SerializeObject(_obj_To_Pass);
var buffer = System.Text.Encoding.UTF8.GetBytes(strjson);
var byteContent = new ByteArrayContent(buffer);
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var responseTask = client.PostAsync(requestPath, byteContent);
responseTask.Wait();
var response = responseTask.Result;
if (!response.IsSuccessStatusCode)
{
// Unwrap the response and throw as an Api Exception:
var ex = CreateApiException(response);
throw ex;
}
return response;
}
}
На стороне веб-API у меня есть этот код
[Route("InsertLogs")]
public IHttpActionResult InsertLogs(EDLog edLog)
{
MainDataAccess objMainDataAccess = new MainDataAccess();
objMainDataAccess.InsertEdLog(edLog.FileName,edLog.line,edLog.Status);
return Ok();
}
//Invoked method
public void InsertEdLog(string fileName, string b, string V, string status)
{
string procedure = "PKG_EXTRACTFILE.spInsertEdLog";
OracleParameter[] _OracleParameter = new OracleParameter[4];
_OracleParameter[0] = new OracleParameter("inFileName", OracleDbType.Varchar2, ParameterDirection.Input);
_OracleParameter[0].Value = fileName;
_OracleParameter[1] = new OracleParameter("inB", OracleDbType.Varchar2, ParameterDirection.Input);
_OracleParameter[1].Value = bol;
_OracleParameter[2] = new OracleParameter("inV", OracleDbType.Varchar2, ParameterDirection.Input);
_OracleParameter[2].Value = VIR;
_OracleParameter[3] = new OracleParameter("inStatus", OracleDbType.Varchar2, ParameterDirection.Input);
_OracleParameter[3].Value = status;
_ConnectionClass.ExecuteProcedure(procedure, _OracleParameter);
}
//Execute Procedure method
public DataSet ExecuteProcedure(String _procedure, OracleParameter[] _OracleParameter)
{
OracleCommand _OracleCommand = new OracleCommand();
//DataTable dataTable = new DataTable();
//dataTable = null;
DataSet ds = new DataSet();
try
{
_OracleCommand.Connection = OpenConnection();
_OracleCommand.CommandText = _procedure;
_OracleCommand.Parameters.AddRange(_OracleParameter);
_OracleCommand.CommandType = CommandType.StoredProcedure;
_OracleDataAdapter.SelectCommand = _OracleCommand;
_OracleCommand.ExecuteNonQuery();
_OracleDataAdapter.Fill(ds);
//dataTable = ds.Tables[0];
}
catch (OracleException e)
{
Console.Write("Error - Connection.executeSelectQuery - Query: " + _procedure + " \nException: " + e.StackTrace.ToString());
return null;
}
finally
{
Dispose();
}
return ds;
}
Inserting a single record is producing following value
Also please look at the timestamp
![PL/SQL SS](https://i.ibb.co/2SdjztJ/Capture.jpg)