【问题标题】:Add leading zeros in an OLEDB Command Statement在 OLEDB 命令语句中添加前导零
【发布时间】:2014-03-27 16:56:26
【问题描述】:

我正在尝试将前导零添加到我的数据集中只有 5 个字符的主键。我们的主键是 6 个字符,前导零正在从我收到的 Excel 文件中截断。我想在下面的命令语句中添加前导零,但它无法识别“CONVERT”函数。我还是新手,不知道要使用类似的功能。非常感谢您的帮助。

("SELECT (SELECT RIGHT('000000'+CONVERT(VARCHAR,[Primary #]),6)) AS [Primary #],[Gourmet #],[Unit],FROM [" + sheetName + "]", con)

完整代码如下

Dim sqlCon As New SqlConnection("Server=MyServer;Database=MyDatabase;User Id=xxx;Password=xxxxxx")
        sqlCon.Open()


        Dim excelCmd2 As New System.Data.OleDb.OleDbCommand("SELECT (SELECT RIGHT('000000'+CONVERT(VARCHAR,[Primary #]),6)) AS [Primary #],[Gourmet #],[Unit] FROM [" + sheetName + "]", con)
        Dim excelRead As New System.Data.OleDb.OleDbDataAdapter()
        Dim dt2 As New DataTable()
        excelRead.SelectCommand = excelCmd2
        excelRead.MissingSchemaAction = MissingSchemaAction.AddWithKey
        excelRead.Fill(dt2)
        DataGridView1.AutoGenerateColumns = True
        DataGridView1.DataSource = dt2
        DataGridView1.Refresh()

Datagridview 允许我查看 Datatable 中的内容,以确保出现这些额外的零。之后,我的 excelCmd2 中的数据集在我的 sql 表中的所有列都具有相同的参数,如下所示:

Using dataRead As System.Data.OleDb.OleDbDataReader = excelCmd2.ExecuteReader()
                If dataRead.HasRows() Then
                    While dataRead.Read()
                        Dim sqlCmd As New SqlCommand
                        sqlCmd.Connection = sqlCon
                        sqlCmd.CommandType = CommandType.Text
                        sqlCmd.CommandText = sqlUpdate

                        sqlCmd.Parameters.Add("@primary", SqlDbType.VarChar).Value = Convert.ToString(dataRead.Item("Primary #"))
                        sqlCmd.Parameters.Add("@spc", SqlDbType.VarChar).Value = Convert.ToString(dataRead.Item("Gourmet #"))
                        sqlCmd.Parameters.Add("@unit", SqlDbType.VarChar).Value = Convert.ToString(dataRead.Item("Unit"))
                        sqlCmd.ExecuteScalar()
                    End While
                End If
            End Using

【问题讨论】:

  • 数据库中[Primary #]列的类型是什么?什么是数据库程序?主键真的必须是六个字符吗?
  • [Primary #] 来自 Excel 文件,它是文本或数字格式,具体取决于文件(发件人不一致)。我会将它作为 varchar(6) 上传到我的 SQL 数据库中。
  • 我建议按原样读取值,然后使用Cstr(primaryId).PadLeft(6, "0"c) 将其转换为字符串,然后再将其插入数据库。 DataGridView 是必需的吗? - 如果不是,那只会使事情复杂化。
  • Datagridview 允许我查看 Datatable 中的内容,以确保出现这些额外的零。之后,我的 excelCmd2 中的数据集在我的 sql 表中的所有列都具有相同的参数,如上所示。

标签: vb.net select oledbcommand


【解决方案1】:

虽然它不能让您看到添加的前导零,但您可以更改行

sqlCmd.Parameters.Add("@primary", SqlDbType.VarChar).Value = Convert.ToString(dataRead.Item("Primary #")

sqlCmd.Parameters.Add("@primary", SqlDbType.VarChar).Value = Convert.ToString(dataRead.Item("Primary #").PadLeft(6, "0"c)

添加所需的前导零,这意味着您的 SELECT 命令被简化为

"SELECT [Primary #], [Gourmet #], [Unit] FROM [" & sheetName & "]"

(VB.NET中的字符串连接运算符是&,而不是+。)

【讨论】:

  • 我从FROM 之前删除了一个虚假逗号,以防您的实际代码中出现。
  • 您在我的代码的参数添加部分中的修复效果非常好。我不明白 {&} 和 {+} 的区别,因为我从未遇到过使用 {+} 连接字符串的问题。我将对此进行更多研究。谢谢朋友!
【解决方案2】:

使用 Padleft 添加前导零。

primaryId.padleft(6, "0")

或者如果它还没有格式化为字符串

 primaryid.tostring.padleft(6, "0")

由于您想在命令文本中使用填充版本,您可能需要创建一个临时字符串变量来保存新值,以提高代码的可读性。

【讨论】:

  • 我不确定如何在我的代码中使用它。我在数据集中的列名是 [Primary #]。我将如何在我的选择命令中或通过您描述的方式填充列名 [Primary #] 下的所有内容?
  • 您将像往常一样从 Excel 文件中读取您的 5 位数字,无需转换。然后,当您执行 INSERT 语句时,您将插入值 "primaryId.padleft(6, "0")"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2016-10-27
  • 2021-11-26
相关资源
最近更新 更多