我正在与excel建立连接,当我尝试使用0后面的ID时出现问题...
我正在使用ListBox
并将excel工作表中的ID添加为项目。 ID有9个数字,如“123456789”或“098765430”。因此,我删除最后4个字符以搜索具有相同5个数字的ID,并添加另一个ListBox
。它工作正常,除了后面有0(零)的代码。
Dim ConnectionString As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\Tabela_Precos.xlsx; Extended Properties=Excel 12.0;")
ConnectionString.Open()
Dim ds As New DataSet
Dim dt As New DataTable
ds.Tables.Add(dt)
Dim da
For i = 0 To Form1.ListBox1.Items.Count - 1
Dim str As String = Compras.ListBox1.Items(i).ToString
Dim prod As String = str.Remove(str.Length - 4)
da = New OleDbDataAdapter("SELECT * FROM [Sheet1$] WHERE ID like '%" & prod & "%'", ConnectionString)
ListBox1.Items.Add(dt.Rows(i).Item(0))
Next
答案 0 :(得分:1)
您的Excel文件将 ID 列作为整数值输入,但格式化为左零填充以呈现为九个字符的字段。您的Excel数据库连接正在将值读取为数字(类型为Double,偶数 - 尽管它们是整数)。您的原始select语句将 ID 隐式转换为Like
比较的字符串;但是,此转换现在不需要左零填充。要使用此类比较,您需要自己格式化 ID 。
Select * From [sheet1$] Where (Format([ID], ""000000000"") Like '" & prod & "%')"
正如您在上面的评论中指出的那样,这是有效的。但是,就速度而言,它并不是最有效的。由于 ID 是数字,因此进行数值比较应该更快。您已经定义了名为String
的{{1}}变量,以下解决方案使用该变量来准备数值,以便根据您的条件构建备用选择。
prod
然后Dim prodNum As Int32 = Int32.Parse(prod) * 10000I
语句将成为:
Select
这些示例使用连接的select语句,理想情况下,您不会这样做,而是使用带有替换值的参数化语句。我将这项练习留给你演出。