首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JScript 呼叫 ADO Execute 無法取得 RecordsAffected 解決方案:混用 VBScript

     編輯:程式設計綜合問答

問題

JScript (JavaScript) 呼叫 Connection.Execute(sql, recordsAffected, options) 時,recordsAffected 永遠保持初始值,無法取得影響列數。VBScript 同樣呼叫卻正常。

原因

JScript **不支援 ByRef (傳址) 參數**,COM 介面的 recordsAffected 為 [out] 參數,需呼叫端提供可寫入的變數位址。JScript 變數為值型別,無法滿足。

解決方案:VBScript 協助函式

<%@ Language=JScript %>
<%
var conn = Server.CreateObject("ADODB.Connection");
conn.Open(connStr);

var sql = "UPDATE T SET ...";
var rows = 0;

// 呼叫 VBScript 子程序
ExecCommand(sql, rows); // rows 為 JScript 變數,但 VBScript 以 ByRef 接收

Response.Write("影響列數: " + rows);
%>

<script language="VBScript" runat="server">
Sub ExecCommand(sql, ByRef affected)
    On Error Resume Next
    conn.Execute sql, affected
    If Err.Number <> 0 Then affected = -1
End Sub
</script>

替代方案

  • 改用 Recordset.Open 並讀取 Recordset.RecordCount(需 adOpenKeyset 或 adOpenStatic)。
  • 在 SQL 中加入 SELECT @@ROWCOUNT 並用 Recordset 讀取。
  • 將整段資料庫邏輯移至 VBScript/ASP.NET (C#) 元件,避免 JScript COM 互通痛點。

總結

JScript 與 COM 互操作的 ByRef 參數缺陷,需透過支援 ByRef 的語言(VBScript、C#、VB.NET)包裝解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved