vb.net oledb-Access 數據庫本身不支持命名參數,賦值必須和參數順序一致才行

參數順序問題:OleDb 通常依賴參數添加的順序而非名稱,為什么順序要一樣?

OleDbParameter 順序依賴性的原因

OleDb 數據提供程序依賴參數添加順序而非名稱,這是由 OLE DB 規范和 Access 數據庫的工作機制共同決定的。理解這個問題需要從數據庫底層通信機制說起。

1. SQL 參數化查詢的兩種實現方式

(1)基于名稱的參數化(如 SQL Server)
-- SQL Server 支持命名參數
SELECT * FROM Users WHERE Username = @Username AND Age > @MinAge

在這種模式下,參數順序不重要,只要名稱匹配即可。

(2)基于位置的參數化(如 OleDb)
-- OleDb 使用問號占位符(實際執行時的形式)
SELECT * FROM Users WHERE Username = ? AND Age > ?

OleDb 將參數按添加順序綁定到問號占位符,參數名稱僅用于代碼可讀性,不影響實際綁定。

2. Access 數據庫的限制

Access 數據庫(通過 OleDb 提供程序訪問)不支持命名參數,僅支持位置參數。當您編寫:

UPDATE [02Excel題庫] SET [下載狀態]=@狀態, [下載出錯]=@err WHERE id=@id

OleDb 提供程序會將其轉換為:sql

UPDATE [02Excel題庫] SET [下載狀態]=?, [下載出錯]=? WHERE id=?

此時,參數必須按以下順序添加:

  1. @狀態(對應第一個問號)
  2. @err(對應第二個問號)
  3. @id(對應第三個問號)

3. 為什么您的代碼可能出現問題

您的原始代碼參數添加順序是:

cmd.Parameters.Add(paramErr)   ' @err (第二個問號)
cmd.Parameters.Add(paramId)    ' @id (第三個問號)
cmd.Parameters.Add(狀態)       ' @狀態 (第一個問號)

這會導致參數與 SQL 語句中的占位符錯位:

  • @err?值被綁定到?[下載狀態]
  • @id?值被綁定到?[下載出錯]
  • @狀態?值被綁定到?id

這就解釋了為什么狀態.Value = -1沒有生效 —— 它被錯誤地綁定到了id字段!

4. 正確的參數添加順序

必須與 SQL 語句中參數出現的順序一致:

' 1. 添加@狀態 (對應SET [下載狀態]=?)
cmd.Parameters.Add("@狀態", OleDbType.Integer).Value = If(String.IsNullOrWhiteSpace(ErrUrlList), 0, -1)' 2. 添加@err (對應SET [下載出錯]=?)
cmd.Parameters.Add("@err", OleDbType.LongVarWChar, -1).Value = ErrUrlList' 3. 添加@id (對應WHERE id=?)
cmd.Parameters.Add("@id", OleDbType.Integer).Value = task.DbId

5. 最佳實踐建議

(1)始終按 SQL 中參數出現的順序添加參數
-- SQL: SET [下載狀態]=@狀態, [下載出錯]=@err WHERE id=@id
-- 參數順序必須是: @狀態 → @err → @id
(2)使用更安全的參數添加方式
' 鏈式添加參數,確保順序正確
cmd.Parameters.AddWithValue("@狀態", If(String.IsNullOrWhiteSpace(ErrUrlList), 0, -1))
cmd.Parameters.AddWithValue("@err", ErrUrlList)
cmd.Parameters.AddWithValue("@id", task.DbId)
(3)考慮使用其他數據提供程序

如果需要命名參數支持,可以考慮:

  • SQL Server(支持命名參數)
  • SQLite(使用 SQLiteDataProvider,支持命名參數)
  • Entity Framework(抽象掉底層參數細節)

總結

OleDb 依賴參數順序而非名稱,是因為 Access 數據庫本身不支持命名參數。當使用 OleDb 操作 Access 時,必須確保參數添加順序與 SQL 語句中占位符的出現順序一致,否則會導致參數值綁定錯誤。這是您的代碼中狀態.Value = -1未能正確寫入的根本原因。

