2013-08-17 103 views
1

我正在研究三层体系结构。我需要通过业务层在UI中通过数据访问层传递服务器名称。对于传递值,我使用属性,我成功地获取了我的数据层中的值。但是当我尝试连接字符串以生成数据库连接的数据源时,它会传递空值。字符串串联问题c#

我的代码:

public class dataLayer: IDisposable 
{ 
    private string serverName; 
    private string name; 
    private string ceConnString; 

    public string ServerName 
    { 
     get { return serverName; } 
     set { serverName = value; } 
    } 

    public dataLayer() 
    { 
     //First Try - Using Simple Concatination 
     name = @"\\" + ServerName + @"\foldername\Database.sdf;"; 
     //result - name = \\\\\\foldername\Database.sdf 

     //Second Try - Using String Builder 
     StringBuilder build = new StringBuilder(); 
     build.Append("\\\\"); 
     build.Append(ServerName); 
     build.Append("\\foldername\\Database.sdf;"); 
     string namebuilder = build.ToString(); 
     //result - namebuilder = \\\\\\foldername\Database.sdf 

     //Third Try - Using Path 
     string line = Path.Combine("\\\\", ServerName, \\foldername\\Database.sdf;"); 
     //result - line = \\\\\\foldername\Database.sdf 

     ceConnString = "data source=" + name; 
    } 

我想要的输出\\服务器名称\文件夹\ Database.sdf

+0

你在哪里初始化'ServerName'? – Itay

+0

为什么在尝试1和2之间使用并拒绝“@”“'?或者只是在*尝试*? – CodeBeard

回答

2

当你打电话给你的类的构造函数实例属性ServerName是仍处于它的默认值(NULL),你需要改变的构造以这种方式

public dataLayer(string serverName) 
{ 
    this.ServerName = serverName; 

    name = @"\\" + ServerName + @"\foldername\Database.sdf;"; 
    .... 

} 

,并呼吁大家课以这种方式

dataLayer dl = new dataLayer(yourServerName); 
+0

无需额外的上下文即可进行简单串接。但是,如果在简单连接的背景下发生的多个字符串构造可能导致效率低下,则建议使用“StringBuilder”或“String.Format”。上面是:'String.Format(@“\\ {0} \ foldername \ Database.sdf”,ServerName);' – CodeBeard

+0

有没有办法做到这一点,没有构造函数 –

+0

@CodeBeard错了。只有当你不知道要连接多少个字符串时,StringBuilder才有意义。使用3个连接时,使用简单的+运算符或字符串会更高效.Content http://www.dotnetperls.com/string-concat – Steve

0

尽管您可能想使用string.Format,但我认为使用Path类构建路径更简洁。你几乎已经使用它了,但是你得到了额外的东西,因为你没有想到Path.Combine会在段之间插入额外的东西。试试这个(在单元测试中):

var unc = Path.Combine(@"\\", ServerName, @"foldername\Database.sdf"); 

Assert.AreEqual(@"\\MyHost\foldername\Database.sdf", unc); 
+0

我认为隐含的测试驱动方法应该在这里进行评论。 @ user1665570 - 在这些场景中使用TDD确实有所帮助。它会暴露你的耦合,为什么'ServerName'是一个依赖项。 – CodeBeard

+0

其实我不能使用AreEqual方法,因为我会得到不同的服务器名称。我通过网络远程连接它。 –

+0

@ user1665570你的单元测试应该有明确给定的必要上下文或模拟。因此,您可以测试代码独立执行的操作,并且不需要网络。 – CodeBeard