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

3
有人能告诉我如何从vb.net项目中检查sql server中是否存在数据库和表吗? 我想做的是检查数据库是否存在(最好在“if”语句中,除非有更好的方法),如果存在,则执行一项操作,如果不存在,则创建具有表和列的数据库。 对此事的任何帮助将不胜感激。
编辑:应用程序连接到服务器。 当应用程序在PC上运行时,我希望它检查数据库是否存在,如果存在,则继续执行它应该执行的操作,但如果不存在,则首先创建数据库,然后再继续执行它应该执行的操作。 所以基本上我想让它在PC上第一次运行时创建数据库,然后继续它的业务,然后每次在其他PC上运行时,它都会看到数据库已经存在,然后使用在其他PC上创建的现有数据库运行应用程序。我想要这样做的原因是因为这个应用程序将在多台PC上运行,我只想在第一次在PC上运行时创建数据库和表,然后当它在其他PC上运行时,它会看到数据库已经存在,然后使用在其他PC上创建的现有数据库运行应用程序。

1
我假设你的应用程序必须已经与服务器建立了连接?对我来说,这听起来更像是一种部署而不是嵌入在应用程序中的东西。你可以检查 sys.databases。 - undefined
我不认为与服务器的连接是问题所在。我假设应用程序可以动态创建数据库和表,如果它们不存在的话。 - undefined
这个链接展示了如何检查:http://kellyschronicles.wordpress.com/2009/02/16/check-if-sql-database-exists-on-a-server-with-vb-net/。我会将其作为答案发布,但那只是一个复制粘贴的工作。 - undefined
@Tanner,你的链接非常有效,谢谢你的帮助。问题已解决。 - undefined
@Coder92 没问题,我很快会将它作为一个参考答案添加进去。 - undefined
6个回答

6
你可以查询SQL Server以检查对象是否存在。
要检查数据库是否存在,您可以使用以下查询:
SELECT * FROM master.dbo.sysdatabases WHERE name = 'YourDatabase'

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

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

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

使用vb.net检查服务器上的SQL数据库是否存在

以上链接引用的代码:
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

通过一次调用以上代码并传入数据库和表名参数,您将知道两者是否存在。

3

连接到主数据库并选择

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

然后在数据库上进行操作。
SELECT 1 FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_NAME = 'yourTable'

我不知道准确的VB语法,但你只需要在结果上检查recordcount。

这样做可以起作用,但在代码方面会出现问题,因为您需要检查数据库或表是否存在的情况下是否为NULL(Nothing)。最好使用IF EXISTS(.....)SELECT 1 ELSE SELECT 0,以确保始终有返回值。 - undefined
2
哦,命中注定失败的 @deterministicFail 在被纠正的代码上没有命中注定地失败,真是讽刺啊... - undefined
1
关键是你可以在不返回 DataSet 的情况下获得结果 1 或 0。只需使用 ExecuteScalar 更具性能。但在此上下文中,并不是非常重要。只是让你知道一下。 - undefined
如果你执行SELECT 1并且WHERE子句为空,你会得到一个需要处理的空值。你可能想使用select count(1)来获取0或1。 - undefined
@deterministicFail 你说的和我一样。 - undefined
显示剩余5条评论

3

对于数据库内的表格和其他对象,我通常会这样做,但这真的是个人喜好。

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

END

对于VB.NET,我会将此内容包装在一个存储过程中并进行调用。我相信还有使用Linq来完成此操作的方法。

2

您可以使用这个查询来检查数据库:

如果 DB_Id('YourDatabaseName') 不为 NULL:

BEGIN

PRINT 'DB EXISTS'

结束

否则

开始

PRINT 'DB  NOT EXISTS'

END


1
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

0
   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;Encrypt=False;Packet Size=4096;" 请注意连接字符串中的初始目录必须为master! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接