Using trans = conn.BeginTransaction()TryFor Each task In SaveDbTasksDim sql = "UPDATE [02Excel題庫] SET [下載狀態]=@狀態, [下載出錯]=@err WHERE id=@id"Using cmd As New OleDbCommand(sql, conn, trans)Dim ErrUrlList As String = String.Join(vbCrLf, task.ErrUrlList)' 添加參數(注意順序必須與SQL中參數出現的順序一致)cmd.Parameters.Add("@狀態", OleDbType.Integer).Value = If(String.IsNullOrWhiteSpace(ErrUrlList), 0, -1)cmd.Parameters.Add("@err", OleDbType.LongVarWChar, -1).Value = ErrUrlListcmd.Parameters.Add("@id", OleDbType.Integer).Value = task.DbId' 調試輸出(實際使用時可移除或改為日志記錄)Console.WriteLine($"執行更新 - ID: {task.DbId}, 狀態: {If(String.IsNullOrWhiteSpace(ErrUrlList), 0, -1)}, 錯誤: {ErrUrlList}")Dim rowsAffected = cmd.ExecuteNonQuery()' 驗證更新是否成功If rowsAffected = 0 ThenLogger.LogError($"更新失敗: ID={task.DbId}, ErrUrlList={ErrUrlList}", "DatabaseUpdate")End IfEnd UsingNexttrans.Commit()Logger.LogError($"批量更新成功: {SaveDbTasks.Count} 條記錄", "DatabaseUpdate")Catch ex As Exception' 發生異常時回滾事務trans.Rollback()Logger.LogError($"批量更新失敗: {ex.Message}", "DatabaseUpdate")Throw ' 重新拋出異常以便上層處理End Try
End Using ' 事務會在這里自動釋放

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82333.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Syslog 全面介紹及在 C 語言中的應用

