在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

参考技术A 楼主是SB、鉴定完毕~ 参考技术B 你都不给分,怎么帮你看啊。本回答被提问者采纳

在 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 &lt;backup_device&gt; [ ,...n ] ]&lt;backup_device&gt; ::= 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数据库的连接字符串的问题。的主要内容,如果未能解决你的问题,请参考以下文章

向 SQL Server VB.NET 数据库添加多个值

vb.net的数据库连接

vb.net访问sql server数据库(SqlDataReader和DataSet两种方式)

用于 SQL Server 和 VB.NET 应用程序的 MultipleActiveResultSets

在 vb.net 中备份 SQL Server localdb

如何在 vb.net、SQL Server 中为多个搜索制作代码