Hassan Y. Ansari Ответов: 2

Почему с помощью системы недостаточно, чтобы использовать систему.данных.поставщики sqlclient


Почему мы должны использовать using System.Data.SqlClient для работы с Sql? Я задаю этот вопрос, потому что если мы используем using System, то она должна автоматически включать все пространства имен, которые находятся в этом системном пространстве имен. Я новичок в области программирования. То, что я понимаю до сих пор, это то, что есть пространство имен System, а внутри него-пространство имен Data, а еще дальше-еще одно пространство имен с именем SqlClient.

Что я уже пробовал:

Я изучаю технологии dot net и пытался использовать объект Sqlconnection в своей программе, но он показывает ошибку.

2 Ответов

Рейтинг:
0

F-ES Sitecore

Использование "системы" не включает в себя все, что под ней находится. Без использования операторов вам нужно полностью квалифицировать пространство имен так;

System.Data.SqlClient.SqlConnection


С помощью "using System" он добавит "System" к вашим классам, чтобы попытаться получить совпадение, так что это будет работать

Data.SqlClient.SqlConnection


С помощью "using System.Data" это будет работать

SqlClient.SqlConnection


Как вы можете видеть, он просто добавляет ваши различные фрагменты "using" в начало типов, которые не являются полностью квалифицированными, пока не получат хит. Поэтому, если вы хотите использовать просто "SqlConnection", вам понадобится полный "using System.Data.SqlClient"


Рейтинг:
0

OriginalGriff

До тех пор, пока ваш проект ссылается на систему.Данные - и это должно быть по умолчанию, если вы не использовали "нечетный" шаблон проекта, то все, что вам нужно использовать, это проверить .CS - файл и убедитесь, что у вас есть обе эти строки в верхней части файла:

using System.Data;
using System.Data.SqlClient;
Если эти строки не показывают никакой ошибки (то есть ни одна из них не подчеркнута красным цветом), то вы можете использовать SqlConnection, SqlCommand, и так далее очень легко:
using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT Id, description FROM myTable", con))
        {
        using (SqlDataReader reader = cmd.ExecuteReader())
            {
            while (reader.Read())
                {
                int id = (int) reader["Id"];
                string desc = (string) reader["description"];
                Console.WriteLine("ID: {0}\n    {1}", id, desc);
                }
            }
        }
    }
Если какой-либо из этих кодов подчеркнут красным цветом (за исключением строки подключения в первой строке), то у вас есть проблема.

Кроме этого, вам строго не нужно using линии для системы.Data или System.Data.SqlClient: вы можете давать полное имя класса каждый раз, когда используете их:
using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strConnect))
    {
    con.Open();
    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("SELECT Id, description FROM myTable", con))
        {
        using (System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader())
            {
            while (reader.Read())
                {
                int id = (int)reader["Id"];
                string desc = (string)reader["description"];
                Console.WriteLine("ID: {0}\n    {1}", id, desc);
                }
            }
        }
    }
Добавление using операторы просто сокращают набор текста и делают его более читабельным, вот и все.


Hassan Y. Ansari

Большое спасибо вам обоим за ответ. Но у меня другой вопрос. Предположим, я объявляю одно пространство имен с именем "namespace1", а внутри него объявляю один класс с именем "HelloWorld". После этого, если я хочу использовать класс "HelloWorld" в своем проекте позже, я должен использовать оператор "using namespace1". Когда я это сделаю, то смогу использовать класс "HelloWorld" без использования полного имени.
Теперь, если я объявлю еще одно пространство имен с именем "namespace2" под объявлением "namespace1". Когда я использую оператор "using namespace1", он должен автоматически предоставлять доступ к "namespace2" также, как и после включения namespace1, я смогу использовать класс "HelloWorld". Как класс "HelloWorld", так и "namespace2" объявлены в разделе "namespace1", поэтому он разрешает доступ только к классу "HelloWorld", а не к пространству имен "namespace2".

OriginalGriff

Это действительно так - но только тогда, когда вы используете второе имя пространства имен для явного префикса классов внутри него:
используя Namespace1;
...
ClassInNS1 c1 = новый ClassInNs1();
Namespace2.ClassInNS2 = новый Namespace2.ClassInNS2();

Если вы подумаете об этом, если это сработает:
используя Namespace1;
...
ClassInNS1 c1 = новый ClassInNs1();
ClassInNS2 = новый ClassInNS2();

Тогда может ли это вызвать проблемы?
Да, это возможно - очень легко.
Существует только так много "хороших имен" для методов, свойств, полей и событий - так что довольно часто можно записать метод "Load" или "Save" в класс, например. И сами имена классов, как правило, одинаковы - разные пространства имен часто содержат одни и те же имена классов, потому что они, как правило, делают по крайней мере некоторые из тех же вещей.
Если оператор using добавит каждый подкласс (а также их подклассы), то вы увеличите количество потенциальных дубликатов имен, а затем вам придется добавлять полное полное имя при все большем и большем использовании классов.
И... если это так, то когда вы видите имя класса, вы не знаете, где оно находится - оно может быть в NS1 или NS1.NS2 - вы, как разработчик, должны пойти и проверить, как оно работает.

Сделав "using" только "bring in" единственным именованным пространством имен, вы не получите этих проблем - если вам нужны классы Namespace1, вы добавляете их в список using. Если Вам также нужны классы Namespace1.Namespace2, вы явно добавляете их.
Помните, что "использование" вовсе не обязательно - вы можете удалить их все и использовать полные имена, если хотите, - это просто делает вещи немного проще для всех нас, а не является универсальным решением "один размер подходит всем"!