【问题标题】:SQL Server database population pre-existing Data Table and fields (FORM). NO database fileSQL Server 数据库填充预先存在的数据表和字段 (FORM)。没有数据库文件
【发布时间】:2019-06-10 22:16:02
【问题描述】:

这是我目前对数据库的一般理解:保存/更新/删除到通过 SQL 绑定形成的预先存在的文件。

这就是我想要做的 - 我有一个预先制作的表单数据表,其中定义了所有列。一旦应用程序关闭或某些功能运行,我需要在 SQL 中保存/更新该数据(在本地)。一旦应用程序打开,我需要保留所有数据。

到目前为止,在大多数涉及绑定到现有文件的地方,我都没有找到单一的解决方案。当我使用 Excel 数据传输单元格时,必须在人口表格中定义和引用。

我的假设是当使用来自 VB.NET 的数据库时,可以自动创建带有值的表并保存/加载/更新。然而,这只是我的假设,因为我以前从未使用过 SQL。我不确定是否需要管理使用所有值创建的实际数据库文件,然后将它们绑定到数据表。例如 DataTable 单元格 XX 到数据库列 XX。

这是我到目前为止所做的,我创建了数据库并添加到我的项目中。我尝试了一些代码,即使表中有数据我也尝试使用 DataTable,但我一直得到空数据集,但到目前为止没有任何效果。

请就我做错的地方提出建议,有关数据库的其他信息也会很棒。按照前面的说法,我确实知道当实际文件存在时绑定是如何工作的。但是创建和管理让我感到困惑,因为我一直认为应该有一个绑定文件。

 Dim connetionString As String
 Dim sqlCnn As SqlConnection
 Dim sqlCmd As SqlCommand
 Dim adapter As New SqlDataAdapter
 Dim ds As New DataSet

 Dim sql As String

    connetionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data_Ant.mdf;Integrated Security=True;Connect Timeout=30"
    sql = "SELECT BN FROM DataTable" ' BN is my column name and DataTable is the name of my Table where data gets populated. This is also confusing to me How does it know which value is what? Is there are space/word/characters requirements? 
    ' adapter.TableMappings.Add("DataTable", sql)

    If ds.Tables.Count > 0 Then
        sqlCnn = New SqlConnection(connetionString)
        Try
            sqlCnn.Open()
            sqlCmd = New SqlCommand(sql, sqlCnn)
            adapter.SelectCommand = sqlCmd
            adapter.Update(ds)
            adapter.Dispose()
            sqlCmd.Dispose()
            sqlCnn.Close()
        Catch ex As Exception
            MsgBox("Can not open connection !" & vbCrLf & Err.Description)
        End Try
    ElseIf ds.Tables.Count = 0 Then
        MsgBox("Empty data")
    End If
End Sub

我用来创建/保存数据库的代码。与之前一样,所有列/格式都是预先制作、加载的。

    Dim connetionString As String
    Dim sqlCnn As SqlConnection
    Dim sqlCmd As SqlCommand
    Dim adapter As New SqlDataAdapter
    Dim ds As New DataSet

    Dim sql As String

    connetionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data_Ant.mdf;Integrated Security=True;Connect Timeout=30"
    sql = "Select BN FROM DataTable" 
    adapter.TableMappings.Add("BN", sql)


    If DataTable.RowCount > 0 Then
        sqlCnn = New SqlConnection(connetionString)
        Try
            sqlCnn.Open()
            sqlCmd = New SqlCommand(sql, sqlCnn)
            adapter.SelectCommand = sqlCmd
            adapter.Update(ds, "BN")

            adapter.Dispose()
            sqlCmd.Dispose()
            sqlCnn.Close()
        Catch ex As Exception
            MsgBox("Can not open connection !" & vbCrLf & Err.Description)
        End Try
    ElseIf DataTable.RowCount = 0 Then
        MsgBox("Empty data")
    End If
End Sub 

请在下面查看更多信息:

  • 数据表列/格式的结构是为了直观表示。
  • 当用户启动时,应用数据库可以为空/可以包含值。
  • 当用户运行某些功能关闭应用程序值被保存并且只有值。 如果我想要一个 MS Access,我会构建相同的表/值并将其与表单值交叉引用。表单值来自外部来源,格式/数量始终是已知的。 希望这有助于更清楚地了解我的问题。也许 SQL 对我来说不是一个正确的选择?是否需要在值操作之前构建 SQL。

