如何检查 vb .net 项目的 sql server 中是不是存在数据库和表?

Posted

技术标签:

【中文标题】如何检查 vb .net 项目的 sql server 中是不是存在数据库和表?【英文标题】:How to check if a database and tables exist in sql server in a vb .net project?如何检查 vb .net 项目的 sql server 中是否存在数据库和表? 【发布时间】:2014-08-06 14:19:27 【问题描述】:

谁能告诉我如何检查来自 vb.net 项目的 sql server 中是否存在数据库和表?我想要做的是检查数据库是否存在(最好在'If'语句中,除非有人有更好的方法)如果它确实存在我做一件事,如果它不存在我创建数据库与表格和列。对此问题的任何帮助将不胜感激。

编辑:

应用程序与服务器建立了连接。当应用程序在 PC 上运行时,我希望它检查数据库是否存在,如果存在,那么它会继续执行它应该做的事情,但是如果数据库不存在,那么它首先创建数据库,然后继续执行它应该做什么。所以基本上我希望它第一次在 PC 上运行时创建数据库,然后开始它的业务,然后每次它在 PC 上运行时,我希望它看到数据库存在,然后开始它的业务。我想要这样的原因是因为这个应用程序将在不止一台 PC 上,我只希望创建一次数据库和表(第一次在 PC 上运行),然后当它在另一台 PC 上运行时,它看到数据库已经存在,然后使用在另一台 PC 上创建的现有数据库运行应用程序。

【问题讨论】:

我假设您的应用程序必须已经连接到服务器?这对我来说听起来像是一个部署,而不是你应该嵌入到应用程序中的东西。您可以检查 sys.databases 我认为与服务器的连接不是问题。我假设应用程序可以动态创建数据库和表,如果它们不存在的话。 这将向您展示如何检查:kellyschronicles.wordpress.com/2009/02/16/…,我会将其发布为答案,但它只是复制粘贴工作。 @Tanner 您的链接效果很好,感谢您的帮助。问题解决了。 @Coder92 没问题,我会尽快将其添加为参考答案 【参考方案1】:

您可以查询 SQL Server 以检查对象是否存在。

要检查数据库是否存在,您可以使用以下查询:

SELECT * FROM master.dbo.sysdatabases WHERE name = 'YourDatabase'

要检查表是否存在,您可以对目标数据库使用此查询:

SELECT * FROM sys.tables WHERE name = 'YourTable' AND type = 'U'

以下链接向您展示了如何使用 VB.NET 代码检查数据库是否存在是 SQL Server:

Check if SQL Database Exists on a Server with vb.net

以上链接中的参考代码:

Public Shared Function CheckDatabaseExists(ByVal server As String, _
                                           ByVal database As String) As Boolean
    Dim connString As String = ("Data Source=" _
                + (server + ";Initial Catalog=master;Integrated Security=True;"))

    Dim cmdText As String = _
       ("select * from master.dbo.sysdatabases where name=\’" + (database + "\’"))

    Dim bRet As Boolean = false

    Using sqlConnection As SqlConnection = New SqlConnection(connString)
        sqlConnection.Open
        Using sqlCmd As SqlCommand = New SqlCommand(cmdText, sqlConnection)
            Using reader As SqlDataReader = sqlCmd.ExecuteReader
                bRet = reader.HasRows
            End Using
        End Using
    End Using

    Return bRet

End Function

您可以通过另一种方式执行检查,因此通过使用 EXISTS 同时检查数据库和表在一次调用中完成:

IF NOT EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = 'YourDatabase')
BEGIN
    -- Database creation SQL goes here and is only called if it doesn't exist
END

-- You know at this point the database exists, so check if table exists

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'YourTable' AND type = 'U')
BEGIN
    -- Table creation SQL goes here and is only called if it doesn't exist
END

上面的代码调用一次,参数为数据库和表名,就知道两者都存在。

【讨论】:

【参考方案2】:

连接主数据库并选择

