65.9K
CodeProject 正在变化。 阅读更多。
Home

文章 1 - 通过 Whidbey (或 VB.NET) 动态创建 SQL Server 数据库、表和存储过程

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.75/5 (12投票s)

2004年4月26日

4分钟阅读

viewsIcon

90710

本文分步介绍了如何通过 Whidbey (或 VB.NET) 动态创建 SQL Server 数据库、表和存储过程。

引言

本文分步介绍了如何通过 Whidbey (或 VB.NET) 动态创建 SQL Server 数据库、表和存储过程。

创建数据库应用程序的步骤

1. 数据库连接类及其参数

SqlConnection 类允许您与 SQL Server 进行通信,它通过导入 System.Data.SqlClient 类来实现,如下所示:

Imports System.Data.SqlClient 

SqlConnection 构造函数接受一个连接字符串作为参数。此连接字符串使用集成身份验证,这意味着您必须在 SQL Server 中拥有登录账户,或者属于管理员组才能使其正常工作。

SqlConnection 类可以按如下方式声明:

Dim myDBSQLConnection As New SqlConnection(MyConnection)

您需要为 SQL 连接和 MSDE 连接初始化连接字符串。这样,如果 SQL DB 连接失败,它将尝试通过 MSDE 连接来连接数据库。声明这些连接的代码行如下所示:

MyConnection =  "Server=localhost;" & _
                  "DataBase=;" & _
                  "Integrated Security=SSPI"
Protected Const MY_MSDE_CONNECTION_STRING As String = _
                 "Server=(local)\;" & _
                 "DataBase=;" & _
                 "Integrated Security=SSPI"

2. 声明并初始化 SqlCommand 对象

SqlCommand 对象用于执行 SQL 命令。以下代码行解释了如何在 .NET 环境中声明一个名为 “SqlCommand” 的命令对象:

Dim cmd As New SqlCommand(strSQL, MyConnection)

您还可以声明 mySQL 字符串变量来声明数据库创建 DDL 语句,如下所示:

      Dim mySQL As String = _
            "IF EXISTS (" & _
            "SELECT * " & _
            "FROM master..sysdatabases " & _
            "WHERE Name = 'MyDatabase')" & vbCrLf & _
            "DROP DATABASE MyDatabase " & vbCrLf & _
            "CREATE DATABASE MyDatabase "

上述 SQL 语句执行以下操作:

  1. 第一条语句检查数据库中是否已存在名为 “MyDatabase” 的数据库。
  2. 下一步是删除 myDatabase(如果它已存在)。即使找不到任何数据库,该命令仍会执行,但不会创建任何数据库。
  3. 第三步是创建一个名为 “myDatabase” 的新数据库。

3. 打开连接,执行创建数据库的查询

成功创建 SqlCommand 后,下一个任务是使用连接字符串和 mySQL SQL 参数字符串打开连接,执行命令并关闭连接。

以下代码行解释了如何从 SQL Server 数据库打开连接、执行命令并关闭数据库连接。

       MyConnection.Open()
       cmd.ExecuteNonQuery()
       MyConnection.Close()

请注意,此处使用 ExecuteNonQuery 来执行数据库操作,因为当不返回数据时,使用此命令更有效。

您可以使用 ExecuteNonQuery 来执行目录操作(例如,查询数据库结构或创建数据库对象,如表);或者通过执行 UPDATEINSERTDELETE 语句来更改数据库中的数据,而无需使用 DataSet

如果底层 ODBC 驱动程序支持此功能,您也可以使用 ExecuteNonQuery 执行多个 SQL 语句。在这种情况下,返回值是命令中所有语句影响的行数。

尽管 ExecuteNonQuery 不返回任何行,但任何映射到参数的输出参数或返回值都会填充数据。

对于 UPDATEINSERTDELETE 语句,返回值是命令影响的行数。对于所有其他类型的语句,返回值是 -1。如果发生回滚,返回值也为 -1。

4. 捕获 SQL 异常错误

捕获 SQL 异常错误是避免 SQL Server 连接问题的另一种方法。try … Catch … Exception 语句提供了一种机制来捕获块执行期间发生的 SQL 异常。此外,try 语句提供了指定一个在控件离开 try 语句时始终执行的代码块的能力。这样,我们可以跟踪关联的 SQL 异常错误,从而为解决 SQL 数据库连接问题提供帮助。

