SqlDataClient不使用using语句,但在包含完整命名空间时起作用

时间:2016-03-16 17:43:19

标签: c# visual-studio visual-studio-2015

我正在将项目从VB转换为C#,我遇到了SqlClient的问题。我的课程广泛使用SqlConnectionSqlCommand。为了开始转换,我创建了一个新的类库,并慢慢地在c#中重新创建了我的所有文件。我一直在SqlClient下遇到一个红色的波形,所以我在文档顶部添加了一个using语句,using System.Data.SqlClient;并且......它没有做任何事情。我仍然有大量的以下错误......

  

命名空间名称的类型' SqlClient'找不到(你是否错过了使用指令或程序集引用?)

我点击了灯泡,Visual Studio建议我将SqlClient.SqlConnection conn = null替换为System.Data.SqlClient.SqlConnection conn = null。更换后它实际上变成了灰色。我再次嘲笑它找到了

  

名称可以简化

当我选择该选项时,它会从通话中删除整个System.Data.SqlClient字符串,并留下SqlConnection conn = null

所以看起来好像使用System.Data.SqlClient允许我直接访问SqlConnection和其他方法,但它不会让我引用SqlClient。我已经有using System.Data;,当我输入" Sql"唯一的自动完成建议是" SqlDbType"

世界上哪里是SqlClient

2 个答案:

答案 0 :(得分:1)

System.Data.SqlClient是命名空间,而不是实际类型。您可以在代码顶部添加using System.Data.SqlClient;语句,然后直接引用在该命名空间中分组的公共(导出)类型,而不必将命名空间作为该类型的前缀。简而言之,命名空间是一种组织/分组类型的方法,以避免名称冲突并允许类型组织。

示例1 - 使用语句

using System.Data.SqlClient;

namespace MyNamespace {
    public class MyClass {
        public void TestMethod(){
            SqlConnection myConnection = null; // no need for a namespace prefix
            System.Data.SqlClient.SqlConnection myConnection2 = null; // this is ok too, the namespace is redundant but that is fine
        }
    }
}

示例2 - 没有使用声明

// using System.Data.SqlClient; // no using statement

namespace MyNamespace {
    public class MyClass {
        public void TestMethod(){
            // SqlConnection myConnection = null; // this line would not compile if you remove the comment because the compiler cannot find a global type SqlConnection 
            System.Data.SqlClient.SqlConnection myConnection2 = null; // you need a namespace because there is no using statement at the top so no shortcuts
        }
    }
}

答案 1 :(得分:1)

在VB.NET中,您可以"导入"使用内部命名空间的父命名空间和引用变量:

Foo.vb:

Namespace Outer
    Namespace Inner
        Public Class Foo
        End Class
    End Namespace
End Namespace

Program.vb:

Imports Outer

Public Class Program
    Dim f As Inner.Foo
End Class

但是,在C#中,你不能这样做 - 你必须在顶部放置using完整的命名空间,或者完全限定代码中的类型:

using Outer.Inner;

public class Program {
    Foo foo;
}

public class Program {
    Outer.Inner.Foo foo;
}

C#中的例外情况是,如果您在自己的命名空间中,则可以使用相对名称空间:

Foo.cs

namespace Outer {
    namespace Inner {
        public class Foo { }
    }
}

Program.cs的

namespace Outer { // Or this could even be Outer.SomethingElse
    public class Program {
        Inner.Foo foo;
    }
}