Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Lỗi thời gian chạy:-2147217887 (80040e21) Hệ thống không thể tìm thấy nội dung tin nhắn cho số tin nhắn 0x80040e21 trong tệp tin nhắn cho OraOLEDB

Với nhiều tham số này, vấn đề có thể là bất kỳ một mục bao gồm kiểu dữ liệu không khớp, độ dài dữ liệu, v.v. Đây là nơi mà nghệ thuật được gọi là gỡ lỗi phải được thực hiện.

  1. Kiểm tra kỹ các kiểu dữ liệu của bảng (T_SAP_ZSSTABL_NEW ). Oracle có thể có các kiểu dữ liệu không thể dịch được ngay lập tức Loại ADO chẳng hạn như BLOB , CLOB , BFILE , kiểu số có độ chính xác cao, kiểu ký tự tối đa hoặc kiểu mở rộng (XML, phương tiện, v.v.).

  2. Thử kéo dài độ dài dữ liệu (hoặc để trống trong phần gán tham số):

    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR)
    
    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
    

    Nếu cần, hãy kiểm tra độ dài biến bằng Len() của VBA để đưa ra cảnh báo người dùng trước khi thêm các thông số.

  3. Thử chạy SELECT phiên bản truy vấn có cùng tham số để trả về một hàng kết quả. Nếu cùng một lỗi xảy ra, hãy bắt đầu với tham số đầu tiên, sau đó thêm tham số thứ hai hoặc lô 10 liên tiếp để cô lập mục có vấn đề.

    SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM,
           ...
    FROM T_SAP_ZSSTABL_NEW
    WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
    
  4. Refactor mã để có tính nhất quán, vì bạn có thể đã bỏ sót một hoặc căn chỉnh sai một trong những điều này có thể xảy ra với nhiều dòng lặp lại. Luôn hướng đến mã KHÔ (Không lặp lại bản thân). Một tùy chọn là sử dụng từ điển với các cặp khóa / giá trị thay vì hơn 160 biến hoặc phạm vi được đặt tên:

    Dim key As Variant
    Dim paramDict As Object
    Set paramDict = CreateObject("Scripting.Dictionary")
    
    For ...
        paramDict.Add "KeyX", "ValueX"
    Next ...
    
    ...
    
    With cmd
      .ActiveConnection = myOracleConn
      .CommandText = strSQL
      .CommandType = adCmdText
    
      For Each key In  paramDict.Keys
         .Parameters.Append .CreateParameter(key, adVarChar, adParamInput, , paramDict(key))
      Next key
    
      .Execute
    End With
    

    Nếu bạn có các loại hỗn hợp, hãy thử tạo các từ điển khác nhau cho từng loại và lặp lại chúng theo trình tự để thêm các tham số. Và điều chỉnh UPDATE với tất cả các loại giống nhau ở gần nhau. Nhớ lại UPDATE không cần tuân theo thứ tự các cột trong định nghĩa bảng.

  5. Nếu có thể (hoặc giải pháp lâu dài), hãy xem xét thiết kế lại bảng định dạng rộng của TSZ thành một dạng định dạng dài được chuẩn hóa.

    ID   POSNR   VBELN   Indicator   Value
     #     XXX     XXX       CHARG     XXX
     #     XXX     XXX       MATNR     XXX
     #     XXX     XXX       MAKTX     XXX
    ...
    

    Mặc dù điều này sẽ thêm 167 hàng cho mỗi mã định danh duy nhất, trong thiết kế cơ sở dữ liệu các hàng rẻ hơn nhiều so với cột và do đó việc truy vấn sẽ dễ dàng hơn và lưu trữ dữ liệu có thể mở rộng hơn và bảo trì hiệu quả hơn. Ví dụ:một số liệu mới không cần một cột được xác định mới với tất cả thông tin meta mà chỉ cần một hàng mới. Và với PIVOT của Oracle bạn có thể dễ dàng hiển thị lại định dạng rộng.

Nói chung, không có cách nào rõ ràng, duy nhất để gỡ lỗi thời gian chạy như thế này do một phần mở rộng API như kết nối cơ sở dữ liệu. Có thể dễ dàng xử lý cú pháp SQL hoặc tham chiếu đối tượng VBA nhưng các vấn đề về dữ liệu cụ thể đòi hỏi phải đào sâu một cách sáng tạo trong quá trình tổng thể.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi nhà phát triển SQL Không thể tìm thấy Máy ảo Java

  2. Vấn đề kỳ lạ về tư cách thành viên ASP

  3. Yêu cầu kết nối ODP.NET đã hết thời gian chờ

  4. (PLSQL) Biểu thức đơn giản nhất để kiểm tra giá trị đã thay đổi trong trình kích hoạt cập nhật trên Oracle là gì?

  5. Các giá trị SQL MIN từ hai bảng