【问题标题】:Updating SQL database with datagridview contents使用 datagridview 内容更新 SQL 数据库
【发布时间】:2017-01-08 18:21:03
【问题描述】:

让我简要说明我的问题,然后显示代码。

我想从 SQL 数据库中提取数据,使用 Visual Basic 中的 datagridview 显示它,允许用户更改 datagridview 中的内容,然后将任何更改发布回数据库。我使用来自 stackoverflow 和其他论坛的建议尝试了多种方法,但没有任何效果。这是对我来说最有意义的方法,但如果有更好或更简单的方法来做到这一点,我会全力以赴。

我已经删除了其他不相关的代码部分。代码正确地从数据库中获取数据;将其放入datagridview并显示它。当我输入一个单元格以更改内容,然后尝试将结果保存回数据库时,这就是我得到运行时错误的地方。

Imports System.IO
Imports System.Data.OleDb
Imports System.Data.SqlClient
Public Class FrmRunTerm

    Private connectionString As String
    Private ControlResultsConnection As New SqlConnection
    Private ReadDS As New SqlDataAdapter
    Private ControlResultsDS As New DataSet


    Private Sub FrmRunTerm_Load(sender As Object, e As EventArgs) Handles MyBase.Load


        CboWeek.Items.Add("Week 1 - Tuesday, November 15, 2016")
        CboWeek.Items.Add("Week 2 - Tuesday, November 22, 2016")
        CboWeek.Items.Add("Week 3 - Tuesday, November 29, 2016")
        CboWeek.Items.Add("Week 4 - Tuesday, December 6, 2016")
        CboWeek.Items.Add("Week 5 - Tuesday, December 13, 2016")
        CboWeek.Items.Add("Week 6 - Tuesday, December 20, 2016")
        CboWeek.Items.Add("Week 7 - Tuesday, December 27, 2016")
        CboWeek.Items.Add("Week 8 - Tuesday, January 3, 2017")
        CboWeek.Items.Add("Week 9 - Tuesday, January 10, 2017")
        CboWeek.Items.Add("Week 10 - Tuesday, January 17, 2017")
        CboWeek.Items.Add("Week 11 - Tuesday, January 24, 2017")
        CboWeek.Items.Add("Week 12 - Tuesday, January 31, 2017")

        If CboWeek.Text = "" Then
            MessageBox.Show("Please select a week to process.", "Termination Control Utility Set", MessageBoxButtons.OK)
        End If
    End Sub

    Private Sub Btn_CWA_Click(sender As Object, e As EventArgs) Handles Btn_CWA.Click

        If CboWeek.Text <> "" Then
            ListBox1.Items.Add("Processing continuation of weekly analysis...")
            Application.DoEvents()

            connectionString = "<a lot of stuff – but it works>"
            Dim strControlResultsSql As String = "SELECT * FROM dbo.RG_Control_Results_Cumulative"

            Using ControlResultsConnection As New SqlConnection(connectionString)
                ControlResultsConnection.Open()
                Using ReadDS As New SqlDataAdapter(strControlResultsSql, ControlResultsConnection)
                    ReadDS.Fill(ControlResultsDS)
                End Using
            End Using
            Dim SQLCommandBlder As New SqlCommandBuilder(ReadDS)

            DataGridView1.DataSource = ControlResultsDS.Tables(0)
            Application.DoEvents()

        End If

    End Sub

    Private Sub Btn_InterimSave_Click(sender As Object, e As EventArgs) Handles Btn_InterimSave.Click

        ListBox1.Items.Add("Saving data...")
        Application.DoEvents()

        Dim SQLCB As New SqlCommandBuilder(ReadDS)
        ReadDS.Update(ControlResultsDS)
        ControlResultsDS.AcceptChanges()
        SQLCB.Dispose()        
        ControlResultsConnection.close()

    End Sub

End Class

我得到的错误是 ReadDS.Update(ControlResultsDS)。错误是:

“System.InvalidOperationException”类型的未处理异常 发生在 System.Data.dll

附加信息:DataAdapter.SelectCommand 属性需要初始化。

任何建议将不胜感激。提前谢谢大家!


根据 Rahul 的建议,我将代码更改如下:

Dim SQLCB As New SqlCommandBuilder(ReadDS)
ReadDS.SelectCommand = New SqlCommand("Select * From dbo.RG_Control_Results_Cumulative")
ReadDS.SelectCommand.Connection = New SqlConnection(connectionString)
ReadDS.Update(ControlResultsDS)
ControlResultsDS.AcceptChanges()
SQLCB.Dispose()

并在 ReadDS.Update 行收到以下运行时错误:

System.Data.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:对于不返回任何键列信息的 SelectCommand,不支持为 UpdateCommand 生成动态 SQL。

感谢您,再次对新手提出的问题表示歉意。

【问题讨论】:

    标签: sql visual-studio sql-server-2008 datagridview basic


    【解决方案1】:

    您需要什么建议?错误声明本身中存在建议。您正在使用SQLCommandBlder 类,如果您已将SELECT 命令绑定到它,它会自动生成UPDATE 命令,这就是错误消息实际上所说的内容DataAdapter.SelectCommand 属性需要初始化.

    您应该初始化数据适配器的选择命令

    ReadDS.SelectCommand = new SqlCommand("SELECT * FROM dbo.RG_Control_Results_Cumulative");
    

    【讨论】:

    • 谢谢拉胡尔。请原谅我在这里是菜鸟;我承认我还是一头雾水。从概念上讲,我已经将我想要的从数据库加载到 ControlResultsDS 数据集中。然后,我使用 datagridview1 在该数据集中显示了单个表。然后用户对 datagridview1 进行更改,我想将这些更改发布回数据库。我应该使用不同的课程吗?我尝试了很多不同的解决方案,但没有一个有效。对于你们中的许多人来说这是一个如此简单的问题,我再次表示歉意。
    • 对上一行感到抱歉-试图显示调整后的代码但界面出现问题-我的错误,不熟悉此界面;让我弄清楚,然后发布更新的代码。基本上我添加了你的建议,但出现了一个新错误 - 很快就会发布。再次感谢您的耐心等待!
    • 好的。我编辑了我的原始问题,并在其底部添加了代码更改以及新错误。再次感谢您!
    【解决方案2】:

    好的。让它发挥作用 - 再次感谢 Rahul 的指导!我最终发现的问题是我的表缺少主键列,因此适配器更新失败;一旦我添加了一列(我称之为“Sequence_Number”),将其指定为具有简单顺序编号的 ID 列,并进一步将其指定为主键,一切正常。再次抱歉在这方面如此菜鸟,但这当然是一次学习经历。即使是老程序员也有这些!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多