我正在使用VB.Net创建一个Windows应用程序,这个应用程序将SQl创建.sql文件作为参数,并将列表或数组中的所有字段及其数据类型返回。
示例:
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
应该回归:
UserId int,FirstName字符串,MiddleName字符串
我想以任何方式,纯vb.net代码或使用RegEx。
任何人都知道完成此任务的最快方法吗?
答案 0 :(得分:1)
一种选择是使用SMO创建内存数据库,执行脚本,然后遍历表列。
Here是一篇相反的文章,但你应该可以用它开始。
披露:我认为使用分裂和正则表达式可能是一个更好的解决方案,但我想你会得到很多这样的,所以我想我会抛出一个替代。毕竟,这就是这个网站的内容
答案 1 :(得分:1)
首先,您使用的是什么样的SQL?其次,CREATE TABLE
的{{3}}可以相当“详细”。您是否正在处理可能使此问题更容易处理的一般语法的较小子集?
但是,不是试图解析语句,最快的方法可能是拥有一个垃圾数据库,您可以执行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来编写大致正确的代码而没有编译器在我的指尖。
答案 2 :(得分:0)
代码和正则表达式的混合。一个用于分割语句的正则表达式,用代码循环结果。对于每个语句,使用正则表达式来确定它是否是您关心的语句。如果是,请使用另一个正则表达式来提取所需信息。
有时你需要做一个多级正则表达式的方法来简化事情 - 抓住你关心的区域,然后使用另一个正则表达式从匹配中拉出碎片。