使用VB.NET,我成功创建了一个新数据库,并将数据从Excel文件导入到SQL Server 2012 Express数据库中。使用默认架构dbo
创建新表。
我想为刚创建的数据库(即cad
)创建一个新模式,并将表分配给这个新模式。使用VB.NET我很难做到这一点。以下是创建与Excel文件同名的数据库的代码。接下来是将cad模式添加到此数据库。创建后,我可以导入Excel数据并在连接字符串中包含新架构。
SQL_Server = Me.TxtServer.Text 'assing variable for the SQL server
SQL_DBNam = Me.TxtDbName.Text 'assign variable for the database name in the server
SQL_Table = Me.TxtInsertedTableName.Text 'assign variable for the table name in the database in the server
SQL_Schema = Me.TxtSchema.Text
'save the schema to registry in case it had been altered
SaveSetting("CAD SQUAD", SD_LogNam, "SQLSchema", SQL_Schema)
''connect to excel file...............xls................xls................xls....................xls..........
''32bit excel
'Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & fullName & ";Extended Properties=Excel 8.0;")
''64bit excel
Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fullName & ";Extended Properties=Excel 8.0;")
Try 'try 1 ------------------------------connection to excel file-----------------------------------------------
ExcelConnection.Open()
''MsgBox("Excel connection open for file " & fullName)
''assign string to select all items from excel sheet
Dim expr As String = "SELECT * FROM [" & XLS_Sheet & "]"
''MsgBox("String to connect to EXCEL table = " & expr)
Dim objCmdSelect As OleDbCommand = New OleDbCommand(expr, ExcelConnection)
Dim objDR As OleDbDataReader
Dim DBExists As Byte = 0
''connect to SQL server (leave 'Database' parameter blank as it does not yet exist)
''check which type of connection
IE_SrvStr = ServerConnString(CheckBox_TrustCon.Checked, "")
'MsgBox("Server connect string: " & IE_SrvStr)
IE_SrvConn = New SqlConnection(IE_SrvStr)
Try 'try 2
'open server connection
IE_SrvConn.Open()
'check if database exists (moved from above)==========================================================
Dim DBObj As SqlCommand
Dim DBStr As String
Dim DB_Cmd As SqlCommand = New SqlCommand("SELECT case when exists (select 1 from sys.Databases where Name = @DbName) then 1 else 0 end as DbExists", IE_SrvConn)
DB_Cmd.Parameters.AddWithValue("@DbName", SQL_DBNam)
'==================================================
DBExists = CByte(DB_Cmd.ExecuteScalar())
If DBExists = 1 Then
ListBoxEvent.Items.Add("Database " & SQL_DBNam & " already exists...")
ListBoxEvent.SelectedIndex = ListBoxEvent.Items.Count - 1
'MsgBox("Database " & SQL_DBNam & " already exists... OK to continue")
Else
''create database
DBObj = IE_SrvConn.CreateCommand()
DBStr = "CREATE DATABASE " & SQL_DBNam
ListBoxEvent.Items.Add("Database " & SQL_DBNam & " created successfuly...")
ListBoxEvent.SelectedIndex = ListBoxEvent.Items.Count - 1
'MsgBox(SQL_DBNam & " Database Created... OK to continue!")
''execute
DBObj.CommandText = DBStr
DBObj.ExecuteNonQuery()
End If
IE_SrvConn.Close()
Try 'try 3
'and open server
IE_SrvConn.Open()
''check if table exists+++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim restrictions(3) As String
restrictions(2) = SQL_Table
Dim dbTbl As DataTable = IE_SrvConn.GetSchema("Tables", restrictions)
If dbTbl.Rows.Count = 0 Then
'Table does not exist
'DoesTheTableExist = False
Dim TBObj As New SqlCommand
Dim TBStr As String
TBObj = IE_SrvConn.CreateCommand()
''the .cad schema is what I want to assing to the table but
''it errors out: shcema not available or you do not have permissions
''when using the .dbo it works fine
'TBStr = "CREATE TABLE " & SQL_DBNam & ".cad" & ". " & SQL_Table & "(" & _
TBStr = "CREATE TABLE " & SQL_DBNam & ".dbo" & ". " & SQL_Table & "(" & _
"LayIdx int NOT NULL PRIMARY KEY, " & _
"New_LayNam VARCHAR(255), " & _
.
.
.
"LayDescription VARCHAR(255)" & _
") "
'MsgBox("Table parameters: " & TBStr)
' Execute
TBObj.CommandText = TBStr
'MsgBox("TBOBJ.CommandText = initiated command!")
TBObj.ExecuteNonQuery()
'MsgBox("TBOBJ.ExecuteNonQuery()-executed! now see if table is available...")
Else
''table exists; (option: ask if want to delete it and replace with new....)
ListBoxEvent.Items.Add("Table " & SQL_Table & " already exists...")
ListBoxEvent.SelectedIndex = ListBoxEvent.Items.Count - 1
'MsgBox("Table " & SQL_Table & " exists...OK to Continue!")
End If
dbTbl.Dispose()
''check if record exists, means table has already been populated
'MsgBox("Find records on the table...")
Dim tblRecs As String = "SELECT * FROM " & SQL_Table
Dim tblCmd As SqlCommand = New SqlCommand(tblRecs, IE_SrvConn)
Using RReader As SqlDataReader = tblCmd.ExecuteReader()
If RReader.HasRows Then
RReader.Close()
ListBoxEvent.Items.Add("Table data is already imported...")
ListBoxEvent.SelectedIndex = ListBoxEvent.Items.Count - 1
'MsgBox("Table is already populated...OK to Finish!")
Else
''propulate table
RReader.Close()
'MsgBox("SQL_Table exists but has not records... OK to Import Data!")
'importing from excel
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(IE_SrvConn)
bulkCopy.DestinationTableName = SQL_Table
Try 'try 4
objDR = objCmdSelect.ExecuteReader
bulkCopy.WriteToServer(objDR)
ExcelConnection.Close()
IE_SrvConn.Close()
ListBoxEvent.Items.Add("Data import successful!")
ListBoxEvent.SelectedIndex = ListBoxEvent.Items.Count - 1
Catch ex As Exception
MsgBox("Error importing to table " & SQL_Table & ": " & ex.ToString)
End Try 'try 4 close
End Using
End If
End Using
Catch ex As Exception
MsgBox("Error creating table: " & SQL_Table & " in database: " & SQL_DBNam & " [" & ex.Message & "]")
Exit Sub
Finally
IE_SrvConn.Close() 'Whether there is error or not. Close the connection.
ExcelConnection.Close()
ListBoxEvent.Items.Add("Closing connection to server " & SQL_Server)
ListBoxEvent.SelectedIndex = ListBoxEvent.Items.Count - 1
'MsgBox("Connection to Server " & SQL_Server & " closed!")
End Try 'try 3 close
答案 0 :(得分:0)
在这里,您可以看到以下代码段显示您正在使用dbo架构创建
TBStr = "CREATE TABLE " & SQL_DBNam & ".dbo" & ". " & SQL_Table & "(" & _
"LayIdx int NOT NULL PRIMARY KEY, " & _
"New_LayNam VARCHAR(255), " & _
.
.
.
"LayDescription VARCHAR(255)" & _
") "
相反,如果你想用cad模式创建它,那么你必须使用如下语句
TBStr = "CREATE TABLE " & SQL_DBNam & ".cad" & ". " & SQL_Table & "(" & _
"LayIdx int NOT NULL PRIMARY KEY, " & _
"New_LayNam VARCHAR(255), " & _
.
.
.
"LayDescription VARCHAR(255)" & _
") "
记住,一旦使用除了之外的模式创建表 数据库的默认架构(通常是dbo),然后你必须指定 执行任何操作(例如select,update, 删除,插入表格。
答案 1 :(得分:0)
以下是我在SQL Server Express数据库中成功创建新架构的代码
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Common
Imports System.Data.SqlClient
Module DBSchema
Public Sub TableSchema(SrvName As String, DBaseName As String, SchName As String, SchOwner As String)
Dim connectionString As String = "Data Source=" & SrvName & ";Initial Catalog=" & DBaseName & ";Integrated Security=SSPI;"
Dim connection As New SqlConnection(connectionString)
' do not explicitly open connection, it will be opened when Server is initialized
connection.Open()
Dim serverConnection As New ServerConnection(connection)
Dim server As New Server(serverConnection)
Console.Write("server connection defined...")
' after this line, the default database will be switched to Master
Dim database As Database = server.Databases(DBaseName)
' if you want to execute a script against this database, you have to open
' another connection and re-initiliaze the server object
server.ConnectionContext.Disconnect()
connection = New SqlConnection(connectionString)
serverConnection = New ServerConnection(connection)
server = New Server(serverConnection)
'Create the schema on the instance of SQL Server.
Dim sch As Schema
sch = New Schema(database, SchName)
sch.Owner = SchName
sch.Create()
connection.Close()
End Sub
End Module