如何在不硬编码的情况下引用不同的模式
本文关键字:情况下 引用 模式 编码 | 更新日期: 2023-09-27 17:50:37
我们有多个环境(开发、测试、生产等)。使用Oracle 10g。所有的值都是从web.config中读出的。我们使用的是ASP。. NET 2.0 (c#)
我们正在使用多个数据库模式,一个用于我们的应用程序,一个用于第三方应用程序,作为参考,我将它们分别称为MYAPP和THEIRAPP。
c#代码中有SQL语句通过名称引用THEIRAPP。例如:字符串sql = @"select * from THEIRAPP. "地址zip = {0}";如果在所有环境中具有相同的命名约定,那么这将工作得很好,然而,在测试环境中数据库管理员使用不同的名称(例如THEIRAPP2),因此对THEIRAPP的调用。地址不能工作,因为它在那个环境中不存在。
如何在c#代码中以最少的更改更改这些查询?我知道SQL调用应该在存储过程中,但我没有编写代码,也没有做这种更改的态度(至少现在没有)。
任何帮助或建议将不胜感激。谢谢你的帮助。
最简单也是最常见的答案是确保模式名称在不同的环境中总是匹配的。
如果不可能,表名之间是否存在冲突?也就是说,是否存在一个My_App.Address
表和一个Their_App.Address
表?如果没有冲突,您可以简单地创建指向各种表的同义词,并消除模式名称
CREATE SYNONYM address FOR my_app.address
CREATE SYNONYM person FOR their_app.person
如果有冲突,你仍然可以使用同义词,你只需要重命名对象,即
CREATE SYNONYM my_address FOR my_app.address
CREATE SYNONYM their_address FOR my_app.address
否则,您可能会在执行每个查询之前更改当前模式。如果你这样做
ALTER SESSION SET current_schema = MY_APP
SELECT * FROM address
将自动从my_app.address
表中进行选择。如果你这样做
ALTER SESSION SET current_schema = THEIR_APP
SELECT * FROM address
您将自动从their_app.address
表中选择
可以使用配置文件来存储模式名称吗?这似乎是最简单的解决办法。
好吧,其中一些是特定于环境的(也就是说:您的测试环境和生产环境分开得有多好?)但是-假设您绝对必须通过代码来实现这一点:使用您的配置文件。
为Sql语句添加一个配置部分(我们称之为"SqlStatements"),然后为每个(当前)硬编码语句添加条目。
现在,在你的代码中,而不是:SqlCommand cmd = new SqlCommand("yourTextHere")
你调用正确的sql语句的配置文件,然后运行你的sql.
然后,为测试环境和生产环境设置不同的配置文件。这也允许你在将来改变你的sql语句,而不实际修改你的代码。
但是,正如你所说的,更好的答案(如果你能得到老板的同意)是将代码移到存储过程中,并直接调用它们。