2009-07-08 8 views
0

私はVB.Netを使用してWindowsアプリケーションを作成しています。このアプリケーションは、SQl create .sqlファイルをパラメータとして取り、すべてのフィールドとそのデータ型をリストまたは配列に返します。.Netを使用してcreate SQL Statmentからすべてのフィールドを抽出する方法は?

例:

USE [MyDB] GO /****** Object: Table [dbo].[User] Script Date: 07/07/2009 10:16:48 ******/ 

SET 
ANSI_NULLS ON GO 

SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[User]([UserId] [int] IDENTITY(1,1) NOT NULL, 

[FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [MiddleName] 

[varchar](50) COLLATE SQL_Latin1_General_CP1_CI_A 

は返す必要があります:

ユーザーID int型、姓の文字列、MiddleName列

を、私はどのような方法、純粋なvb.netコードや正規表現を使用してこれをやりたいです。

誰もがこれを完了するための最速の方法を知っていますか?

答えて

1

まず、どのようなSQLの風味を使用していますか?第2に、のCREATE TABLEは、かなり「詳細」である可能性があります。この問題に簡単に近づけることができる一般的な構文の一部を扱っていますか?

しかしよりもむしろ文を解析しようとすると、最速の方法は、あなたが上CREATE TABLE文を実行することができ、ゴミのデータベースを有し、そして(私は

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='MyCreatedTable' 

を介して列名とタイプを抽出することがありますここでは、SQL Serverを仮定。)

Thusly、それはC#でだと申し訳

string createTableCommandText; // "CREATE TABLE MyCreatedTable..." 
using(var connection = new SqlConnection(connectionString)) { 
    connection.Open(); 
    var createCommand = connection.CreateCommand(); 
    createCommand.CommandText = createTableCommandText; 
    createCommand.ExecuteNonQuery(); 

    var schemaCommand = connection.CreateCommand(); 
    schemaCommand.CommandText = "SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='MyCreatedTable'"; 
    var reader = schemaCommand.ExecuteReader(); 
    while(reader.Read()) { 
     Console.WriteLine(String.Format("{0}|{1}", reader["COLUMN_NAME"], reader["DATA_TYPE"])); 
    } 

    var deleteCommand = connection.CreateCommand(); 
    deleteCommand.CommandText = "DROP TABLE MyCreatedTable"; 
    deleteCommand.ExecuteNonQuery(); 
} 

を。私は、コンパイラを使わずにほぼ正しいコードを書くためにVBで十分に流暢ではない。

+0

この方法はSQL Express版でも実行できますか? –

+0

@Amr ElGarhy:はい。 – jason

0

コードと正規表現が混在しています。 1つの正規表現は、ステートメントを分割し、結果をコードでループします。それぞれの文について、正規表現を使用して、それがあなたが気にする文の種類であるかどうかを判断します。そうであれば、別の正規表現を使用して必要な情報を取得します。

場合によっては、より単純なものにするために、多レベルの正規表現のアプローチを行う必要があります。気になる領域をつかんでから別の正規表現を使用して、マッチからピースを引き出します。

1

SMOを使用してインメモリ・データベースを作成し、スクリプトを実行してから、表の列を反復処理する方法もあります。

Hereは反対のことをする記事ですが、あなたはそれを使ってパスを開始することができます。

開示:スプリットを使用して、正規表現はおそらくより良い解決策だと思うが、私はあなたがこれをたくさん得ていると考えていたので、私は代替案を投じると思った。結局のところ、これはこのサイトの内容です

関連する問題