ODBC连接后Electron崩溃问题求助
问题描述
通过ODBC连接成功获取数据后,首次切换至其他页面再返回刷新数据时出现错误,错误信息及相关代码如下:
数据获取代码
window.$ = window.jQuery = require("jquery"); const odbc = require("odbc"); async function queryOData() { const connection = await odbc.connect( `DSN=odbc605;Description=odbc605;UID=odbc605;;APP=Microsoft Office 2013;WSID=ZB585;DATABASE=605;LANGUAGE=Nederlands;StatsLog_On=Yes;StatsLogFile=C:\Users\FLORS\Desktop\STATS.LOG;` ); const data = await connection.query( "SELECT TOP 100 DT_ItemsTabel.ItemCode, DT_ItemsTabel.Description FROM DT_ItemsTabel" ); alert(data); } queryOData();
错误信息
[17028:0310/140004.528:ERROR:crashpad_client_win.cc(844)] not connected [11116:0310/140122.300:ERROR:gpu_init.cc(523)] Passthrough is not supported, GL is disabled, ANGLE is
Electron主进程代码(index.js)
const { app, BrowserWindow } = require("electron"); const path = require("path"); const fs = require("fs"); // Handle creating/removing shortcuts on Windows when installing/uninstalling. if (require("electron-squirrel-startup")) { app.quit(); } const createWindow = () => { // Create the browser window. const mainWindow = new BrowserWindow({ //width: 800, //height: 500, icon: __dirname + "/assets/ZB-icon.ico", webPreferences: { //preload: path.join(__dirname, 'preload.js'), contextIsolation: false, nodeIntegration: true, devTools: true, webSecurity: false, backgroundThrottling: false, }, autoHideMenuBar: false, backgroundColor: "#f3f3f3", }); };
解决方案
规范ODBC连接的生命周期
每次刷新重复创建连接容易引发资源冲突,建议使用后主动关闭连接,同时修正连接字符串里的路径转义问题:async function queryOData() { let connection; try { // 路径反斜杠要转义,否则会被当作特殊字符处理 connection = await odbc.connect( `DSN=odbc605;Description=odbc605;UID=odbc605;;APP=Microsoft Office 2013;WSID=ZB585;DATABASE=605;LANGUAGE=Nederlands;StatsLog_On=Yes;StatsLogFile=C:\\Users\\FLORS\\Desktop\\STATS.LOG;` ); const data = await connection.query( "SELECT TOP 100 DT_ItemsTabel.ItemCode, DT_ItemsTabel.Description FROM DT_ItemsTabel" ); alert(data); } catch (err) { console.error("查询出错:", err); } finally { // 无论成功失败,都关闭连接释放资源 if (connection) await connection.close(); } }补全Electron窗口初始化逻辑
当前代码只创建了窗口但未加载页面,也没有处理应用生命周期事件,导致窗口无法正常工作,补充如下:const createWindow = () => { const mainWindow = new BrowserWindow({ icon: __dirname + "/assets/ZB-icon.ico", webPreferences: { contextIsolation: false, nodeIntegration: true, devTools: true, webSecurity: false, backgroundThrottling: false, }, autoHideMenuBar: false, backgroundColor: "#f3f3f3", }); // 加载你的业务页面,假设是同目录下的index.html mainWindow.loadFile(path.join(__dirname, "index.html")); }; // 应用就绪时创建窗口 app.whenReady().then(() => { createWindow(); // macOS下点击dock图标重新创建窗口 app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) createWindow(); }); }); // 所有窗口关闭时退出应用(macOS除外) app.on("window-all-closed", () => { if (process.platform !== "darwin") app.quit(); });解决GPU兼容错误
gpu_init.cc的错误是Windows上Electron常见的GPU兼容问题,禁用硬件加速即可解决:
在BrowserWindow的webPreferences里添加配置:webPreferences: { // 原有配置不变 hardwareAcceleration: false, }或者在app启动前全局禁用:
app.disableHardwareAcceleration();
内容的提问来源于stack exchange,提问作者DeskDoc
相关产品推荐
相关产品推荐

