【发布时间】:2012-06-23 02:22:11
【问题描述】:
以免我遭受一阵乏味的震颤(大致介于震颤谵妄和 腕管综合症),我需要找到一种方法来自动解析一个大文件 sql语句及其参数值。
我有一个包含大量这种格式的 sql 语句的文件:
select Animal#, RacketThreshold, PeakOil as Oil
from OilAnimalPlatypus2
where OilAnimalPlatypusID = :ID
and Animal# = :Animal
and TelecasterAccessType = 'D'
UNION
select Animal, RacketThreshold, PeakOil as Oil
from OilRequestPlatypus
where PlatypusID = :ID
and Animal = :Animal
order by RacketThreshold
-->ID(VARCHAR[0])=<NULL>
:Animal(INTEGER)=2
...即多行sql语句,后跟一个空行,后跟两个破折号和 一个带有参数名称、数据类型和参数的箭头,后跟相同的东西 一遍又一遍地无止境地恶心(除非 sql 语句没有参数)。
我想从这个伟大的 goo 中为每个唯一查询创建一个单独的字符串(许多 它们中的一些是相同的,尽管通常分配有不同的参数值 参数)。如果可能的话,我还想跟踪传递给特定查询的所有参数值(例如,如果第一次调用它并为特定参数传递“1”,下一次是“42”,下一次“3.14”等),我想要一个 1、42、3.14 的集合作为该 arg 名称。
有超过 400 个查询,我讨厌“手动”完成这一切的想法 - 尤其是匹配查询的比较。
更新
好的,添加此代码后使用 Jon 的:
private void buttonOpenAndParseSQLMonFile_Click(object sender, EventArgs e)
{
var queriesAndArgs = (Dictionary<string, List<string>>)ParseFile("SQLMonTraceLog.txt");
foreach(var pair in queriesAndArgs)
{
richTextBoxParsedResults.AppendText(pair.Key);
richTextBoxParsedResults.AppendText(Environment.NewLine);
foreach (String s in pair.Value)
{
richTextBoxParsedResults.AppendText(s);
richTextBoxParsedResults.AppendText(Environment.NewLine);
}
richTextBoxParsedResults.AppendText(Environment.NewLine);
}
}
...我在我的richTextBox 中得到这些类型的结果:
select ABCID from ABCWorker where lower(loginid) = lower(user)
select r.roleid from abcrole r, abcworker w where lower(w.loginid)=lower(user) and r.abcid=w.abcid and r.status='A'
select Tier#, BenGrimm, PeakRate as Ratefrom RageAnimalGreenBayPackers2 where RageAnimalGreenBayPackersID = :ID and Tier# =
:Tier and FlyingVAccessType = 'D' UNION select Tier, BenGrimm, PeakRate as Rate from CaliforniaCondorGreenBayPackers where
GreenBayPackersID = :ID and Tier = :Tier order by BenGrimm
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=4
select Tier#, BenGrimm, PeakRate as Rate from RageAnimalGreenBayPackers2 where RageAnimalGreenBayPackersID = :ID and Tier# =
:Tier and FlyingVAccessType = 'D' UNION select Tier, BenGrimm, PeakRate as Rate from CaliforniaCondorGreenBayPackers where
GreenBayPackersID = :ID and Tier = :Tier order by BenGrimm
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=2
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=5
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=2
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=3
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=4
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=2
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=3
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=4
(etc.)
...所以,这很有启发性,但我发现这不是我所需要的,而且这取决于我对文件的 lamo 手动调整。所以,我想我需要退后一步,解析文件,因为它实际上是给我的,递增的数字分隔每个“有趣”的事件:
. . .
6 11:30:46 SQL Execute: select ABCID
from ABCWorker
where lower(loginid) = lower(user)
7 11:30:46 SQL Prepare: select r.roleid from abcrole r, abcworker w where lower(w.loginid)=lower(user) and
r.abcid=w.abcid and r.status='A'
8 11:30:46 SQL Execute: select r.roleid from abcrole r, abcworker w where lower(w.loginid)=lower(user) and
r.abcid=w.abcid and r.status='A'
9 11:30:46 SQL Execute: select Tier#, BenGrimm, PeakRate as Rate
from RageAnimalGreenBayPackers2
where RageAnimalGreenBayPackersID = :ID
and Tier# = :Tier
and FlyingVAccessType = 'D'
UNION
select Tier, BenGrimm, PeakRate as Rate
from CaliforniaCondorGreenBayPackers
where GreenBayPackersID = :ID
and Tier = :Tier
order by BenGrimm
10 11:30:46 :ID(VARCHAR[0])=<NULL>
:Tier(INTEGER)=1
11 11:30:46 SQL Execute: select Tier#, BenGrimm, PeakRate as Rate
from RageAnimalGreenBayPackers2
where RageAnimalGreenBayPackersID = :ID
and Tier# = :Tier
and FlyingVAccessType = 'D'
UNION
select Tier, BenGrimm, PeakRate as Rate
from CaliforniaCondorGreenBayPackers
where GreenBayPackersID = :ID
and Tier = :Tier
order by BenGrimm
12 11:30:46 :ID(VARCHAR[0])=<NULL>
:Tier(INTEGER)=2
. . .
【问题讨论】:
-
你用什么来区分这些查询?
-
绝对的;如果您使用 StreamReader(请参阅msdn.microsoft.com/en-us/library/aa287535(v=vs.71).aspx)打开文本文件,并一次读取一行,您可以在每次读取 String.IsNullOrWhiteSpace 或仅包含 \r\n 字符的文件时对读取进行分段.
-
谁在提供这个文件,你能要求他们以不同的格式给你吗?我倾向于将这种类型的东西发回给组织者,并让他们承担起使其成为可用格式的责任。
-
您是否有多个这样的查询,在一个文件或字符串中?或者,您是否有每个查询及其参数的单独文件?
-
您是否在参数列表中的 ID 参数之前缺少一个 ':',还是第一个参数总是缺少它?
标签: c# sql parsing text string-comparison