* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Команды для манипулирования данными
8 февраля 2009
Объект Command содержит ссылку на хранимую процедуру БД или оператор SQL и способен исполнить этот оператор на источнике данных, используя активное со- единение. Объект Command также содержит все данные, необходимые для исполне- ния команды: ссылку на активное соединение, текст команды и ее параметры. Подобно другим классам компонентов провайдера данных, класс Command пред- ставлен двумя вариантами. Первый, OleDbCommand, разработан для взаимодействия с самыми разными типами БД, a SqlCommand — только для БД SQL Server 7.0 и выше.
Для класса Command достаточно активного соединения, взаимодействие с объек- том DalaAdapter ему не требуется. В силу этих причин объекты Command очень бы- стро и эффективно взаимодействуют с различными БД, позволяя: • исполнять команды, не возвращающие значения, например INSERT, UPDATE и DELETE; • исполнять команды, возвращающие единственное значение; • исполнять команды языка Database Definition Language (DDL), например CREATE TABLE и ALTER; • работать с объектом DataAdapter, возвращающим объект DalaSet; • возвращать результирующий набор непосредственно через экземпляр объекта DataReader — это самый быстрый способ доступа к данным, он особенно удо- бен, если данные требуются только для чтения; • возвращать результирующий набор в виде потока XML — эту возможность под- держивает только класс SqlCommand; • возвращать результирующий набор, созданный на основе нескольких таблиц или в результате исполнения нескольких операторов. Создание и настройка команд Есть три способа создания команды для манипулирования данными: • перетаскивание хранимой процедуры из окна Server Explorer в окно дизайнера; • перетаскивание объекта SqlCommand (или OleDbCommand) с вкладки Data пане- ли Toolbox в окно дизайнера с последующей его настройкой; • объявление и создание экземпляра объекта Command соответствующего типа в коде с последующей его настройкой вручную. Первый способ — самый простой. Он позволяет автоматически создавать объект Command на основе любой хранимой процедуры БД. В результате перетаскивания хранимой процедуры в окно дизайнера создается объект Command соответствующе- го типа. Новый объект команды ссылается на хранимую процедуру, позволяя вы- зывать ее в любое время без дополнительной настройки. Чтобы создать объект Command, ссылающийся на имеющуюся хранимую проце- дуру, перетащите хранимую процедуру из окна Server Explorer в окно дизайнера — в результате будет создан и сконфигурирован экземпляр объекта Command. Создание объекта Command нужного типа при помощи интерфейса дизайнера не многим сложнее: перетащите SqlCommand или OleDbCommand с вкладки Data панели Toolbox в окно конструктора. Создав объект Command, сконфигурируйте его, установив свойства Connection, CommandType и CommandText. Свойство CommandType определяет тип команды, содержащийся в свойстве CommandText, оно может принимать одно из следующих значений: • Text — заставляет рассматривать значение свойства CommandText как текст ко- манды SQL, при этом в свойстве CommandText должен быть один или несколько допустимых операторов SQL, разделенных точкой с запятой. В последнем слу- чае операторы SQL выполняются по порядку; • StoredProcedure — в этом случае в свойстве CommandText необходимо указать имя существующей хранимой процедуры — она будет исполнена при вызове данной команды; • TableDirect — в этом случае в свойстве CommandText должно быть имя одной или нескольких таблиц. При исполнении эта команда вернет все столбцы и строки таблиц, заданных свойством CommandText. Свойство Connection следует устанавливать в соответствии с типом активного со- единения: для объекта SqlCommandтребуется соединение на основе объекта SqlConnectt'on, а для OleDbCommand — соединение на основе OleDbConnection. Исполнение команд Оба типа объектов Command поддерживают три метода, позволяющих исполнить команду, которую он представляет: • Execute Non Query • ExecuteScalar • ExecuteReader Класс SqlCommand дополнительно поддерживает метод ExecuteXml Reader, Все эти методы исполняют на источнике данных команду, представленную объектом Command, отличаются они возвращаемым значением. Метод Execute- NonQuery — самый простой из них, он не возвращает никаких значений. Этот ме- тод обычно применяют для вызова команд SQL и хранимых процедур, таких, как INSERT, UPDATE или DELETE. Кроме того, вызов этого метода — единственный способ исполнения в ADO.NET команд DDL, например CREATE или ALTER. Метод ExecuteScalar возвращает только значение первого поля первой строки, из- влеченной заданной командой, независимо от того, сколько строк выбрано этой командой в действительности. ExecuteReader возвращает неизменяемый объект DataReader, допускающий только последовательный однонаправленный просмотр без использования объекта DataAdapter. Если не требуется модифицировать содер- жимое БД или как-то иначе манипулировать им, этот способ извлечения данных является самым быстрым и эффективным. Класс SqlCommand поддерживает допол- нительный метод — ExecuteXml Reader, возвращающий результирующий набор в формате XML; результаты возвращаются в виде неизменяемого объекта XmlReader, доступного только для последовательно однонаправленного просмотра. Параметры Команды для манипулирования данными часто вызываются с параметрами, при этом некоторые элементы команды становятся известными только в период выпол- нения, Давайте рассмотрим приложение для учета товаров в книжном магазине. В нем следует предусмотреть функцию поиска книг по названию, которую можно реализовать посредством запроса к БД на основе подобного оператора SQL: SELECT * FROM Books WHERE (Title LIKE [value]) Уже в период разработки ясно, что потребуется возможность поиска книг по на- званию, заданному пользователем в период выполнения. Поскольку значение, ко- торое введет пользователь, заранее неизвестно, необходим некоторый механизм для передачи введенного значения оператору SQL во время выполнения. Параметры — это значения, которыми заполняют поля подстановки, введенные в текст команды во время разработки. Каждый параметр представлен экземпляром класса OleDbParameter или SqlParameter, в зависимости от типа провайдера. Пара- метры хранятся в свойстве Parameters объекта Command. В период выполнения зна- чения параметров считываются из этого свойства и подставляются в оператор SQL либо передаются хранимой процедуре. Объекты Command поддерживают набор Parameters, в котором хранятся объекты Parameter соответствующего типа. Ниже перечислены некоторые свойства объектов Parameter. • DbType (не отображается в окне дизайнера) • Direction • OleDb Type (только для объекта OleDb Parameters) • ParameterName • Precision • Scale • Size • SourceCoiumn • Source Version • SQL Type (только для SQLParameters) Value Свойства DbTypew OleDb Type объекта OleDb Parameters взаимосвязаны. Первое представляет тип параметра так, как тот представлен в обшей системе типов (CTS), а второе — как он представлен в БД; это необходимо, поскольку не все БД совмес- тимы с CTS. Объект Parameter выполняет преобразование параметров из типа, ис- пользуемого в приложении, в тип, используемый в БД. Поскольку эти свойства вза- имосвязаны, при изменении значения одного из них значение другого автомати- чески изменяется и преобразуется в соответствующий поддерживаемый тип. Ана- логичным образом связаны свойства DbType и SqlType объектов SqlParameter, свой- ство SqlType указывает тип БД SQL, представленный этим параметром. Свойство Direction объекта параметра определяет, является ли этот параметр входным или выходным. Возможные значения для этого свойства — Input, Output, InputOutput или ReturnVaSue — указывают, должен ли параметр хранить значение, возвращаемое хранимой процедурой или функцией. На члены набора Parameters ссылаются в коде по индексу либо по имени, задан- ному свойством ParameterName. Ниже показаны два способа установки значения первого по счету параметра с именем myParameter. Visual Basic .NET 1 Эта команда устанавливает значение параметра, ссылаясь на него по индексу. QleDbCommandl.Parameters(O).Value = "Hello World" 1 Эта строка устанавливает значение параметра, ссылаясь на него по имени. QleDbCommand1.Parameters("myParafneter").Value = "Goodbye for now" Visual C# // Эта команда устанавливает значение параметра, ссылаясь на него по индексу. DleDbCommand1.Parameters[0].Value = "Hello World"; // Эта строка устанавливает значение параметра, ссылаясь на него по имени, OleObCommand1.Parameters["myParameter"].Value - "Goodbye for now"; Свойства Precision, Scale и Size определяют длину и точность значения парамет- ров. Precision и Scale применяются с числовыми и десятичными параметрами и опре- деляют разрядность и длину дробной части значения свойства Value соответствен- но, a Size применяется с двоичными и строковыми параметрами и представляет максимальную длину такого поля. Свойства Source Column и SourceVersion используются с параметрами, привязан- ными к полям объекта DataTable. SourceColumn указывает поле для поиска или со- поставления значений, a SourceVersion — версию поля для редактирования. Свойство Value содержит значение параметра. Если свойство CommandType объекта Command установлено в Text, необходимо предусмотреть поля подстановки для всех параметров оператора SQL. В случае объекта OleDbCommand поле подстановки обозначается символом «?», например: SELECT Empld, Title, FirstName, LastName FROM Employees WHERE (Title = ?) Здесь знаком вопроса указано место подстановки параметра. Допускается также указывать несколько параметров следующим образом: SELECT Empld, Title, FirstName, LastName FROM Employees WHERE (FirstName - ?) AND (LastName = ?) Если в тексте команды имеется несколько полей для подстановки параметров, порядок их заполнения определяется порядком элементов набора Parameters. С объектом SqlCommand применяют именованные параметры. Чтобы создать поле подстановки для именованного параметра, необходимо указать имя параметра (так. как оно задано свойством ParameterName), предварив его символом «@». На- пример, в следующем операторе SQL объявлено поле для подстановки именован- ного параметра Title: SELECT Empld. Title, FirstName, LastName FROM Employees WHERE (Title = PTitle) Ниже описаны способы исполнения команд различных типов при помощи объектов Command. Ь Как при помощи объекта Command исполнить команду, не возвращающую значений Так исполняют команды INSERT, UPDATE и DELETE, а также команды DDL, такие, как CREATE TABLE и ALTER. 1. Для исполнения хранимой процедуры установите свойство CommandType в Stored Procedure, а для исполнения оператора SQL — в Text. 2. Запишите в свойство CommandText имя хранимой процедуры или строку опера- тора SQL соответственно. 3. Объявите все необходимые параметры и присвойте им соответствующие зна- чения. 4. Вызовите метод Command.ExecuteNonQuery, например, так: Visual Basic .NET Эту команду одинаково вызывают при использовании как класса OleDbComrnand, так и SqlConirnand. myCommand.ExecuteNonQuery() Visual C# // Эту команду одинаково вызывают при использовании // как класса OleDbCornmand, так и SqlCommand, myComrriand. ExecuteNonQuery(); > Как при помощи объекта Command исполнить команду, возвращающую един ственное значение 1. Для исполнения хранимой процедуры установите свойство Command!уре в StoredProcedure, а для исполнения оператора SQL — в Text. 2. Запишите в свойство CommandTextимя хранимой процедуры или строку опера- тора SQL соответственно. 3. Объявите все необходимые параметры и присвойте им соответствующие значения. 4. Вызовите метод Command.ExecuteScalar, например, так: Visual Basic .NET Эту команду одинаково вызывают при использовании 1 как класса OleDbCommand, так и SqlCommand. Dim 0 As Object О = myCommand.ExecuteScalar() Visual C# // Эту команду одинаково вызывают при использовании // как класса OleDbCommand, так и SqlCornmand. Object 0; О = myCommand. ExecuteNonScalarO;