SQL Server数据库填充预先存在的数据表和字段(FORM)。没有数据库文件

时间:2019-06-10 22:16:02

标签: sql-server database vb.net

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

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

到目前为止,在大多数涉及绑定到现有文件的地方,我还没有找到解决方案。当我使用Excel进行数据传输时,必须定义单元格并以表格形式引用单元格。

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

到目前为止,这是我创建数据库并添加到我的项目中的全部操作。我尝试了很少的代码,即使表中有数据,我也尝试使用DataTable,但我仍然使Dataset为空,但是到目前为止,任何操作都没有。

请提出关于我做错了的事情,并且有关数据库的其他信息也将非常有用。如前所述,我确实知道当实际文件存在时绑定如何工作。但是,由于我一直认为应该有一个绑定文件,因此创建和管理对我来说是一个困惑。

 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 

请在下面查看更多信息:

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

更新:我摆脱了无效对象错误。如我最初的想法,必须首先创建表。但是,当我尝试保存时,“我的数据集”总是显示为“空” ...单元格确实将BN数据包含为“ 1,2,....”。 。确实加载了某些内容,因为当我尝试添加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

更新:我可以使用所有的东西,但是我不能保存多行.....真的可以使用一些帮助

2 个答案:

答案 0 :(得分:0)

让我们从仅显示一些数据开始。将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

答案 1 :(得分:0)

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

例如:

SELECT BN FROM DataTable

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

请注意,如果您有多列,则上面的查询仍将仅从BN返回值。

SELECT * FROM DataTable

将返回DataTable中的每个值。

w3schools是查看SQL文档的有用站点。