【问题标题】:adding data grid view rows to sql tables in vb.net将数据网格视图行添加到 vb.net 中的 sql 表
【发布时间】:2017-11-03 09:35:22
【问题描述】:

我正在尝试将数据网格视图行添加到 sql 表中,但 this error 显示虽然实际数据已保存:

参数化查询 '(@Name1 nvarchar(4000),@Dad nvarchar(4000),@Gender nvarchar(4000' 需要参数 '@Name1', 没有提供。

我做了很多研究,有人说要添加 dbNull 值,但什么也没发生。我也看过MSN文档,但是看不懂。

cmd.CommandText = "Insert into Member values('" & txt_fserial_no.Text & "',@Name1,@DOB,@Gender,@Dad,@Relation,@NRC,@Citizen,@Job,@Race,@Country,@Religion)"
cmd.CommandType = CommandType.Text
' Dim adapFam As New SqlDataAdapter'
cmd.Parameters.Add("@Name1", SqlDbType.VarChar)
cmd.Parameters.Add("@Dad", SqlDbType.VarChar)
cmd.Parameters.Add("@Gender", SqlDbType.VarChar)
cmd.Parameters.Add("@DOB", SqlDbType.Date)
cmd.Parameters.Add("@Job", SqlDbType.VarChar)
cmd.Parameters.Add("@Race", SqlDbType.VarChar)

cmd.Parameters.Add("@Country", SqlDbType.VarChar)
cmd.Parameters.Add("@Religion", SqlDbType.VarChar)
cmd.Parameters.Add("@Relation", SqlDbType.VarChar)
cmd.Parameters.Add("@Citizen", SqlDbType.VarChar)
cmd.Parameters.Add("@NRC", SqlDbType.VarChar)

For i As Integer = 0 To datagrid_preview.Rows.Count - 1
    cmd.Parameters.Clear()
    cmd.Parameters.AddWithValue("@Name1", datagrid_preview.Rows(i).Cells(0).Value)
    cmd.Parameters.AddWithValue("@Dad", datagrid_preview.Rows(i).Cells(1).Value)
    cmd.Parameters.AddWithValue("@Gender", datagrid_preview.Rows(i).Cells(2).Value)
    cmd.Parameters.AddWithValue("@DOB", datagrid_preview.Rows(i).Cells(3).Value)
    cmd.Parameters.AddWithValue("@Job", datagrid_preview.Rows(i).Cells(4).Value)
    cmd.Parameters.AddWithValue("@Race", datagrid_preview.Rows(i).Cells(5).Value)
    cmd.Parameters.AddWithValue("@Country", datagrid_preview.Rows(i).Cells(6).Value)
    cmd.Parameters.AddWithValue("@Religion", datagrid_preview.Rows(i).Cells(7).Value)
    cmd.Parameters.AddWithValue("@Relation", datagrid_preview.Rows(i).Cells(8).Value)
    cmd.Parameters.AddWithValue("@Citizen", datagrid_preview.Rows(i).Cells(9).Value)
    cmd.Parameters.AddWithValue("@NRC", datagrid_preview.Rows(i).Cells(10).Value)

    cmd.Connection = conn
    cmd.ExecuteNonQuery()

    'adapFam.InsertCommand.ExecuteNonQuery()'