更新:我摆脱了无效对象错误。正如我最初的想法,必须首先创建表。但是,当我尝试保存时,我的 DataSet 总是显示为 EMPTY... 单元格确实包含 BN 数据为“1,2, ....) 即使我删除了“If”逻辑 Save and Load 表显示为空. 有些东西确实加载了,因为当我尝试添加 BN 时,它告诉我绑定 bla bla bla(不同的问题)

代码:

Private Sub SaveData()

    Dim connetionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data_Ant.mdf;Integrated Security=True;Connect Timeout=30"
    Dim sql As String = "SELECT BN FROM DataTable_d"
    Dim sqlCnn As SqlConnection
    Dim sqlCmd As SqlCommand
    Dim adapter As New SqlDataAdapter
    Dim ds As New DataSet()

    adapter.TableMappings.Add("BN", sql)

    If ds.Tables.Count > 0 Then
        sqlCnn = New SqlConnection(connetionString)
        Try
            sqlCnn.Open()
            sqlCmd = New SqlCommand(sql, sqlCnn)
            adapter.SelectCommand = sqlCmd
            adapter.Update(ds, "BN")

            adapter.Dispose()
            sqlCmd.Dispose()
            sqlCnn.Close()
        Catch ex As Exception
            MsgBox("Can not open connection !" & vbCrLf & Err.Description)
        End Try
    ElseIf ds.Tables.Count = 0 Then
        MsgBox("Empty data")
    End If
End Sub

更新:我得到了所有的东西,但我无法保存多行.....真的可以使用一些帮助

【问题讨论】:

  • 您是否安装了 Sql Server Management Studio? (SSMS) 你能在 SSMS 中看到你的数据库吗?顺便说一句,它是免费下载的,它将帮助您针对您的数据库测试 Sql 语句。

标签: sql-server database vb.net


【解决方案1】:

在您的 SQL 查询中删除 WHERE DataTable ='。该语句正在寻找我认为不存在的列名DataTable。 WHERE 子句用于帮助过滤您的查询。您只能在表中的列名上使用 WHERE。

例如:

SELECT BN FROM DataTable

将从 DataTable 的 BN 列返回所有值。

请注意,如果您有多个列,上述查询仍将仅返回来自 BN 的值。

SELECT * FROM DataTable

将返回 DataTable 中的每个值。

查看 SQL 文档的有用网站是 w3schools

【讨论】:

  • 谢谢!看起来我发布了一个稍微旧的代码,因为我不再有“WHERE”了。我现在将更新它以避免混淆。我已经查看了链接“SqlBulkCopy”我实际上是我尝试使用的第一种方法,但它只是将批量数据从源复制到另一个并相应地构造它。不幸的是,这不是我想要的。我用 MS Access 打赌这将是在公园里散步.... 根据之前的说法,我的数据库可以是空的/值。只有数据字段需要更新。有时表单数据库的初始/启动可能为空。
  • @Alek 其实 Sql Server 虽然比 Access 复杂得多,但更容易处理。
  • 我希望如此:) 我从来没有使用过 SQL,以前我写的应用程序都不需要这个。所以我觉得学习很有趣....到目前为止还不是很多:(
  • 每个数据库都有自己的怪癖,但您正在学习的是用于访问任何数据库的 ADO.net。因此,您将能够在任何 .net 框架可用的地方使用这些技能。
【解决方案2】:

让我们从显示一些数据开始。将 DataGridView 添加到窗体。您可以从按钮调用 LoadData()。我不太确定你的连接字符串,但试试看。

Private dt As DataTable
Private sql As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data_Ant.mdf;Integrated Security=True;Connect Timeout=30"

Private Sub LoadData()
    '***EDIT***  Add instantiation line
    dt = New DataTable()
    'The Using...End Using blocks will close and dispose your database objects
    'even if there is an error
    Using cn As New SqlConnection(sql)
        'You can pass the command text and the connection directly to the constructor
        'In the select statement use the actual names of the field and table as they appear in the database.
        Using cmd As New SqlCommand("Select BN From [Insert the name of the table in the database]", cn)
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    End Using
    DataGridView1.DataSource = dt
End Sub

这是我能想到的最简单的数据显示方式。一旦可行,我们将继续更改数据。如果您在cn.Open() 上遇到错误,我们将不得不处理连接字符串。

****编辑****

Private Sub TestConnection()
    Dim sql As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data_Ant.mdf;Integrated Security=True;Connect Timeout=30"
    Using cn As New SqlConnection(sql)
        cn.Open()
    End Using
End Sub

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多