插入数据库时发生内部异常错误VB.Net

插入数据库时发生内部异常错误VB.Net,vb.net,Vb.net,我正在尝试将数据插入sql server数据库,我这周才开始使用VB,所以我对它非常陌生 以下是我的表格定义: [betfair_place_bsp]( [bf_runner_id] [int] NOT NULL, [bf_event_id] [varchar](12) NOT NULL, [name] [varchar](255) NOT NULL, [win] [int] NOT NULL, [bsp_place] [decimal](6, 2) NO

我正在尝试将数据插入sql server数据库,我这周才开始使用VB,所以我对它非常陌生

以下是我的表格定义:

[betfair_place_bsp](
    [bf_runner_id] [int] NOT NULL,
    [bf_event_id] [varchar](12) NOT NULL,
    [name] [varchar](255) NOT NULL,
    [win] [int] NOT NULL,
    [bsp_place] [decimal](6, 2) NOT NULL,
    [ppwap] [decimal](6, 2) NOT NULL,
    [early_traded] [numeric](18, 0) NOT NULL,
    [pre_traded] [numeric](18, 0) NOT NULL,
    [meeting_date] [date] NOT NULL,
    [scheduled_time] [datetime] NOT NULL,
    [country] [varchar](50) NOT NULL]
我读取数据,然后按列将其拆分

line = reader.ReadLine
Dim colsArray() As String = Split(line, ",")
我更改了一些列的格式

Dim meetingDate As String = Split(colsArray(3), " ")(0)
Dim scheduledTime As String = colsArray(3) + ":00"

Dim winLose As Integer = colsArray(6)
Dim backPrice As Decimal = Math.Round(Convert.ToDecimal(colsArray(7)), 2)
Dim weightedPrice As Decimal = Math.Round(Convert.ToDecimal(colsArray(8)), 2)
Dim earlyTraded As Decimal = Math.Round(Convert.ToDecimal(colsArray(14)), 0)
Dim preTraded As Decimal = Math.Round(Convert.ToDecimal(colsArray(15)), 0)
然后创建插入字符串

cmd.CommandText = "insert into betfair_place_bsp values(" + colsArray(4) + "," + "1." + colsArray(0) + ",'" + colsArray(5) + "'," + winLose  _
                    + ",'" + backPrice + "'," + weightedPrice + "," + earlyTraded + "," + preTraded + "," + meetingDate + ",'" + scheduledTime + "' + 'UK')"
当我尝试调整上述行时,会出现以下错误:

System.InvalidCastException: 'Conversion from string "insert into betfair_place_bsp va" to type 'Double' is not valid.'
FormatException: Input string was not in a correct format.

我没有任何“Double”类型的东西。

根据上面给出的建议,我使用了参数,而不是串接字符串

Dim newDataInsert As New betfair_data() With {.bf_event_id = "1." & colsArray(0), .bf_runner_id = colsArray(4), .name = colsArray(5), .bsp_place = colsArray(7),
                    .ppwap = colsArray(8), .early_traded = colsArray(14), .pre_traded = colsArray(15), .meeting_date = meetingDate, .scheduled_time = scheduledTime, .country = "UK", .win = colsArray(6)
                    }

                db.InsertRow(newDataInsert)

使用参数可避免sql注入和格式错误。当在字符串中串联数值(带小数)时,编译器将插入该数值的ToString调用结果。此转换受区域设置的影响,可能会导致逗号用作小数点。这将导致数据库的数值无效。日期也有类似的问题。如果您仍然不相信串接字符串对SQL非常有害,那么您应该看看什么是SQL注入黑客,然后尽快开始使用参数化查询。串接SQL非常容易出错。即使忽略整个sql注入问题,作为开发人员,使用参数也可以减轻整个过程的痛苦,而且不必使用加法运算符(+)连接字符串。使用串联运算符(&)。如果两个操作数都是类型
String
,则效果相同。如果不是,则系统必须决定转换哪个操作数以及使用哪个加法运算符。显然,您正在添加一个
字符串
和一个数字,系统选择将
字符串
转换为一个数字并执行算术加法,但转换失败。如果使用正确的运算符,则只能产生串联。也就是说,无论如何不要使用字符串连接来构建SQL代码。