如何在不对其进行硬编码的情况下引用其他模式

时间:2011-04-20 21:10:35

标签: c# asp.net sql oracle10g

我们有多种环境(开发,测试,生产等)。使用Oracle 10g。所有值都从web.config中读出。我们正在使用ASP.NET 2.0(c#)

我们使用多个数据库模式,一个用于我们的应用程序,一个用于第三方应用程序,作为参考,我将分别称为MYAPP和THEIRAPP。

c#代码中有一些SQL语句通过名称引用了THEIRAPP。 例如: string sql = @“select * from THEIRAPP.address where zip = {0}”;

如果在所有环境中具有相同的命名约定,这将正常工作,但是,在测试环境中,数据库管理员使用不同的名称(例如THEIRAPP2),因此对THEIRAPP.address的调用不起作用,因为它没有存在于那种环境中。

如何使用最少量的更改在C#代码中更改这些查询。我知道SQL调用应该在存储过程中,但我没有编写代码,并且没有做出那些改变的优势(至少目前不是这样)。

任何帮助或建议将不胜感激。在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

最简单的答案,也是最常见的答案,是确保模式名称始终在不同的环境中匹配。

如果不可能,表名之间是否有冲突?也就是说,是否有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

中进行选择

答案 1 :(得分:1)

您可以使用配置文件存储架构名称吗?这似乎是最简单的解决方案。

答案 2 :(得分:0)

好的,其中一些是特定于环境的(即:您的测试和生产环境之间的分离程度如何?)但是 - 假设您必须通过代码执行此操作:使用您的配置文件。

为您的Sql语句添加一个配置部分(我们称之为“SqlStatements”),然后为每个(当前)硬编码语句添加条目。

现在,在您的代码中,而不是:SqlCommand cmd = new SqlCommand("yourTextHere"),您可以从配置文件中调用正确的sql语句,然后运行您的sql。

然后,为测试环境和生产环境设置不同的配置文件。这也允许您在将来更改您的sql语句,而无需实际修改代码。

但是,正如您所说,更好的答案(如果您可以让您的老板同意)是将代码移至存储过程并调用它们。