Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Visual Studio 2015中访问数据库的路径_Vb.net_Ms Access_Visual Studio 2015_Datagridview - Fatal编程技术网

Vb.net Visual Studio 2015中访问数据库的路径

Vb.net Visual Studio 2015中访问数据库的路径,vb.net,ms-access,visual-studio-2015,datagridview,Vb.net,Ms Access,Visual Studio 2015,Datagridview,我正在VB.NET中使用Visual Studio 2015进行一个项目。我的目标是用户可以创建联系人,程序将其放入Access数据库并在DataGridView中列出。我正在使用以下连接字符串: Provider=Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\Jacob\Documents\Visual Studio 2015\Projects\Accustomer\Accustomer\Global.accdb 当我把它发布到我自

我正在VB.NET中使用Visual Studio 2015进行一个项目。我的目标是用户可以创建联系人,程序将其放入Access数据库并在DataGridView中列出。我正在使用以下连接字符串:

    Provider=Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\Jacob\Documents\Visual Studio 2015\Projects\Accustomer\Accustomer\Global.accdb

当我把它发布到我自己的电脑上时,它工作得很好,但问题是当我尝试在另一台电脑上运行它时,它不工作,因为该电脑上不存在数据源路径(相当合理)。我尝试过使用“Data Source=Global.accdb”。这适用于显示数据,但不适用于将数据实现到数据库中。有没有办法让程序在不实现数据库的完整路径的情况下识别数据库?

正如krish在评论中所说,您应该“构建”自己的路径……因此,每次在另一台机器上运行程序时,您的代码都会使用正确的参数创建路径。 如果不提供固定路径,代码会为其运行的每台机器创建正确的路径。因此,文件名可以硬编码,但路径应该是“灵活的”

在krish示例中,[projectPath]和[db]是变量,包含正确的值,具体取决于PC

  $"Provider=Microsoft.ACE.OLEDB.12.0; Data Source = {projectPath}\{db}\Global.accdb"

正如krish在评论中所说,您应该“构建”自己的路径……因此,每次在另一台机器上运行程序时,您的代码都会使用正确的参数创建路径。 如果不提供固定路径,代码会为其运行的每台机器创建正确的路径。因此,文件名可以硬编码,但路径应该是“灵活的”

在krish示例中,[projectPath]和[db]是变量,包含正确的值,具体取决于PC

  $"Provider=Microsoft.ACE.OLEDB.12.0; Data Source = {projectPath}\{db}\Global.accdb"

下面介绍的内容已经提到,并且是正确的,这里我只是展示一个完整的工作示例

我创建了一个名为Operations的类,其中包含一个public(可以是private)变量,以创建一个连接字符串,其中连接指向与应用程序可执行文件位于同一文件夹中的Global.accdb。如果数据库是下面的文件夹,则应将该路径添加到硬编码字符串之前的IO.path.Combine中。注意:我使用AppDomain.CurrentDomain.BaseDirectory作为Application.StartupPath在其他类型的项目中并不总是可用

创建连接字符串

Private Builder As New OleDbConnectionStringBuilder With
{
    .Provider = "Microsoft.ACE.OLEDB.12.0",
    .DataSource = IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Global.accdb")
}
下面是我为回答问题而编写的完整代码,这些问题不仅涉及到构建连接,而且涉及到为简单起见封装到单个类中的read/add/update和delete