Next
conn.Close()`][1]

【问题讨论】:

    标签: mysql sql-server vb.net gridview dbnull


    【解决方案1】:

    我认为这应该可行:

    cmd.CommandText = "Insert into Member(id,Name1,Dad,Gender,DOB,Job,Race,Country,Religion,Relation,Citizen,NRC) values(@id,@Name1,@DOB,@Gender,@Dad,@Relation,@NRC,@Citizen,@Job,@Race,@Country,@Religion)"
    cmd.CommandType = CommandType.Text
    cmd.Connection = conn
    
    For i As Integer = 0 To datagrid_preview.Rows.Count - 1
        cmd.Parameters.Clear()
        cmd.Parameters.AddWithValue("@id", txt_fserial_no.Text)
        cmd.Parameters.AddWithValue("@Name1", datagrid_preview.Rows(i).Cells(0).Value)
        cmd.Parameters.AddWithValue("@Dad", datagrid_preview.Rows(i).Cells(1).Value)
        cmd.Parameters.AddWithValue("@Gender", datagrid_preview.Rows(i).Cells(2).Value)
        cmd.Parameters.AddWithValue("@DOB", datagrid_preview.Rows(i).Cells(3).Value)
        cmd.Parameters.AddWithValue("@Job", datagrid_preview.Rows(i).Cells(4).Value)
        cmd.Parameters.AddWithValue("@Race", datagrid_preview.Rows(i).Cells(5).Value)
        cmd.Parameters.AddWithValue("@Country", datagrid_preview.Rows(i).Cells(6).Value)
        cmd.Parameters.AddWithValue("@Religion", datagrid_preview.Rows(i).Cells(7).Value)
        cmd.Parameters.AddWithValue("@Relation", datagrid_preview.Rows(i).Cells(8).Value)
        cmd.Parameters.AddWithValue("@Citizen", datagrid_preview.Rows(i).Cells(9).Value)
        cmd.Parameters.AddWithValue("@NRC", datagrid_preview.Rows(i).Cells(10).Value)
    
        cmd.ExecuteNonQuery()
    
    Next
    

    【讨论】:

    • 即使我参数化了 ID ,同样的错误仍然发生。
    • 我有问题,上面的链接(“这个错误”)由于某种原因无法打开。也许我们公司的代理阻止了它。我只能想象,您的主键有问题。在我的机器上,我发布的代码运行良好。使用 MySQL 5.1。
    • 感谢您的努力,@muffi,但我认为这与 PK 无关,因为我将 MemberID 设置为自动递增,AddressID 是外键。
    • 我终于找到了答案。它在循环“For i As Integer = 0 To datagrid_preview.Rows.Count - 1”中,它在网格视图中的所有行之后仍然工作。必须减去 2(-2)。
    • -1 没问题。如果错误发生在最后一行,那么最后一行有问题。我认为您应该循环直到 Rows.Count - 1 并检查(每一行),如果 DataRows 中的数据正常。相反,您可能会丢失数据...!
    【解决方案2】:

    将数据表定义为全局数据表,用于将您的 gridview raw 插入 SQL Server 表中,同样是用于绑定您的 gridview 的用户。

    dt 直接传递给您的SQL Server 存储过程。

    在 SQL Server 中创建函数:

    CREATE PROCEDURE [dbo].[Insert_xyz]
          @tblxyz xyzType READONLY
    AS
    BEGIN
          SET NOCOUNT ON;
    
          INSERT INTO xyz(Id, Name, Country)
              SELECT Id, Name, Country 
              FROM @tblxyz
    END
    

    这是 VB 的代码:

    If dt.Rows.Count > 0 Then
            Dim cons As String = ConfigurationManager.ConnectionStrings("xyz").ConnectionString
            Using con As New SqlConnection(cons)
                Using cmd As New SqlCommand("Insert_xyz")
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.Connection = con
                    cmd.Parameters.AddWithValue("@tblxyz", dt)
                    con.Open()
                    cmd.ExecuteNonQuery()
                    con.Close()
                End Using
            End Using
        End If
    

    对不起,我的英语不好 :) 我已尽力向您解释。 :)

    【讨论】:

    • 感谢您的回答。但是我不熟悉“在Sql中使用函数,而且我没有绑定我的数据gridview,我从字符串数组添加。
    • 数据保存到数据库了,但是还是弹出这个错误,要不要换个方式?
    • 如果您使用的是字符串数组,那么检查字符串数组是否包含所有必需的数据?您是否缺少任何参数值?有些地方你缺少值。
    • 错误出现在循环中, For i As Integer = 0 To datagrid_preview.Rows.Count - 1. 即使所有行都已处理,它以某种方式再次循环并且什么也没找到,所以我减去 (-2 )。
    猜你喜欢
    • 2014-09-11
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2016-03-24
    • 2015-02-03
    相关资源
    最近更新 更多