我有一长串SQL脚本。它们都是更新语句。这是一个访问数据库。我想在运行之前验证脚本。首先,我想确保可以解析查询。即SQL至少在语法上是正确的。其次,我想确保查询在数据库结构方面是有效的 - 即没有丢失的列或列的类型错误等。但是,我不希望查询实际执行。这样做的目的是在该过程开始之前进行快速验证,因为该过程需要几个小时,并且一个语法错误可能浪费一天的某个时间。
我可能会在C#中使用.net编写该工具但是如果有一个预先构建的工具会更好。我可能会使用Access API。在SQL Server中,这非常简单。您可以在运行之前在SQL Server管理工作室中验证查询。它将为您提供SQL是否完成的良好指示。
我该怎么做呢?
编辑:下面的答案解决了检查语法的问题。但是,我仍然希望能够验证查询的语义内容是否正常。但是,我认为在没有实际运行查询的情况下,这可能是不可能的。请告诉我,我错了。
答案 0 :(得分:2)
我不是100%确定Access是否与传统数据库的工作方式相同,但使用主流RDMBS时,实际上在运行查询时会发生三个不同的步骤:
大多数人都没有注意到这种区别,因为他们只是点击“跑”并看到结果回来了。
这是“执行”,实际上是在关闭和提取数据之前编译语句。
当您使用ADO时,您实际上可以将这三个事件视为对数据库的三次单独调用。这意味着您可以捕获执行步骤以查看它是否失败,如果成功,则无需实际获取结果。
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = String.Format("{0}{1}",
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=", @"c:\Access\MyDb.accdb");
conn.Open();
bool valid;
using (OleDbCommand cmd = new OleDbCommand("select [Bad Field] from [Table]", conn))
{
try
{
OleDbDataReader reader = cmd.ExecuteReader();
valid = true;
reader.Close(); // Did not ever call reader.Read()
}
catch (Exception ex)
{
valid = false;
}
}
现在valid
表示该语句是否已编译。
如果你想变得非常花哨,你可以解析异常结果,找出命令失败的原因。
答案 1 :(得分:0)
Access支持其Connection对象上的事务。尝试在事务中执行SQL语句,并始终调用Rollback。将整个尝试包含在Try / Catch块中,以评估语句是否成功执行。