Public Class Operations
    ''' <summary>
    ''' Points to Global.accdb in the same folder as the application's
    ''' executable file
    ''' </summary>
    Private Builder As New OleDbConnectionStringBuilder With
    {
        .Provider = "Microsoft.ACE.OLEDB.12.0",
        .DataSource = IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Global.accdb")
    }
    Public Sub New()
        If Not IO.File.Exists(Builder.DataSource) Then
            Throw New IO.FileNotFoundException("Failed to find application's database")
        End If
    End Sub
    Public Sub GetCustomerData()
        Dim DataTable As New DataTable

        Using cn As New OleDbConnection With {.ConnectionString = Builder.ConnectionString}
            Using cmd As New OleDbCommand With {.Connection = cn}
                cmd.CommandText =
                    <SQL>
                            SELECT Identifier, ContactTitle, Country, CompanyName
                            FROM Customers 
                            ORDER BY CompanyName ASC
                    </SQL>.Value

                cn.Open()
                DataTable.Load(cmd.ExecuteReader)
            End Using
        End Using
    End Sub
    Public Function AddNewRow(ByVal Name As String, ByVal Contact As String, ByRef Identfier As Integer) As Boolean
        Dim Success As Boolean = True
        Dim Affected As Integer = 0

        Try
            Using cn As New OleDbConnection With {.ConnectionString = Builder.ConnectionString}
                Using cmd As New OleDbCommand With {.Connection = cn}
                    cmd.CommandText =
                        <SQL>
                            INSERT INTO Customer 
                            (
                                CompanyName,
                                ContactName
                            ) 
                            Values
                            (
                                @CompanyName,
                                @ContactName
                            )
                        </SQL>.Value

                    cmd.Parameters.AddWithValue("@CompanyName", Name)
                    cmd.Parameters.AddWithValue("@ContactName", Contact)

                    cn.Open()

                    Affected = cmd.ExecuteNonQuery()
                    If Affected = 1 Then
                        cmd.CommandText = "Select @@Identity"
                        Identfier = CInt(cmd.ExecuteScalar)
                    End If
                End Using
            End Using
        Catch ex As Exception
            Success = False
        End Try

        Return Success

    End Function
    Public Function UpdateCustomer(ByVal CustomerId As Integer, ByVal Name As String, ByVal Contact As String) As Boolean
        Dim Success As Boolean = True
        Dim Affected As Integer = 0

        Try
            Using cn As New OleDbConnection With {.ConnectionString = Builder.ConnectionString}
                Using cmd As New OleDbCommand With {.Connection = cn}
                    cmd.CommandText =
                        <SQL>
                            UPDATE Customer 
                            SET CompanyName = @CompanyName, ContactName = @ContactName 
                            WHERE Identifier = @Identifier
                        </SQL>.Value

                    cmd.Parameters.AddWithValue("@CompanyName", Name)
                    cmd.Parameters.AddWithValue("@ContactName", Contact)
                    cmd.Parameters.AddWithValue("@Identifier", Contact)

                    cn.Open()

                    Affected = cmd.ExecuteNonQuery()
                    If Affected = 1 Then
                        Success = True
                    End If
                End Using
            End Using
        Catch ex As Exception
            Success = False
        End Try

        Return Success

    End Function
    Public Function DeleteCustomer(ByVal CustomerId As Integer) As Boolean
        Dim Success As Boolean = True
        Dim Affected As Integer = 0

        Try
            Using cn As New OleDbConnection With {.ConnectionString = Builder.ConnectionString}
                Using cmd As New OleDbCommand With {.Connection = cn}
                    cmd.CommandText = "DELETE FROM Customers WHERE Identifier = @Identifier"

                    cmd.Parameters.AddWithValue("@Identifier", CustomerId)

                    cn.Open()

                    Affected = cmd.ExecuteNonQuery()
                    If Affected = 1 Then
                        Success = True
                    End If
                End Using
            End Using
        Catch ex As Exception
            Success = False
        End Try

        Return Success

    End Function

End Class
公共类操作
''' 
''指向与应用程序相同文件夹中的Global.accdb
''可执行文件
''' 
Private Builder作为新的OleDbConnectionStringBuilder与
{
.Provider=“Microsoft.ACE.OLEDB.12.0”,
.DataSource=IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“Global.accdb”)
}
公共分新()
如果不存在IO.File.Exists(Builder.DataSource),则
抛出新IO.FileNotFoundException(“未能找到应用程序的数据库”)
如果结束
端接头
公共子GetCustomerData()
Dim DataTable作为新DataTable
使用cn作为带有{.ConnectionString=Builder.ConnectionString}的新OleDbConnection
使用cmd作为带有{.Connection=cn}的新OleDbCommand
cmd.CommandText=
选择标识符、联系人姓名、国家/地区、公司名称
来自客户
按公司名称ASC订购
价值
cn.Open()
DataTable.Load(cmd.ExecuteReader)
终端使用
终端使用
端接头
公共函数AddNewRow(ByVal名称为字符串,ByVal联系人为字符串,ByRef标识符为整数)为布尔值
将成功设置为布尔值=True
受影响的Dim为整数=0
尝试
使用cn作为带有{.ConnectionString=Builder.ConnectionString}的新OleDbConnection
使用cmd作为带有{.Connection=cn}的新OleDbCommand
cmd.CommandText=
插入客户
(
公司名称,
联系人姓名
) 
价值观
(
@公司名称,
@联系人姓名
)
价值
cmd.Parameters.AddWithValue(“@CompanyName”,Name)
cmd.Parameters.AddWithValue(“@ContactName”,Contact)
cn.Open()
受影响=cmd.ExecuteNonQuery()
如果受影响=1,则
cmd.CommandText=“选择@@Identity”
identifer=CInt(cmd.ExecuteScalar)
如果结束
终端使用
终端使用
特例
成功=错误
结束尝试
回归成功
端函数
公共函数UpdateCustomer(ByVal CustomerId为整数,ByVal Name为字符串,ByVal Contact为字符串)为布尔值
将成功设置为布尔值=True
受影响的Dim为整数=0
尝试
使用cn作为带有{.ConnectionString=Builder.ConnectionString}的新OleDbConnection
使用cmd作为带有{.Connection=cn}的新OleDbCommand
cmd.CommandText=
更新客户
设置CompanyName=@CompanyName,ContactName=@ContactName
其中Identifier=@Identifier
价值
cmd.Parameters.AddWithValue(“@CompanyName”,Name)
cmd.Parameters.AddWithValue(“@ContactName”,Contact)
cmd.Parameters.AddWithValue(“@Identifier”,联系人)
cn.Open()
受影响=cmd.Ex