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

SQL Server BULK INSERT 在 MyEclipse 中路徑錯誤解決:雙反斜線與字串跳脫完整指南

     編輯:程式設計綜合問答

問題現象

在 SSMS 中直接執行 BULK INSERT Book FROM 'e:\2.txt' ... 成功,但在 MyEclipse (Java/JDBC) 中執行相同 SQL 拋出錯誤:
無法開啟檔案 "e:\2.txt",作業系統錯誤碼 123 (檔名、目錄名或磁碟區標籤語法不正確)

根本原因分析

Java 字串字面值中 \ 為跳脫字元。'e:\2.txt' 中的 \2 被解析為八進位跳脫序列(或無效跳脫),導致實際傳送給 SQL Server 的路徑字串錯誤。

三種解決方案

方案一:雙反斜線跳脫(最常用)

String sql = "BULK INSERT Book FROM 'e:\\\\2.txt' WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";

原理:Java 編譯器將 \\\\ 解析為單一反斜線字元,SQL Server 接收到正確的 e:\2.txt。

方案二:正斜線路徑(跨平台相容)

String sql = "BULK INSERT Book FROM 'e:/2.txt' WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";

優點:Windows/Linux 皆可識別,避免跳脫問題。SQL Server 2008+ 完整支援正斜線路徑。

方案三:參數化查詢(最佳實務)

String sql = "BULK INSERT Book FROM ? WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setString(1, "e:/2.txt");  // 或 "e:\\2.txt"
    pstmt.executeUpdate();
}

優勢:完全避免字串拼接錯誤、防止 SQL 注入、程式碼可讀性佳。

進階注意事項

  1. 檔案存取權限:SQL Server 服務帳號必須具備檔案所在目錄的讀取權限
  2. 相對路徑風險:路徑相對於 SQL Server 服務啟動目錄,非應用程式工作目錄
  3. UNC 路徑支援:建議使用 '\\\\Server\\Share\\2.txt' 替代本機磁碟機代號
  4. ROWTERMINATOR 設定:Windows 換行用 \\n 或 \\r\\n,需與檔案實際格式一致

完整範例程式碼

public void bulkInsertData(Connection conn, String filePath) throws SQLException {
    // 統一使用正斜線
    String normalizedPath = filePath.replace("\\", "/");
    
    String sql = "BULK INSERT Book FROM ? WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\\n')";
    
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        pstmt.setString(1, normalizedPath);
        int rows = pstmt.executeUpdate();
        System.out.println("匯入完成,影響列數: " + rows);
    }
}

總結

Java 中執行 BULK INSERT 路徑錯誤的核心在於字串跳脫處理。建議採用正斜線路徑搭配 PreparedStatement,同時確保 SQL Server 服務帳號具備檔案存取權限,即可徹底解決跨環境執行差異問題。

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