Vb.net Visual Studio 2015中访问数据库的路径
我正在VB.NET中使用Visual Studio 2015进行一个项目。我的目标是用户可以创建联系人,程序将其放入Access数据库并在DataGridView中列出。我正在使用以下连接字符串: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 当我把它发布到我自
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