首页 > 解决方案 > 为什么 Oracle 复制单个插入

问题描述

我创建了一个解析一些文件的 Windows 服务,对于每个处理的文件,我将其记录到 Oracle 数据库中,但是每当我插入一条记录时,它就会在数据库中复制它,下面是完整的详细信息 Window 服务接受放置在文件夹中的文件并在处理后处理它调用 Web API 并尝试发布记录,然后 Web API 尝试调用 Oracle 过程来存储记录。

我尝试创建单独的表,但当我使用 PL/SQL 直接通过过程插入它时,结果也相同,它工作正常并且只插入一行。

一旦网络服务启动,我就将它连接到我的 Web 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;
        }
    }

在 web 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)

标签: c#asp.net-web-apistored-proceduresoracle11g

解决方案


推荐阅读