2009-07-08 26 views
0

我正在使用VB.Net創建一個Windows應用程序,並且此應用程序將以SQl創建.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,名字字符串,中間名字符串

我想以任何方式,純vb.net代碼或使用正則表達式來做到這一點。

任何人都知道完成這個最快的方法?

回答

1

首先,你使用什麼味道的SQL?其次,CREATE TABLEsyntax可以相當「詳細」。你是否正在處理可能使這個問題更簡單的一般語法的一小部分?

但是,而不是試圖解析,以最快的方式可能有,你可以執行CREATE TABLE聲明垃圾數據庫,然後通過

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

提取列名和類型的聲明(我這裏假設SQL Server的。)

正是如此,

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(); 
} 

對不起,它在C#。用VB編寫大致正確的代碼時,我沒有足夠的流暢度。

+0

這種方式可以在sql express版中完成嗎? – 2009-07-08 00:43:49

0

代碼和正則表達式的混合。一個正則表達式來分割語句,用代碼循環遍歷結果。對於每條語句,使用正則表達式來確定它是否是您關心的那種語句。如果是,請使用另一個正則表達式來提取所需的信息。

有時你需要做一個多層次的正則表達式來讓事情變得更簡單 - 抓住你關心的區域,然後使用另一個正則表達式來從匹配中拉出碎片。

1

一種選擇是使用SMO創建內存數據庫,執行腳本,然後遍歷表列。

Here是一個相反的文章,但你應該能夠用它開始。

披露:我認爲使用分裂和正則表達式可能是一個更好的解決方案,但我想你會得到很多這樣的,所以我想我會拋出一個備用。畢竟,這是這個網站是關於什麼

相關問題