【问题标题】:Insert boolean datatype data from datagridview into SQL Server database将布尔数据类型数据从 datagridview 插入 SQL Server 数据库
【发布时间】:2019-12-17 06:19:04
【问题描述】:

如何将布尔类型数据从 datagridview 插入 SQL Server?当我取消选中datagridview中的复选框并插入数据时:

从 DBNull 类型到 String 类型的错误转换无效。

Dim index As Integer
Dim selectedRow = Quantum_GR.DataGridView1.Rows(index)

Try
    For I = 0 To Quantum_GR.DataGridView1.Rows.Count - 2
        'Dim GRNo As String
        Dim StockCode As String = Quantum_GR.DataGridView1.Rows(I).Cells("STKID").Value
        Dim StockName As String = Quantum_GR.DataGridView1.Rows(I).Cells("STKNAME").Value
        Dim GRQuantity As Double = Quantum_GR.DataGridView1.Rows(I).Cells("GRQTY").Value
        Dim StockCost As Double = Quantum_GR.DataGridView1.Rows(I).Cells("COST").Value
        Dim BatchControl As Boolean = Quantum_GR.DataGridView1.Rows(I).Cells("BATCHCTR").Value
        Dim StockBatchID As String = Quantum_GR.DataGridView1.Rows(I).Cells("BATCHID").Value
        Dim StockExpDate As Date = Quantum_GR.DataGridView1.Rows(I).Cells("EXPDATE").Value
        Dim StockTaxCode As String = Quantum_GR.DataGridView1.Rows(I).Cells("TAXCODE").Value
        Dim StockTaxAmount As Double = Quantum_GR.DataGridView1.Rows(I).Cells("TAXAMT").Value



        sqlcon.Open()
        If StockCode <> "" Then
            Dim grquery As String = "INSERT INTO GRT(GRNO,STKID,STKNAME,GRQTY,COST,BATCHCTR,BATCHID,EXPDATE,TAXCODE,TAXAMT) VALUES ('" & GRID & "','" & StockCode & "','" & StockName & "'," & GRQuantity & "," & StockCost & ",'" & BatchControl & "','" & StockBatchID & "','" & StockExpDate & "','" & StockTaxCode & "'," & StockTaxAmount & ")"
            Dim sqlcmd As New SqlCommand(grquery, sqlcon)
            sqlcmd.ExecuteReader()
            sqlcmd.Dispose()
        End If
        sqlcon.Close()

        sqlcon.Open()
        SQLcmd = New SqlCommand("UPDATE GRT SET TCOST=ROUND(GRQTY*COST,2)", sqlcon)
        sqlda = New SqlDataAdapter(SQLcmd)
        sqldataset = New DataSet
        sqlda.Fill(sqldataset)
        sqlcon.Close()
    Next
Catch ex As Exception
    MsgBox(ex.Message)
End Try

【问题讨论】:

  • 停止你正在处理的所有事情,然后阅读 SQL 注入。然后,修复代码以使用参数而不是字符串连接。
  • 为什么不简单地将DataTable 绑定到DataGridView?那么您根本不需要任何代码来传输数据,因为它会自动发生。
  • 最后一条 tsql 语句(“UPDATE ...”)刚刚更新了 GRT 中的 EVER SINGLE ROW。不仅仅是你插入的那个——所有的。这真的是你的目标吗?为什么你需要另一个声明来做到这一点?为什么不在插入语句中这样做?如果始终按照代码中指定的方式计算该列 (TCOST),请考虑在数据库中执行此操作。

标签: sql-server vb.net


【解决方案1】:

试试这个代码。

  Dim index As Integer
        Dim selectedRow = DataGridView1.Rows(index)

        Try
            For i = 0 To DataGridView1.Rows.Count - 2
                'Dim GRNo As String
                Dim StockCode As String = DataGridView1.Rows(i).Cells("STKID").Value
                Dim StockName As String = DataGridView1.Rows(i).Cells("STKNAME").Value
                Dim GRQuantity As Double = DataGridView1.Rows(i).Cells("GRQTY").Value
                Dim StockCost As Double = DataGridView1.Rows(i).Cells("COST").Value
                Dim BatchControl As Boolean = Convert.ToBoolean(DataGridView1.Rows(i).Cells("BATCHCTR").Value)
                Dim StockBatchID As String = DataGridView1.Rows(i).Cells("BATCHID").Value
                Dim StockExpDate As Date = DataGridView1.Rows(i).Cells("EXPDATE").Value
                Dim StockTaxCode As String = DataGridView1.Rows(i).Cells("TAXCODE").Value
                Dim StockTaxAmount As Double = DataGridView1.Rows(i).Cells("TAXAMT").Value



                sqlcon.Open()
                If StockCode <> "" Then
                    Dim grquery As String = "INSERT INTO GRT(GRNO,STKID,STKNAME,GRQTY,COST,BATCHCTR,BATCHID,EXPDATE,TAXCODE,TAXAMT) VALUES ('" & GRID & "',@StockCode,@StockName,@GRQuantity,@StockCost,@BatchControl,@StockBatchID,@StockExpDate,@StockTaxCode," &  & ")"
                    Dim sqlparams(8) As SqlClient.SqlParameter
                    sqlparams(0) = New SqlClient.SqlParameter("@StockCode", SqlDbType.VarChar)
                    sqlparams(0).Value = CType(StockCode, String)
                    sqlparams(1) = New SqlClient.SqlParameter("@StockName", SqlDbType.VarChar)
                    sqlparams(1).Value = CType(StockName, String)
                    sqlparams(2) = New SqlClient.SqlParameter("@GRQuantity", SqlDbType.Float)
                    sqlparams(2).Value = CType(GRQuantity, Double)
                    sqlparams(3) = New SqlClient.SqlParameter("@StockCost", SqlDbType.Float)
                    sqlparams(3).Value = CType(StockCost, Double)
                    sqlparams(4) = New SqlClient.SqlParameter("@BatchControl", SqlDbType.Bit)
                    sqlparams(4).Value = CType(BatchControl, Boolean)
                    sqlparams(5) = New SqlClient.SqlParameter("@StockBatchID", SqlDbType.VarChar)
                    sqlparams(5).Value = CType(StockBatchID, String)

                    sqlparams(6) = New SqlClient.SqlParameter("@StockExpDate", SqlDbType.Date)
                    sqlparams(6).Value = CType(StockExpDate, Date)
                    sqlparams(7) = New SqlClient.SqlParameter("@StockTaxCode", SqlDbType.VarChar)
                    sqlparams(7).Value = CType(StockTaxCode, String)
                    sqlparams(8) = New SqlClient.SqlParameter("@StockTaxAmount", SqlDbType.Float)
                    sqlparams(8).Value = CType(StockTaxAmount, Double)
                    Dim sqlcmd As New SqlCommand(grquery, sqlcon)

                    sqlcmd.ExecuteNonQuery()
                    sqlcmd.Dispose()
                End If
                'sqlcon.Close()

                'sqlcon.Open()
                SQLcmd = New SqlCommand("UPDATE GRT SET TCOST=ROUND(GRQTY*COST,2)", sqlcon)
                sqlcmd.ExecuteNonQuery()
                sqlcon.Close()
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

【讨论】:

  • 这也行不通。错误:无法将对象从 DBNull 转换为其他类型。
猜你喜欢
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2022-01-17
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
相关资源
最近更新 更多