C# 怎样从文本提取SQL文,跳过注释

例如以下是Insert.sql中的全部内容--Mysql--/-------------/*it'sasamplemysqlend*/--INSERTINTOINSERT... 例如以下是Insert.sql中的全部内容
-- Mysql
--/-------------
/* it's a sample
mysql
end */
--INSERT INTO
INSERT INTO `table1`(`a`,`b`,`c`) VALUES
('2009-1-1 10:0','--China','/*中国'),--aa
('2009-1-2 11:0','English','英国');
需要将SQL文中的table1及各字段的名称提取出来作为对象并填充,请问该如何实现,新手请大家指教,谢谢
呵呵,当然知道过程很复杂,是否应该用正则表达式匹配,我对正则表达式很不熟练,能不能给点代码参考下,跪谢
展开
 我来答
火沙
2009-08-11 · TA获得超过954个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:398万
展开全部
给你一个函数,这是我以前写的一个从文件中取SQL文,也是MySql的
但是因为文件中有可能会有多个SQL文,所以里面判断“;”为一条语句结束,返回SQL文的字符串数组。你要只有一条SQL文的话,改一下就可以用了

private string[] GetSqlList()
{
StreamReader objReader = new StreamReader("Insert.sql", Encoding.UTF8);
string sLine = string.Empty;
StringBuilder objStringBuilder = new StringBuilder();

while (sLine != null)
{
sLine = objReader.ReadLine();
if (!string.IsNullOrEmpty(sLine))
objStringBuilder.Append(sLine + "\n");
}
objReader.Close();
string strSQL = objStringBuilder.ToString();

if (string.IsNullOrEmpty(strSQL))
{
return new string[] { };
}

int i = 0;
ArrayList arrSql = new ArrayList();
string strTempSql = string.Empty;

//取得注释以外的有効SQL文
while (i < strSQL.Length)
{
bool bolIsBreak = false;
switch (strSQL.Substring(i, 1))
{
case "`":
int intPosition = strSQL.IndexOf(strSQL.Substring(i, 1), i);
if (intPosition == -1)
{
strTempSql += strSQL.Substring(i);
bolIsBreak = true;
}
else
{
strTempSql += strSQL.Substring(i, intPosition - i + 1);
i = intPosition;
}
break;
case "'":
goto case "`";
case "\"":
goto case "`";
case "/":
if (strSQL.Length > i + 1 && strSQL.Substring(i, 2).Equals("/*"))
{
i = strSQL.IndexOf("*/", i);
if (i == -1)
{
bolIsBreak = true;
}
i++;
}
else
{
strTempSql += strSQL.Substring(i, 1);
}
break;
case "-":
//--
if (strSQL.Length > i + 1 && strSQL.Substring(i, 2).Equals("--"))
{
i = strSQL.IndexOf("\n", i);
if (i == -1)
{
bolIsBreak = true;
}
}
else
{
strTempSql += strSQL.Substring(i, 1);
}
break;
case ";":
strTempSql = strTempSql.TrimStart('\n');
if (!string.IsNullOrEmpty(strTempSql))
{
arrSql.Add(strTempSql);
}
strTempSql = string.Empty;
break;
default:
strTempSql += strSQL.Substring(i, 1);
break;
}

if (bolIsBreak)
{
break;
}
i++;
}

strTempSql = strTempSql.TrimStart('\n');
if (!string.IsNullOrEmpty(strTempSql))
{
arrSql.Add(strTempSql);
}

string[] lstSql = new string[arrSql.Count];
for (i = 0; i < arrSql.Count; i++)
{
lstSql[i] = arrSql[i].ToString();
}

return lstSql;
}
幸巴达
2009-08-10 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6953
采纳率:38%
帮助的人:2454万
展开全部
一般来说,读取每一行,如果开头是--就可以认为是注释,
如果串中包含/*就认为是多行注释的开始,直到遇到*/。

还有一种情况很复杂,需要判断/* */是否在字符串中
insert tab1('/*..*/', ...)
上面这句话中的/* */是不能当作注释的,因为在字符串中。

所以还需要判断注释是否在字符串中, 也就是检测单引号"'"。

过程相当复杂。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
孙中吕
2009-08-10 · 专注C/S架构开发框架技术研究
孙中吕
采纳数:435 获赞数:788

向TA提问 私信TA
展开全部
如果用正则表达式,代码更短

/// <summary>
/// 为//和/**/类型的注释着色
/// </summary>
/// <param name="src">输入源码</param>
/// <returns>格式化后的源码</returns>
private string ColorBasicComment(string src)
{
string retCode = src;
Regex r1 = new Regex(@"(^|;)([ \t]*)(//.*$)", RegexOptions.Multiline);
retCode = r1.Replace(retCode, "$1$2<span [CSS_COMMENT]>$3</span>");
Regex r2 = new Regex(@"(^|[ \t]+)(/\*[^\*/]*\*/[ \t\r]*$)", RegexOptions.Multiline);
retCode = r2.Replace(retCode, new MatchEvaluator(this.ColorBasicComment2Evaluator));
return retCode;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式