2013-12-16 78 views
1

我有2个DB,Building和Contact,以及一个从Building DB building_sp执行的存储过程。如何让存储过程从当前执行范围外引用数据库

building_sp需要内联系更新表,TblContact,和他们的方式我一直在引用它是由

[Contact].dbo.[TblContact] 

由于联系表可以任意命名,我需要删除这种依赖性。

提供给我的选项是

  • 移动存储过程逻辑的代码(即.NET控制器,其中联系人数据库名称可以在Web服务配置文件进行设置)。
  • 将建筑物数据库中的联系人DB名称存储在元表/行中。
  • 将包含Contact DB名称的字符串变量传入building_sp。

对此的任何建议或帮助将被赞赏,即使只是粗略的想法或部分答案。谢谢。

回答

1

我会选择option1:拥有2个DataAccess组件,一个用于Building,一个用于联系并让.NET组件(控制器)在事务内的DAL上调用操​​作(请参阅TransactionScope类)。

为什么?

  • 之后,你可能会决定搬完2个数据库在不同的 机
  • 避免低耦合
  • 随后,您可能有第三个DB调用,让你有2个2个DB名称或访问许多来自你的SP的数据库
  • 你可能需要调用其他服务(例如发送邮件),并且在.NET中进行这种操作更自然。
  • 尊重开放/关闭原则:如果更新联系人更改逻辑将不需要触摸构建逻辑,所以影响较小,l参与测试ESS时间,降低机会产生回归
  • 我让别人在这里添加其他原因...
+0

这是不是一个选项的原因是简单的B/C我不喜欢,或有时间,重新实现存储的过程。我只在SqlLite数据库的代码中完成了事务,但尚未在MSSql数据库上完成。 – samosaris

+0

@SamusArin:在这种情况下,考虑到链接服务器或同义词... –

+0

我已经在Web配置中指定了与Building DB的连接,并且使用此连接从控制器中启动了building_sp。我可以在这个配置文件中添加另一行来指定联系人数据库,可能是一个字符串字面值,或者是一个排序连接,然后引用这个“配置变量”或来自building_sp的连接? – samosaris

0

我结束了在一个web.config设置应用存储的联系人数据库名称

<configuration> 
    … 
    <appSettings> 
    … 
    <add key="ContactDBName" value="ContactDataBase"/> 
    </appSettings> 
    … 
</configuration> 

我再从的Application_Start()

public class WebApiApplication : System.Web.HttpApplication 
{ 
    public static string ContactDBName; 

    protected void Application_Start() 
    { 
     ...   
     ReadContactDBNameFromConfig(); 
    } 

    protected void ReadContactDBNameFromConfig() 
    { 
     System.Configuration.Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/WebServiceName"); 
     System.Configuration.KeyValueConfigurationElement contactDBNameElement = rootWebConfig.AppSettings.Settings["ContactDBName"]; 

     ContactDBName = contactDBNameElement.Value; 
    } 
} 

我也存储在存储过程转换成字符串读这为全球性的静态字符串,使用“PLA ce holder“字面值”{0}“作为DB名称。

public static string BUILDING_SP = 
@"BEGIN TRANSACTION 
    ... 
    UPDATE [{0}].[dbo].[TblContact] 
    SET param1 = @Param1, 
     param2 = @Param2, 
     ... 
    WHERE record_id = @RecordID 
    ...  
COMMIT"; 

然后我用的String.Format设置占位与DB名称

string sql = String.Format(BUILDING_SP, WebApiApplication.ContactDBName); 

这个字符串,然后通过SqlCommand对象执行。

相关问题