在VB.net中,连接SQL Server数据库的连接字符串的问题。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在VB.net中,连接SQL Server数据库的连接字符串的问题。相关的知识,希望对你有一定的参考价值。
在VB.net中,为了连接SQL Server数据库,我在每个窗体的最开始都要声明一个连接字符串,方便后面的调用。
例如:
Private strConn As String = "Server=HB-B2006AL; DataBase=SQL_HB_D001; uid=hb001;pwd=456789"
由于向某些窗体中用过数据绑定的控件,添加过数据源。
所以此工程中还存在着我定义过的,名为“SQL_HB_D001ConnectionString_hb002”的连接字符串。
内容为“Data Source=HB-b2006al;Initial Catalog=SQL_HB_D001;User ID=hb001;Password=456789”
其实效果与上面声明的是一样的。
可以在My Project的设置中修改。
熟悉VB.net的各位应该知道,我第二段话中的连接字符串是存在于app.config中的,主要内容为:
<add name="WindowsApplication1.My.MySettings.SQL_HB_D001ConnectionString_hb002"
connectionString="Data Source=HB-b2006al;Initial Catalog=SQL_HB_D001;User ID=hb001;Password=456789"
providerName="System.Data.SqlClient" />
我的问题是:
我想将第一段中的“Private strConn As String =”后面的内容默认成第二段中的内容,也就是app.config中的相关内容。
这样的话如果我要更换服务器名、数据库名、用户名、密码时,修改一次app.config就可以了。
哈哈哈……
自已做出来了,测试成功!
虽然你写了句话,弄得别人也不来答了
但分还是给你吧,要不也是浪费
本人奉行以德报怨
Imports System.Data.SqlClient
Public Class FormA
Dim strConnA As String = My.Settings.SQL_HB_D001ConnectionString_hb002 & "_+-=_+-="
Dim strConn1 As String = (strConnA.Substring(strConnA.IndexOf("Source=") + 7, (strConnA.IndexOf(";Initial")) - (strConnA.IndexOf("Source=") + 7)))
Dim strConn2 As String = (strConnA.Substring(strConnA.IndexOf("Catalog=") + 8, (strConnA.IndexOf(";User")) - (strConnA.IndexOf("Catalog=") + 8)))
Dim strConn3 As String = (strConnA.Substring(strConnA.IndexOf("ID=") + 3, (strConnA.IndexOf(";Password")) - (strConnA.IndexOf("ID=") + 3)))
Dim strConn4 As String = (strConnA.Substring(strConnA.IndexOf("Password=") + 9, (strConnA.IndexOf("_+-=_+-=")) - (strConnA.IndexOf("Password=") + 9)))
Private strConn As String = "Server=" & strConn1 & "; DataBase=" & strConn2 & "; uid=" & strConn3 & "; pwd=" & strConn4
End Clas
在 vb.net 中恢复 SQL Server localdb
【中文标题】在 vb.net 中恢复 SQL Server localdb【英文标题】:Restore SQL Server localdb in vb.net 【发布时间】:2022-01-05 02:36:40 【问题描述】:我想恢复一个 SQL Server localdb 数据库。我试过这段代码:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim ofd As New OpenFileDialog() With
.Filter = "Backup file | *.bak",
.FileName = ""
If ofd.ShowDialog = System.Windows.Forms.DialogResult.OK Then
Cursor = Cursors.WaitCursor
Dim csb = New SqlConnectionStringBuilder("Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\CHAKER\Documents\RestoDB.mdf;Integrated Security=True;Connect Timeout=30")
Dim dbFullPath = csb.AttachDBFilename
Dim sql = String.Format("RESTORE DATABASE ""0"" From DISK = '1'", dbFullPath, ofd.FileName)
Dim cmd As New SqlCommand(sql, con)
cmd.ExecuteNonQuery()
MsgBox("Restore complete")
Cursor = Cursors.Default
End If
End Sub
我得到了这个例外:
RESTORE 无法处理数据库“C:\Users\CHAKER\Documents\RestoDB.mdf”,因为该会话正在使用它。建议执行此操作时使用master数据库。
【问题讨论】:
您是否尝试将“Initial Catalog=master”添加到您的连接字符串? @DanGuzman 我尝试使用“Initial Catalog=master”得到同样的异常 我看不到您在哪里声明和打开连接。在执行还原之前尝试con.ChangeDatabase("master")
。
代码中所有打开数据库连接的地方都必须在使用完毕后关闭它(并在连接上调用.Dispose()
)。你不应该有一个全局 con 变量。您可以看到我在this answer 中的模式,虽然它使用 OleDbConnection 而不是 SqlConnection 等。
@AndrewMorton 我尝试 con.ChangeDatabase("master") 我得到这个异常附加信息:要恢复主数据库,服务器必须在单用户模式下运行。有关以单用户模式启动的信息,请参阅联机丛书中的“如何:启动 SQL Server 实例 (sqlservr.exe)”。
【参考方案1】:
您的代码存在许多问题:
您的主要问题:您正在按文件名恢复数据库,但您已经使用AttachDbFileName
附加了它,并且无法恢复这样的数据库。 Using AttachDbFileName
is in any case deprecated. 您应该使用普通的 CREATE DATABASE FOR ATTACH
语法将其附加到 LocalDB。
最好不要对连接字符串进行硬编码,而是将其存储在设置文件中。
您需要使用Using
处理您的连接和命令对象。不要缓存连接对象。
连接打开时不要使用 MessageBox 阻塞线程
您应该在RESTORE
命令上使用参数化,而不是直接注入名称
In settings file:
ConnectionString "Data Source=(LocalDB)\v11.0;Initial Catalog=RestoDB;Integrated Security=True;Connect Timeout=30"
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim ofd As New OpenFileDialog() With
.Filter = "Backup file | *.bak",
.FileName = ""
If ofd.ShowDialog <> System.Windows.Forms.DialogResult.OK Then Exit Sub
Try
Cursor = Cursors.WaitCursor
Const sql = "RESTORE DATABASE @DB From DISK = @FileName"
Using con As New SqlConnection(Properties.ConnectionString),
cmd As New SqlCommand(sql, con)
cmd.Parameters.Add("@DB", SqlDbType.NVarChar, 128).Value = con.Database
cmd.Parameters.Add("@FileName", SqlDbType.NVarChar, 255).Value = ofd.FileName
cmd.ExecuteNonQuery()
End Using
MsgBox("Restore complete")
Catch ex As Exception
MsgBox("Error: " + ex.Message)
Finally
Cursor = Cursors.Default
End Finally
End Sub
【讨论】:
代码不工作 你确定那里可以使用SQL参数吗?同理,列名不能是 SQL 参数。此外,Try...Catch 的语法不正确。 @Chaker 现在应该可以工作了。除非您遇到异常,否则是什么? @AndrewMorton 谢谢,好久没写VB了。RESTORE
的语法是 RESTORE DATABASE database_name | @database_name_var [ FROM <backup_device> [ ,...n ] ]
和 <backup_device> ::= logical_backup_device_name | @logical_backup_device_name_var | DISK | TAPE | URL = 'physical_backup_device_name' | @physical_backup_device_name_var
所以它可以被参数化,见 docs.microsoft.com/en-us/sql/t-sql/statements/…
@AndrewMorton 例如,这是有效代码,请参阅dbfiddle.uk/…以上是关于在VB.net中,连接SQL Server数据库的连接字符串的问题。的主要内容,如果未能解决你的问题,请参考以下文章
vb.net访问sql server数据库(SqlDataReader和DataSet两种方式)
用于 SQL Server 和 VB.NET 应用程序的 MultipleActiveResultSets