The "L" in your Open makes me nervous.
From the description, it seems to hang and wait for unlock not In IRIS but at OS-FileSystem Level.
The description of "L" seems to give some chance for such a conflict. 

L   Locked Exclusive: Use this mode with the “W” (Write) mode to specify exclusive write access to a file. “WL” or “WRL” specifies that the current process has exclusive write access to the file. A file opened with “RL” may still have shared read access. The effects of the “L” mode on concurrent opens are different in Windows and UNIX®. Refer to the “OPEN Mode Locking” section, below, for further details. On UNIX® systems if one process specifies “WL” (or “WRL”) access to a file, other processes requesting read access to that file must specify “RL” so that UNIX® can coordinate file locking.

suggested testing:

  • Check the situation without "L"
  • If there is a difference: find out who else may lock at OS level  

Hi @Lorenzo Scalese 
I guess you are looking for class(%Utility).FormatString()

USER>set lb=$lb(1,"Lorenzo",2023,"RCC"_$c(13,10))
USER>write lb
      LorenzoçRCC
 
USER>zzdump lb
0000: 03 04 01 09 01 4C 6F 72 65 6E 7A 6F 04 04 E7 07         .....Lorenzo..ç.
0010: 07 01 52 43 43 0D 0A                                    ..RCC..
;;;;;  this is it
USER>set viewlb=##class(%Utility).FormatString(lb)
 
USER>write viewlb
$lb(1,"Lorenzo",2023,"RCC"_$c(13,10))
USER>zwrite viewlb
viewlb="$lb(1,""Lorenzo"",2023,""RCC""_$c(13,10))"

Your transformation produces  a YYYY-MM-DD HH:mm:SS string
in contradiction 
Property DOB As %Date;   expects an Integer similar to +$h 
The error is reported during Validation before %Save() of  your record

  • either you change  Property DOB As %String;
  • or use '$zdateh(source.DOB,7,,,,,,,,"")'   then ##class(%Date).IsValid(...)  is happy
/// example of an extra light output to CSV 
Class dc.SQLExport Extends %CSP.Page
{
ClassMethod content() As %Status
{
  set sep=";"
  set sqlStatement="SELECT ...... FROM ....."
    ,query = ##class(%ResultSet).%New()
    ,sc = query.Prepare(sqlStatement)
  set:sc sc=query.Execute()
  quit:'sc sc
  set cols=query.GetColumnCount()
  for col=1:1:cols { if col>1 write sep
    write query.GetColumnHeader(col)
  }
  write !
  while query.Next() {
    for col=1:1:cols { if col>1 write sep
      write query.GetData(col)
    }
    write !
  }
  quit $$$OK
}
/// filename should end with ".csv"
ClassMethod toFile(filename As %String) As %Status
{
  open filename:"WNS":1 
  else   quit $system.Status.Error(5005,filename)
  use filename
  set sc=..content()
  close filename 
  quit sc
}
}