Syslog 概述 Syslog 是一種工業標準的日志記錄協議,用于在網絡設備之間傳遞日志消息。它最早由 Eric Allman 在 1980 年代為 BSD Unix 開發,現在已成為系統和網絡管理的重要組成部分。Syslog 協議允許設備將事件消息發送到中央服務器(稱為 sy…

HackMyVM-Art

信息搜集 主機發現 ┌──(kali?kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-31 03:00 EDT Nmap scan report for 192.168.43.1 Host is up (0.0047s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan rep…

[paddle]paddle2onnx無法轉換Paddle3.0.0的json格式paddle inference模型

使用PDX 3.0rc1 訓練時序缺陷檢測后導出的模型無法轉換 Informations (please complete the following information): Inference engine for deployment: PD INFERENCE 3.0-->onnxruntime Why convert to onnx:在端側設備上部署 Paddle2ONNX Version: 1.3.1 解…

DOCKER使用記錄

1、拉取鏡像 直接使用docker pull <image>&#xff0c;大概率會出現下面的報錯信息&#xff1a; (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …

Java實習面試題

一、理想汽車一面 1、總結你這個人擅長什么&#xff0c;你的優勢是什么&#xff1f; 2、挑一個項目詳細講講&#xff0c;重點講下你怎么設計的&#xff0c;你的思路是什么&#xff0c;你做的過程中遇到什么難點&#xff0c;怎么克服這些難點&#xff1f; 3、使用RabbitMQ處理…

單元測試報錯

報錯信息如下所示&#xff1a; 五月 30, 2025 5:35:44 下午 org.junit.vintage.engine.descriptor.RunnerTestDescriptor warnAboutUnfilterableRunner 警告: Runner org.junit.internal.runners.ErrorReportingRunner (used on class redis.demo.RedisTemplateTest) does not…

00 QEMU源碼分析中文注釋與架構講解(v8.2.4版本)

QEMU-v8.2.4源碼中文注釋與架構講解 文檔會不定期更新 注釋作者將狼才鯨創建日期2025-05-30更新日期2025-06-02 CSDN閱讀地址&#xff1a;QEMU源碼中文注釋與架構講解Gitee源碼倉庫地址&#xff1a;才鯨嵌入式/qemu 一、前言 其它參考教程的網址&#xff1a; QEMU 源碼目錄…

線段樹刷題記錄

一篇講解很好的線段樹博客&#xff1a;數據結構--線段樹篇_數據結構線段樹-CSDN博客 一、區間查詢 無修改&#xff1a; &#xff08;一&#xff09;最值問題&#xff1a; 1.P1816 忠誠 - 洛谷 思路&#xff1a; 模板。 注意&#xff1a; 無。 代碼&#xff1a; #include …

從一到無窮大 #46:探討時序數據庫Deduplicate與Compaction的設計權衡

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 引言Compaction AlgorithmsCompact Execution Flow Based On VeloxLocalMergeSource的…

大廠前端研發崗位設計的30道Webpack面試題及解析

文章目錄 一、基礎核心二、配置進階三、性能優化四、Loader原理五、Plugin機制六、高級應用七、工程化實戰八、原理深挖九、異常處理十、綜合場景一、基礎核心 Webpack的核心概念是什么? 解析:入口(entry)、輸出(output)、加載器(loader)、插件(plugins)、模式(mode)。Loader…

pytest 常用命令參數

以下是 pytest 常用命令參數 的整理&#xff0c;涵蓋測試運行、過濾、調試、報告等常見場景&#xff0c;方便你高效使用 pytest&#xff1a; 1. 基本測試運行 命令說明pytest運行當前目錄及子目錄下所有測試&#xff08;test_*.py 或 *_test.py&#xff09;pytest path/to/tes…

利用openwrt路由器和隨身WIFI搭建CPE

背景&#xff1a; 最近5GCPE挺火&#xff0c;各種硬件層出不窮&#xff0c;包括DY上很多商家在推的AX3000疊加展銳RM500 5G模塊&#xff0c;自己組裝CPE&#xff0c;成本也在300 看了下開源硬件&#xff0c;其實就是一個開源的openwrt系統&#xff0c;硬件上5G模塊通過usb協議…

Python中使用pandas

使用Pandas進行數據處理和分析 Pandas是Python中最流行的數據處理和分析庫之一。下面我將介紹Pandas的基本使用方法。 安裝Pandas pip install pandas 基本數據結構 1. Series - 一維數組 import pandas as pd# 創建Series s pd.Series([1, 3, 5, 7, 9]) print(s) 2. D…

ISO18436-2 CATII級振動分析師能力矩陣

ISO18436-2021是當前針對針對分析師的一個標準&#xff0c;它對振動分析師的能力和知識體系做了4級分類&#xff0c;這里給出的是一家公司響應ISO18436的CATII級標準&#xff0c;做的一個專題培訓的教學大綱。摘自&#xff1a; 【振動噪音產學技術聯盟】04/19-23 ISO 18436-2…

Qt實現的水波進度條和溫度進度條

一.效果 二.原理 1.水波 要模擬波浪,就要首先畫出一條波浪線,正弦余弦曲線就很適合。 y=A*sin(ω*x+φ)+k y=A*cos(ω*x+φ)+k 這是正弦余弦曲線的公式,要想實現水波效果,那需要兩條曲線,一條曲線的波峰對著另外一條曲線的波谷,要實現這樣的曲線效果,只有讓正弦曲線前移…

《Python 應用中的藍綠部署與滾動更新:持續集成中的實踐與優化》

《Python 應用中的藍綠部署與滾動更新:持續集成中的實踐與優化》 引言 在現代軟件開發中,持續集成與持續部署(CI/CD)已成為標準實踐。面對頻繁發布與升級需求,藍綠部署和滾動更新兩種策略為 Python 應用提供了穩定、安全的發布方式。本文將深入探討這兩種策略的原理、適…

4.2.2 Spark SQL 默認數據源

在本實戰概述中&#xff0c;我們探討了如何在 Spark SQL 中使用 Parquet 格式作為默認數據源。首先&#xff0c;我們了解了 Parquet 文件的存儲特性&#xff0c;包括其二進制存儲方式和內嵌的 Schema 信息。接著&#xff0c;通過一系列命令&#xff0c;我們演示了如何在 HDFS 上…

當前用戶的Git本地配置情況:git config --local --list

通過config命令可以查詢當前用戶的本地配置情況。這些配置項定義了 Git 在當前倉庫中的行為&#xff0c;包括文件權限處理、符號鏈接處理以及大小寫敏感性等。 git config --local --list core.repositoryformatversion0 指定 Git 倉庫的格式版本。版本 0 是最初的格式。 cor…

Flutter 包依賴升級指南:讓項目保持最新狀態

在 Flutter 開發過程中&#xff0c;依賴項管理是確保項目順利運行和持續優化的關鍵環節。依賴項是項目中不可或缺的外部庫&#xff0c;它們提供了各種功能&#xff0c;從 UI 組件到數據處理工具&#xff0c;幫助開發者快速構建應用。然而&#xff0c;隨著時間的推移&#xff0c…

【深度學習】實驗四 卷積神經網絡CNN

實驗四 卷積神經網絡CNN 一、實驗學時&#xff1a; 2學時 二、實驗目的 掌握卷積神經網絡CNN的基本結構&#xff1b;掌握數據預處理、模型構建、訓練與調參&#xff1b;探索CNN在MNIST數據集中的性能表現&#xff1b; 三、實驗內容 實現深度神經網絡CNN。 四、主要實驗步…