【问题标题】:SQL Server database new schema using VB.NET使用 VB.NET 的 SQL Server 数据库新架构
【发布时间】:2014-09-18 11:13:40
【问题描述】:

使用 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

【问题讨论】:

  • 我在上面的代码中没有看到创建表的任何地方,请问您是否已发布了整个代码,或者您能否指出该表所在的行号已创建。
  • 是的,这里是建表代码:

标签: sql sql-server vb.net excel sql-server-2012-express


【解决方案1】:

下面的代码 sn-p 显示您正在使用 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),那么你必须指定 执行任何操作时的模式名称,例如选择、更新、 删除,插入到表中。

【讨论】:

  • 感谢您的回复,我在调用创建表时确实包含了 .cad 架构。此模块创建一个数据库,然后在该数据库下创建一个表,因此 cad 架构作为新创建的数据库安全性的一部分尚不存在,因此当我使用 .cad 架构创建表时,我收到一个错误:[The指定的模式名称“cad”要么不存在,要么您无权使用它]。似乎需要在创建数据库之后和创建表之前创建 cad 架构。这就是我遇到的麻烦。
  • 有人认为这可能会奏效,即使用 VB.NET 在 SQL 中创建一个脚本以添加 .cad 模式,然后在代码创建数据库后运行该脚本。接下来使用 .cad 创建表应该可以工作,因为数据库中已经存在架构。该怎么做呢?
【解决方案2】:

这是我找到的在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多