我正在将项目从VB转换为C#,我遇到了SqlClient
的问题。我的课程广泛使用SqlConnection
和SqlCommand
。为了开始转换,我创建了一个新的类库,并慢慢地在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
?
答案 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;
}
}