SELECT 1 FROM master..sysdatabases WHERE name = 'yourDB'

然后在数据库上

SELECT 1 FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_NAME = 'yourTable'

我不知道确切的 vb 语法,但您只需检查结果中的记录数

【讨论】:

这会起作用,但会在代码方面产生问题,如果数据库或表不存在,您需要检查 NULL(无)。更好地使用 IF EXISTS(.....) SELECT 1 ELSE SELECT 0 所以总是保证返回。 哦,讽刺的是 @deterministicFail 在没有确定性失败的代码上得到纠正...... @Steve 在我的最后一句话中,我假设检查结果集的计数。所以 if 将在 vb 中而不是在 T-SQL 中 别忘了检查架构。 AND TABLE_SCHEMA = 'yourSchema' 关键是您可以获得结果 1 或 0 而无需返回 DataSet。只是一个 ExecuteScalar,它的性能更高。但是,在这种情况下,它并不重要。只是为了让您知道。【参考方案3】:

对于数据库中的表和其他对象,我通常这样做,但这确实是个人喜好。

IF OBJECT_ID('dbo.blah') IS NOT NULL
BEGIN

END

对于 VB.NET,我会将其包装在一个存储过程中并调用它。我相信 Linq 也有办法做到这一点。

【讨论】:

【参考方案4】:

您可以使用此查询来检查数据库

IF DB_Id('YourDatabaseName') 不为空

开始

PRINT 'DB EXISTS'

结束

否则

开始

PRINT 'DB  NOT EXISTS'

结束

【讨论】:

【参考方案5】:
Friend Function CheckDatabaseExists(server As String, database As String) As Boolean
    Dim connString As String = "Data Source=" + server + ";Initial Catalog=master;Integrated Security=SSPI"

    Dim cmdText As String = "select * from master.dbo.sysdatabases where name='" + database + "'"

    Dim bRet As Boolean = False

    Using sqlConnection As SqlConnection = New SqlConnection(connString)
        sqlConnection.Open
        Using sqlCmd As SqlCommand = New SqlCommand(cmdText, sqlConnection)
            Using reader As SqlDataReader = sqlCmd.ExecuteReader
                bRet = reader.HasRows
            End Using
        End Using
    End Using

    Return bRet

End Function

【讨论】:

【参考方案6】:
   Public Function SQLDatabaseExist(ByVal DefaultConnectionString As String, ByVal DataBaseName As String) As Boolean
    Try
        'CREATE DATABASE
        Dim SqlString As String = ""
        SqlString = "SELECT CASE WHEN EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'" & DataBaseName & "') THEN CAST (1 AS BIT) ELSE CAST (0 AS BIT) END"
        Dim ExcRet As Integer = 0
        Using connection As New SqlConnection(DefaultConnectionString)
            Dim command As New SqlCommand(SqlString, connection)
            command.Connection.Open()
            ExcRet = command.ExecuteScalar()
            command.Connection.Close()
            command.Dispose()
        End Using
        Return ExcRet
    Catch ex As Exception
        Return False
    End Try
End Function

【讨论】:

'示例默认连接字符串 Dim DefaultConnectionString As String = "Data Source=localhost\SQLSERVER2008;Initial Catalog=Master; User ID=SA; Password='123123'; MultipleActiveResultSets=false; Connect Timeout=15 ;加密=假;数据包大小=4096;" '注意连接字符串中的初始目录必须是master!

以上是关于如何检查 vb .net 项目的 sql server 中是不是存在数据库和表?的主要内容,如果未能解决你的问题,请参考以下文章

VB.Net 中的 SQL 查询

VB.NET 不在 sql server 2008 express 中创建数据库

如何使用 vb.net 中 excel 表中的数据更新 sql 表

vb.net中的SQL事务语句

如何使用 dotnet cli 命令以 VB.NET 语言创建 ASP.NET Core 项目?

如果一个启动另一个,您如何在 VB.Net 中跨项目进行调试?