【发布时间】:2018-01-31 18:46:17
【问题描述】:
我们在 MVC5 项目中使用嵌入式 Firebird V3.0.2
问题:当我们更新软件时,我们想在创建新表之前找出一个表是否存在。因此,我们只需在所需的表上进行选择,如果出现 sql 错误代码-204 的异常,则该表不存在。但是如何解决错误代码-204?
代码:
var lFbCommand = new FbCommand();
lFbCommand.Connection = "MyConnectionstring";
lFbCommand.Connection.Open();
// check if table exists by an select query
lFbCommand.CommandText = string.Format("SELECT FIRST 1 * FROM {0}", "MyTableName");
try
{
pFbCommand.ExecuteNonQuery();
}
catch (FirebirdSql.Data.FirebirdClient.FbException e)
{
if(e.? == -204) // -204 seem to be the errorcode for "Table does not exists."
{
// table does not exist.
}
else
{
throw;
}
}
注意:我们要防止解析异常中的消息文本。我们想为这个错误获得一个明确的标志(例如,通过任何属性的错误代码)。
【问题讨论】:
-
您可以直接询问表是否存在 - 请参阅 stackoverflow.com/a/45455737/976391 - 但是可能存在第三种情况:表存在但用户没有表上的 SELECT 授权。或者你可以尝试创建表,如果创建stmt失败,那么它已经存在了。
-
然而这都是错误的软件升级解决方案。因为该表具有比二进制“存在/遗漏”更多的选项。表有许多可能的结构。随着您的软件不断发展,这些表也会不断发展,添加列,删除列,更改列类型等。您必须制作数据库格式的 VERSIONED 库和脚本库,将数据库从版本 N 转换为版本 N+1 N。您必须创建数据库格式历史表,其中您将有转换为格式 N 的每个 N 的日期。MAX(N) 将是当前版本。
-
@Arioch:你错了。此解决方案适用于全新的表格。
-
"totally new table" 是一种暂时转瞬即逝的状态。随着程序的发展,它将越来越少见,退化的情况。但是,如果您想犯自己的错误而不是从别人的错误中学习 - 祝您旅途愉快:-D 我和马克都为您提供了几种“创造错误”的方法
标签: c# firebird firebird-embedded