如何检查 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 server 2008 express 中创建数据库
如何使用 vb.net 中 excel 表中的数据更新 sql 表