Имам приложение за Windows form, което приема CSV/Excel файлове, позволява на потребителите да ги импортират в SQL DB.
Наскоро имах странен бъг, при който потребителите качват CSV файл и той съкращава текста в колона.
Ето изходния файл:
Ето DatagridView в моето приложение, показващ същите данни, след като се преобразува в таблица с данни:
Забележете, че някои стойности са напълно празни и маркирани в червено, докато други изглеждат съкратени. Това обаче се случва само с CSV файлове, не и с excel. Това ме кара да вярвам, че може да е проблем с драйвера.
Ето кода, който преобразува данните от плоския файл в таблица с данни:
Private Function ConvertCSVToDataTable(ByVal path As String) As DataTable
Using con As OleDb.OleDbConnection = New OleDb.OleDbConnection()
Try
If System.IO.Path.GetExtension(path) = ".csv" Then
con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Text;HDR=YES;FMT=Delimited""", "Microsoft.Jet.OLEDB.4.0", IO.Path.GetDirectoryName(path))
Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM [" & IO.Path.GetFileName(path) & "]", con)
Using da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(cmd)
con.Open()
da.Fill(dt)
con.Close()
End Using
End Using
ElseIf System.IO.Path.GetExtension(path) = ".xlsx" Then
con.ConnectionString = String.Format("Provider={0};Data Source={1};Extended Properties=""Excel 12.0 Xml;HDR=Yes;IMEX=1""", "Microsoft.ACE.OLEDB.12.0", path)
con.Open()
Dim dbSchema As DataTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
Dim firstSheetname As String = dbSchema.Rows(0)("TABLE_NAME").ToString
Using cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT * FROM [" & firstSheetname & "]", con)
Using da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(cmd)
'con.Open()
da.Fill(dt)
con.Close()
End Using
End Using
End If
Catch ex As Exception
MessageBox.Show(ex.ToString(), "Conversion Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
Finally
If con IsNot Nothing AndAlso con.State = ConnectionState.Open Then
con.Close()
End If
End Try
End Using
Return dt
End Function
Някаква идея на какво се дължи това? Трябва също да отбележа, че някои от моите потребители могат да импортират само CSV, а не Excel. Разбрах, че потребителите с 32-битов драйвер за достъп могат да импортират excel файлове, докато 64-битовите потребители не могат. Накарах ги да изтеглят драйвера тук:
https://www.microsoft.com/en-us/download/details.aspx?id=23734
Сега тези потребители могат да импортират Excel, но все още имат проблем с съкращаването на низовете. Което ме кара да вярвам, че все още може да е проблем с драйвера.
Данни от теста:
Sales Order #
US00123
US00123
US00123
SG0000123
SG0000123
S00123
S00123
S00123
S00123
S00123