以下代码行对此进行了说明。

          Try
 
              Dim myCmd As New SqlCommand(strSQL, MyConnection)


               ' Open the connection, execute the command, and close 
               ‘ the connection. It is more efficient to  
               ‘ ExecuteNonQuery when ‘ data is 
               ' not being returned.
                
              myConnection.Open()
              myCmd.ExecuteNonQuery()
              MyConnection.Close()

              ' Data has been successfully submitted

              MessageBox.Show("New Database has been ' successfully created !", _
                              " Database Creation Completed", MessageBoxButtons.OK, _
                              MessageBoxIcon.Information)
         Catch sqlExc As SqlException
              MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
              MessageBoxButtons.OK, MessageBoxIcon.Error)

         Catch exc As Exception
                If mstrConn = MyConnection Then
                    ' Couldn't connect to SQL Server.  Now try MSDE.
                    mstrConn = MY_MSDE_CONNECTION_STRING
                    ‘ Connecting to MSDE
                Else
                    ' Unable to connect to SQL Server or MSDE
                    MessageBox.Show(“SQL Or MSDE Connection Failed”, _
                         "Connection Failed!", MessageBoxButtons.OK, 
                         MessageBoxIcon.Error)
                    End
                End If
        End Try

5. 创建数据库表/存储过程

成功打开连接后,下一步是创建数据库表、创建数据库视图的存储过程。

' A SqlCommand object is used to execute the SQL commands.
Dim myCmd As New SqlCommand(mySQL, myConnection)

Try
  ' Creating tables
  cmd.CommandText = "USE MyDatabase" & vbCrLf & _
    "if exists (select * from dbo.sysobjects " & _
    "where id = object_id(N'[dbo].[MyTable]') " & _
    " and OBJECTPROPERTY(id, N'IsUserTable') = 1)” & vbcrlf & _
    “drop table [dbo].[Customer] ” & vbcrlf & “GO “ & vbcrlf & _
    “CREATE TABLE [dbo].[Customer] ( " & vbcrlf & _
    "[CustomerID] [int] IDENTITY (1, 1) NOT NULL ,” & vbcrlf & _
    “[NameLast] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,,“ & _
    vbcrlf & _
    “[NameFirst] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,,“ & _
    vbcrlf & _
    “[NameMiddle] [varchar] (16) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,,“ &_
    vbcrlf & _
    “[Prefix] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, “ & _
    vbcrlf & _
    “[Suffix] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, “ & _
    vbcrlf & _
    “[Address1] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, “ & _
    vbcrlf & _
    “[Address2] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,““ & _
    vbcrlf & _
    “[City] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , “ & _
    vbcrlf & _
    “[State] [varchar] (4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , “ & _
    vbcrlf & _
    “[Zip] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , “ & _
    vbcrlf & _
    “[Phone] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) “ & _
    vbcrlf & _
    “ON [PRIMARY] “ & vbcrlf & _
    “GO”

  ' Open the connection, execute the command, and close ‘ the connection.
  ' It is more efficient to ExecuteNonQuery when data ‘
  ‘ is not being returned.


  myConnection.Open() 
  mycmd.ExecuteNonQuery()
  myConnection.close()

  MessageBox.Show("Database Table ‘MyTable” & _
         “successfully created.", " Creation“ & _ “Status", _

  MessageBoxButtons.OK,MessageBoxIcon.Information)

Catch sqlExc As SqlException
  MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
     MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

‘ Creating stored procedures
Try
  cmd.CommandText = "USE MyDatabase" & vbCrLf & _
     "IF EXISTS (" & _
     "SELECT * " & _
     "FROM MyDatabase.dbo.sysobjects " & _
     "WHERE Name = ‘MyStoredProc’ " & _
     "AND TYPE = 'p')" & vbCrLf & _
     "BEGIN" & vbCrLf & _
     "DROP PROCEDURE MyStoredProc" & vbCrLf & _
     "END"

  ' Open the connection, execute the command, and close ‘ the connection.
  ' It is more efficient to ExecuteNonQuery when data ‘
  ‘ is not being returned.

  myConnection.Open()
  mycmd.ExecuteNonQuery()
  myConnection.close()

  MessageBox.Show("Stored Procedure ‘MyStoredProc” & _
          “successfully created.", " Creation“ & _ “Status", _

  MessageBoxButtons.OK,MessageBoxIcon.Information)

Catch sqlExc As SqlException
  MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
  MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

要求

  • Microsoft Visual Studio.Whidbey Ver 8.0 或 Microsoft Visual Studio .NET Professional 或更高版本。
  • Windows 2000 或 Windows XP。

摘要

通过本文,您了解了如何使用 SQL Server 数据库打开新的数据库连接。此外,文章还重点介绍了如何在 SQL Server 中创建动态数据库、表和存储过程。异常处理机制的使用确实有助于跟踪自定义 sqlException 错误。

我的下一篇文章将介绍动态创建完成后,如何查询以填充 Dataset 并显示在 DataGrid 中。

谢谢

您可以 在此处 联系我。

© . All rights reserved.