参数映射失败.txt 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. func (rs *Rows) nextLocked() (doClose, ok bool) {
  2. if rs.closed {
  3. return false, false
  4. }
  5. // Lock the driver connection before calling the driver interface
  6. // rowsi to prevent a Tx from rolling back the connection at the same time.
  7. rs.dc.Lock()
  8. defer rs.dc.Unlock()
  9. if rs.lastcols == nil {
  10. rs.lastcols = make([]driver.Value, len(rs.rowsi.Columns()))
  11. }
  12. rs.lasterr = rs.rowsi.Next(rs.lastcols)
  13. -------
  14. func (rs *Rows) Next() bool {
  15. // If the user's calling Next, they're done with their previous row's Scan
  16. // results (any RawBytes memory), so we can release the read lock that would
  17. // be preventing awaitDone from calling close.
  18. rs.closemuRUnlockIfHeldByScan()
  19. if rs.contextDone.Load() != nil {
  20. return false
  21. }
  22. var doClose, ok bool
  23. withLock(rs.closemu.RLocker(), func() {
  24. doClose, ok = rs.nextLocked()
  25. })
  26. ----------
  27. func (rs *Rows) Scan(dest ...any) error {
  28. fmt.Printf("驱动内部的 sCan %#v \n", dest)
  29. if rs.closemuScanHold {
  30. // This should only be possible if the user calls Scan twice in a row
  31. // without calling Next.
  32. return fmt.Errorf("sql: Scan called without calling Next (closemuScanHold)")
  33. }
  34. rs.closemu.RLock()
  35. if rs.lasterr != nil && rs.lasterr != io.EOF {
  36. rs.closemu.RUnlock()
  37. return rs.lasterr
  38. }
  39. if rs.closed {
  40. err := rs.lasterrOrErrLocked(errRowsClosed)
  41. rs.closemu.RUnlock()
  42. return err
  43. }
  44. if scanArgsContainRawBytes(dest) {
  45. rs.closemuScanHold = true
  46. } else {
  47. rs.closemu.RUnlock()
  48. }
  49. if rs.lastcols == nil {
  50. rs.closemuRUnlockIfHeldByScan()
  51. return errors.New("sql: Scan called without calling Next")
  52. }
  53. if len(dest) != len(rs.lastcols) {
  54. fmt.Println(" len(rs.lastcols)", len(rs.lastcols))
  55. fmt.Println(" len(dest) ", len(dest), dest)
  56. fmt.Println("列数据不匹配")
  57. rs.closemuRUnlockIfHeldByScan()
  58. return fmt.Errorf("sql: expected %d destination arguments in Scan, not %d", len(rs.lastcols), len(dest))
  59. }
  60. fmt.Println("列数据匹配")
  61. for i, sv := range rs.lastcols {
  62. err := convertAssignRows(dest[i], sv, rs)
  63. if err != nil {
  64. rs.closemuRUnlockIfHeldByScan()
  65. return fmt.Errorf(`sql: Scan error on column index %d, name %q: %w`, i, rs.rowsi.Columns()[i], err)
  66. }
  67. }
  68. return nil
  69. }