首页 > 解决方案 > 如何使用visual studio和oracle读取带有特殊字符的excel列名

问题描述

晚安朋友,

我正在将 excel 上传到 oracle,我发现 excel 的某些列在列名中有特殊字符,这些是:

“FECHA/CONV”和“N°CODIGO”

如果我删除特殊字符,它可以正常工作,但我无法编辑 excel 文件,我只需要阅读它,

我该怎么做才能使视觉不会在 mappeo 和对 excel 工作表的选择中产生错误。

我将不胜感激。

我的确切错误是:没有为某些设置的参数设置值。

谢谢,

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim _connString As String = "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.100.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = ORACLE))); User Id=USER; password=PASS;"
        Dim rutacarpeta As String
        Dim NombreArchivo As String
        Dim tablaBBDD As String
        'Dim ot As OracleTransaction = conn.BeginTransaction(IsolationLevel.ReadCommitted)
        Using conn As OracleConnection = New OracleConnection(_connString)
            conn.Open()
            Dim ot As OracleTransaction = conn.BeginTransaction(IsolationLevel.ReadCommitted)
            Try

                rutacarpeta = "C:\2021\"
                NombreArchivo = "FILE_0.xlsx"
                tablaBBDD = "FILE_TEST"
                Dim xlsxConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=1;';"
                xlsxConn = String.Format(xlsxConn, rutacarpeta + NombreArchivo).Trim()

                Using excel_con As OleDbConnection = New OleDbConnection(xlsxConn)
                    excel_con.Open()
                    'Dim hoja As String = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing).Rows(0)()
                    Dim command As OleDbCommand = New OleDbCommand("SELECT FECHA/CONV,CODIGO,ACUERDO FROM [FILE$]", excel_con)

                    Dim dr As OleDbDataReader
                    dr = command.ExecuteReader()

                    Using bulkCopy As OracleBulkCopy = New OracleBulkCopy(conn)
                        bulkCopy.BulkCopyTimeout = 90000
                        bulkCopy.DestinationTableName = tablaBBDD
                    bulkCopy.ColumnMappings.Add(New OracleBulkCopyColumnMapping("FECHA/CONV", "FECHA"))
                    bulkCopy.ColumnMappings.Add(New OracleBulkCopyColumnMapping("N°CODIGO", "CODIGO"))
                    bulkCopy.ColumnMappings.Add(New OracleBulkCopyColumnMapping("ACUERDO", "ACUERDO"))
                        bulkCopy.WriteToServer(dr)
                        ot.Commit()

                        bulkCopy.Close()
                    End Using
                End Using

            Catch ex As Exception
                Try
                    ot.Rollback()
                Catch ex1 As Exception
                    MessageBox.Show(ex1.Message)
                End Try

                MessageBox.Show(ex.Message)

            End Try
        End Using
    End Sub

标签: exceloraclevb.netwinformsoledb

解决方案


当我指出您引用了表名时,您可能会自责,因为它包含一个特殊字符,并且有效..您只是忘记引用列名

SELECT [FECHA/CONV],[CODIGO],[ACUERDO] FROM [FILE$]

他们并不都需要引用,但它不会受到伤害。此外,如果您在设置批量复制列映射时在 oracle 端遇到任何错误,也许可以考虑将 excel 名称别名为更简单的名称,并使用它

SELECT [FECHA/CONV] as A,CODIGO,ACUERDO FROM [FILE$]

...

...Add(New OracleBulkCopyColumnMapping("A", "FECHA"))

推荐阅读