2017-10-06 79 views
0

我試圖用c#更新oracle表中的一些記錄。我沒有收到錯誤,但是當我查看了我想要更新的記錄時,我發現這些記錄仍然具有相同的舊值。要查看每個查詢是否已成功執行,我已使用此行rowid= cmd.ExecuteNonQuery();,它通過查詢19583返回受影響的行數。我得到的數字是我表格中的行數。C#:更新查詢值沒有反映在預期的oracle表

[OperationContract] 

    public int pushData(string CustomObjects) 
    { 

     List<CustomObject> myDeserializedObjList = (List<CustomObject>)Newtonsoft.Json.JsonConvert.DeserializeObject(CustomObjects, 
     typeof(List<CustomObject>)); 
     string constr = "my connection string"; 
     int rowid = 0; 
     using(OracleConnection con = new OracleConnection(constr)){ 

     con.Open(); 
     OracleCommand cmd = new OracleCommand(); 
     cmd.Connection = con; 
     cmd.CommandType = CommandType.Text; 

     foreach (CustomObject element in myDeserializedObjList) 
     { 

      int num = element.num; 

      string mydate = element.mydate; 

      long num2 = element.num2; 

      string user = element.user; 


      string sqlStatement= "UPDATE CustomObjectS SET num = num, 
      mydate=mydate, num2=num2, user=user WHERE num = num"; 
      OracleTransaction myTrans; 

      // Start a local transaction 
      myTrans = con.BeginTransaction(); 
      // Assign transaction object for a pending local transaction 
      cmd.Transaction = myTrans; 
      cmd.CommandText=sqlStatement; 
      cmd.Parameters.Add(new OracleParameter("num", num)); 
      cmd.Parameters.Add(new OracleParameter("user", user)); 
      cmd.Parameters.Add(new OracleParameter("num2", num2)); 
      cmd.Parameters.Add(new OracleParameter("mydate", OracleDbType.Date)); 
      cmd.Parameters[3].Value = mydate; 


        rowid= cmd.ExecuteNonQuery(); 

        myTrans.Commit(); 



      } 


    } 


     return rowid; 

    } 
+1

,我們在您DML字符串'「UPDATE CustomObjectS SET NUM = NUM​​,指明MyDate =指明MyDate,NUM2 = NUM​​2,用戶=用戶沒有綁定變量WHERE num = num「'。你打算''更新CustomObjectS SET num =:num,mydate =:mydate,num2 =:num2,user =:user WHERE num =:num「'? (並且你不需要在where子句中設置'num =:num')。 – MT0

回答

2

看起來像是用當前值更新行。嘗試添加:在查詢中的參數名:

UPDATE CustomObjectS SET num = :num, 
      mydate=:mydate, num2=:num2, user=:user WHERE num = :num 

Using Oracle parameters

+1

另外,我會避免爲列和參數使用完全相同的名稱(可能會添加像「par」這樣的前綴)。和'cmd.Parameters [3] .Value = mydate;'似乎不是一個好主意:一旦你添加了另一個參數,「mydate」的索引可能會改變......'cmd.Parameters.Add(new OracleParameter 「mydate」,OracleDbType.Date))。Value = mydate;'可能是更好的方法。 –

+0

謝謝你好像我們已經解決了一部分問題。現在,我收到了這個錯誤:SoapFault - faultcode:'a:InternalServiceFault'faultstring:'ORA-1843:not a valid month'faultactor:'null'detail:org.kxml2.kdom.Node @ 6c9cf70' –

+0

@se我建議將'string mydate = element.mydate;'轉換爲DateTime並將其作爲參數傳遞。類似於'DateTime mydate = DateTime.ParseExact(element.mydate,「」,System.Globalization.CultureInfo.InvariantCulture);' –