2013-03-18 56 views
2

我可以使用IQ的直接接口從Oracle數據庫中很好地查詢行,但在簡單更新時遇到問題。我想知道我是否做錯了什麼,或者如果IQ無法處理我特定的Oracle表。無法使用LINQPad更新行4

我的表的主鍵是NUMBER(22),這導致實體的Int64。查詢有兩個數字列,我正在更新的列是一個CHAR,它是實體中的一個字符串。

這裏是我的更新...

var c = Components.Single (c => c.Componentordernumber == 119137 && c.Componentorderversion == 1); 
c.Circuitordernumber = "11043913"; 
SubmitChanges(); 
Components.Where (c => c.Componentordernumber == 119137 && c.Componentorderversion == 1).Dump(); 

當我在LINQPad運行它,它失敗在SubmitChange()。有一個TargetInvocationException(在_InvokeMethodFast)。而內部的例外是...

​​

回答

3

我對刪除行有同樣的問題。我找到了一個解決方案,將所有可爲空值的空字段設置爲非空值(例如0L)。

爲了簡化此我寫一個短擴展方法PatchForDelete(見下文),並用它喜歡:

var testUsers = Users.Where (a => a.login.StartsWith("test")); 
testUsers.Dump(); 

foreach (var user in testUsers) { 
    MyExtensions.PatchForDelete(user); 
    AsdBenutzers.DeleteOnSubmit(user); 
} 
SubmitChanges(); 

問候, 沃爾特

// 
// Patch for Bug in IQ-Driver 
// 
// If each nullable long field which is null ist set to 0L 
// DeleteOnSubmit() works!! 
// 
public static void PatchForDelete(object entity) { 
    var fields = entity.GetType().GetFields(); 

    foreach (var field in fields) { 
     if (field.FieldType == typeof(long?)) { 
      var v = field.GetValue(entity);    
      if (v == null) { 
       field.SetValue(entity, 0L); 
      } 
     } 
    } 
} 
+0

這是一個解決方法,但不幸的是對我來說不是一個完整的解決方案,因爲我公司的應用程序(可能還有許多其他應用程序)需要使用NULL值作爲不同於0或-1的值。 – 2013-09-09 20:34:59

+0

我能夠成功地更新一行,但我必須使用上面的補丁並將所有的空值設置爲long?列設置爲0.我還必須使用OCI連接模式。其他選項(「直接」)不起作用,因爲它失敗,出現此錯誤:http://forum.linqpad.net/discussion/132/oracleexception-ora-01483-invalid-length-for-date-or-number -bind可變 – 2013-09-09 20:51:05