【问题标题】:Values being passed as strings and not integers值作为字符串而不是整数传递
【发布时间】:2014-04-28 13:23:16
【问题描述】:

我正在尝试将一系列值作为字符串收集,然后将它们插入 SQL 服务器 dB。我只使用“VarChar”就可以正常工作,但是当我尝试加载包含数字的列时失败。

它不断抛出以下关于从字符串转换为整数的错误。

“将参数值从 String 转换为 Int32 失败。”

请有人帮助我正确的语法。

以下是我的代码的副本:

    Dim table As New DataTable()

    table.Columns.Add("CallType")
    table.Columns.Add("ChargeCode")
    table.Columns.Add("Destination")
    table.Columns.Add("TariffUsed")
    table.Columns.Add("Peak")
    table.Columns.Add("OffPeak")
    table.Columns.Add("Weekend")
    table.Columns.Add("Setup")
    table.Columns.Add("Minimum Charge")
    table.Columns.Add("Charge Cap")
    table.Columns.Add("Initial Units")
    table.Columns.Add("Initial Charge")
    table.Columns.Add("Initial Peak")
    table.Columns.Add("Initial Off Peak")
    table.Columns.Add("Initial Weekend")
    table.Columns.Add("Billing Unit")
    table.Columns.Add("Minimum Units")
    table.Columns.Add(" RateType")

    'open file dialog and store filename
    Dim openFileDialog1 As New OpenFileDialog
    Dim strFileName As String

    openFileDialog1.InitialDirectory = "C:\Users\Barry\Documents\Indigo Billing dB\Daisy Call Rates"
    openFileDialog1.Filter = "CSV files (*.csv)|*.csv"
    openFileDialog1.FilterIndex = 2
    openFileDialog1.RestoreDirectory = True

    If openFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

    End If
    strFileName = openFileDialog1.SafeFileName
    If strFileName <> "" Then

        'TextField Parser is used to read the files 
        Dim parser As New FileIO.TextFieldParser(openFileDialog1.FileName)

        MessageBox.Show("New Rate Card Loaded...", "Indigo Billing", _
        MessageBoxButtons.OK, MessageBoxIcon.Information)

        parser.Delimiters = New String() {","} ' fields are separated by comma
        parser.HasFieldsEnclosedInQuotes = True ' each of the values is enclosed with double quotes
        parser.TrimWhiteSpace = True

        '--First line is skipped , its the header
        parser.ReadLine()

        '-- Add all the rows to datatable
        Do Until parser.EndOfData = True
            table.Rows.Add(parser.ReadFields())
        Loop

        '--Create SQL query
        Dim strSql As String = "INSERT INTO DaisyRatesImport (CallType,ChargeCode,Destination,TariffUsed,Peak,OffPeak,Weekend,Setup,Minimum Charge,Charge Cap,Initial Units,Initial Charge,Initial Peak,Initial Off Peak,Initial Weekend,Billing Unit,Minimum Units, RateType) VALUES (@CallType,@ChargeCode,@Destination,@TariffUsed,@Peak,@OffPeak,@Weekend,@Setup,@Minimum Charge,@Charge Cap,@Initial Units,@Initial Charge,@Initial Peak,@Initial Off Peak,@Initial Weekend,@Billing Unit,@Minimum Units, @RateType)"
        Dim SqlconnectionString As String = "server=barry-laptop\SQLEXPRESS; database=Test; integrated security=yes"
        Using connection As New SqlClient.SqlConnection(SqlconnectionString)

            Dim cmd As New SqlClient.SqlCommand(strSql, connection) ' create command objects and add parameters
            With cmd.Parameters

                .Add("@CallType", SqlDbType.VarChar, 30, "CallType")
                .Add("@ChargeCode", SqlDbType.VarChar, 30, "ChargeCode")
                .Add("@Destination", SqlDbType.VarChar, 30, "Destination")
                .Add("@TariffUsed", SqlDbType.VarChar, 30, "TariffUsed")
                .Add("@Peak", SqlDbType.Int, 5, "Peak")
                .Add("@OffPeak", SqlDbType.Int, 5, "OffPeak")
                .Add("@Weekend", SqlDbType.Int, 5, "Weekend")
                .Add("@Setup", SqlDbType.Int, 5, "Setup")
                .Add("@Minimum Charge", SqlDbType.Int, 5, "Minimum Charge")
                .Add("@Charge Cap", SqlDbType.Int, 5, "Charge Cap")
                .Add("@Initial Units", SqlDbType.Int, 5, "Initial Units")
                .Add("@Initial Charge", SqlDbType.Int, 5, "Initial Charge")
                .Add("@Initial Peak", SqlDbType.Int, 5, "Initial Peak")
                .Add("@Initial Off Peak", SqlDbType.Int, 5, "Initial Off Peak")
                .Add("@Initial Weekend", SqlDbType.Int, 5, "Initial Weekend")
                .Add("@Billing Unit", SqlDbType.Int, 5, "Billing Unit")
                .Add("@Minimum Units", SqlDbType.Int, 5, "Minimum Units")
                .Add("@ RateType", SqlDbType.VarChar, 30, " RateType")

            End With

            Dim adapter As New SqlClient.SqlDataAdapter()
            adapter.InsertCommand = cmd

            '--Update the original SQL table from the datatable
            Dim iRowsInserted As Int32 = _
                adapter.Update(table)

        End Using
    Else
        MessageBox.Show("No File Selected", "Indigo Billing", _
    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    End If

    'displayes file name in Textbox1
    TextBox1.Text = strFileName

End Sub

我在这里进行了搜索,并认为我可能需要转换它们,但我不确定我将它们转换为什么或从什么转换。

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: sql-server vb.net visual-studio-2010


    【解决方案1】:

    尝试使用数据类型标记您的列

    table.Columns.Add("CallType", GetType(Integer))
    table.Columns.Add("ChargeCode", GetType(Integer))
    table.Columns.Add("Destination", GetType(string))
    table.Columns.Add("TariffUsed", GetType(string))
    

    我只是随机标记了它们。这对您有用,因为 Column 将具有特定的数据类型并解决您的转换问题。

    【讨论】:

    • typeof 是 C#。 VB.Net 是 GetType
    • 使用 table.Columns.Add("CallType",GetType(Integer)) 答案是使用 C# 代码。 int 在 VB 中不是(使用 Integer 或 Int32)和 typeof 在 VB 中的工作方式不同
    • 感谢@onskee。您需要先解析您的值,然后再将它们添加到表中,请访问stackoverflow.com/questions/19153907/…
    • 我添加了 GetType 语法,它现在告诉我“类型 'int' 未定义。”需要在哪里/如何定义?谢谢
    • 'int' 在 VB.NET 中什么都不是,请立即使用 Integer 作为更正的答案。
    【解决方案2】:

    SQL 命令的参数值包含两个词:@Minimum Charge,@Charge Cap,@Initial Units 你不能那样做。改为这样做:@MinimumCharge,@ChargeCap,@InitialUnits

    【讨论】:

    • 谢谢,我会确保删除空格:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多