專案需將既有 C# WinForms 程式碼遷移至 VB.NET,過程中遇到三個典型語法與行為差異,記錄備查。
// C# - 正常運作
OracleCommand cmd = new OracleCommand("select count(*) from codeuser", con);
int count = (int)cmd.ExecuteScalar(); // 隱含轉換 object -> int
' VB.NET - 編譯錯誤: Option Strict On 禁止縮小轉換
Dim cmd As New OracleCommand("select count(*) from codeuser", con)
Dim a As Integer = cmd.ExecuteOracleScalar() ' 回傳 OracleNumber
' 錯誤: 從類型 OracleNumber 到 Integer 的轉換無效
' 方案 1: 使用 ExecuteScalar 回傳 object,再轉型 (需 Option Strict Off 或明確轉換)
Dim a As Integer = CInt(cmd.ExecuteScalar())
' 方案 2: 明確轉換 OracleNumber (需引用 Oracle.DataAccess.Types)
Dim oracleNum As OracleNumber = cmd.ExecuteOracleScalar()
Dim a As Integer = oracleNum.ToInt32()
' 方案 3: 直接用 Convert (最通用)
Dim a As Integer = Convert.ToInt32(cmd.ExecuteScalar())
ExecuteScalar() 回傳 object,執行期由使用者轉型。ExecuteOracleScalar() 回傳強型別 OracleNumber,Option Strict On (預設) 禁止隱含縮小轉換。' VB.NET
ComboBox1.DataSource = ds.Tables("codeuser").DefaultView
ComboBox1.DisplayMember = "COLUMN_NAME" ' 必須與資料庫欄位大小寫完全一致 (Oracle 預設大寫)
Oracle 未加雙引號的識別元預設儲存為大寫。DataTable 欄位名稱繼承此特性,VB.NET DisplayMember 比對區分大小寫,C# 則不區分 (視資料提供者而定)。
' 1. 統一轉大寫 (Oracle 慣例)
ComboBox1.DisplayMember = "COLUMN_NAME".ToUpper()
' 2. 或在 SQL 中使用別名控制大小寫
"select column_name as ColumnName from codeuser"
ComboBox1.DisplayMember = "ColumnName"
| C# | VB.NET | 備註 |
|---|---|---|
using | Imports | 命名空間匯入 |
namespace | Namespace | |
class | Class | |
static | Shared | 靜態/共用成員 |
readonly | ReadOnly | |
const | Const | |
property | Property | VB 需 Get/Set 區塊 |
event | Event | VB 需 AddHandler/RemoveHandler 或 RaiseEvent |
delegate | Delegate | |
lock | SyncLock | |
using (IDisposable) | Using ... End Using | 資源釋放區塊 |
null | Nothing | |
this | Me | |
base | MyBase |