Заявление: Эта статья была опубликована в журнале «Компьютерные приложения», том 23, выпуск 11.
Аннотация: При разработке различных систем использование хранимых процедур является хорошей привычкой, которая не только добавляет такие функции, как временные таблицы, функции и курсоры, но и Отладка, обновление и обслуживание становятся удобными. Однако почти все вызовы хранимых процедур находятся в одном и том же режиме, и основное отличие состоит в том, что параметры каждой хранимой процедуры различны. Итак, можно ли использовать метод для унификации всех вызовов хранимых процедур и сокращения ненужного программирования? На основе исследования базы данных SQL Server и ASP.NET мы реализовали унифицированный метод вызова. Этому методу необходимо только указать имя вызываемой хранимой процедуры и указать конкретные значения параметров при вызове, чтобы любые сохраненные. процедуру можно вызвать.
Ключевые слова: хранимая процедура, системная таблица, представление информационной структуры, ADO.NET Идентификационный код документа: ② Отчет о практических технических достижениях (технология), краткое изложение теоретического обучения и социальной практики (социальные науки).
Вызов хранимых процедур таким же образом в .NET.
Аннотация: Использование хранимых процедур — хорошая привычка при разработке проектов. Оно предоставляет временные таблицы, функции и курсоры, а также может принести пользу при отладке, обновлении и обслуживании. Однако почти все вызовы хранимых процедур выполняются по одному и тому же шаблону, в основном. разница между ними - это параметры каждой хранимой процедуры. Тогда можем ли мы вызывать хранимые процедуры одинаковым образом, несмотря на их различия, и сокращать программный код? Мы сделали это после изучения SQL Server и .NET. имя хранимой процедуры и значения ее параметров, вам не нужно создавать параметры самостоятельно. Ключевые слова: процедура Stord, системная таблица, информационная схема, ADO.NET.
Краткое описание: при разработке проекта вы часто вызываете метод. хранимые процедуры. Однако почти все вызовы хранимых процедур выполняются по одному и тому же шаблону. Основное различие заключается в типе и значении каждого создаваемого параметра. Итак, можно ли вызвать все хранимые процедуры через одну функцию (или класс)? В этой статье реализован единый метод вызова, основанный на принципе использования системных таблиц, предоставляемых базой данных. Этому методу необходимо только указать имя вызываемой хранимой процедуры и указать конкретные значения параметров при вызове, чтобы любые. хранимую процедуру можно вызвать.
Аннотация: Нам приходится вызывать хранимые процедуры систем баз данных во время разработки проекта. Однако вызовы хранимых процедур практически одинаковы, основное различие заключается в разнице между типом или значением параметров и т. д. Можем ли мы вызывать какие-либо хранимые процедуры через них? функция (или класс)? На основе системных таблиц, предоставляемых системами баз данных, мы написали класс для вызова любых хранимых процедур в этой статье. Для вызова хранимой процедуры вам необходимо указать только имя хранимой процедуры и. значение всех параметров хранимой процедуры.
<DIV class=text4><B>1. Введение</B></DIV>
При разработке различных систем использование хранимых процедур является хорошей привычкой. Оно не только добавляет такие функции, как временные таблицы, функции и курсоры, но также упрощает отладку, обновление и обслуживание. В процессе хранения данные могут быть обработаны, а затем возвращены, что может обеспечить больший анализ и контроль данных. При вызовах хранимых процедур мы обнаружили, что вызовы хранимых процедур происходят примерно по следующему шаблону:
1. Объявить SqlConnection
2. Объявите SqlCommand и задайте для его свойства Connection только что объявленный экземпляр SqlConnection, задайте для CommandName имя хранимой процедуры, а для CommandType — хранимую процедуру.
3. Добавьте все параметры, необходимые для вызовов хранимых процедур, в коллекцию параметров только что объявленного экземпляра SqlCommand 4. Вызовите метод ExecuteReader() класса SqlCommand, чтобы получить набор строк, возвращаемый хранимой процедурой.
4. Объявите SqlDataAdapter и DataSet, установите для свойства SelectCommand SqlDataAdapter экземпляр, объявленный в пункте 3, а затем вызовите его метод Fill, чтобы заполнить возвращенный набор строк в DataSet.
5. Закройте объект SqlConnection.
6. Освободите каждый экземпляр объявленного объекта (Примечание: 4 относится к двум методам извлечения данных. В ходе этого процесса вызова мы обнаружили, что почти все вызовы хранимых процедур находятся в этом режиме. Разница заключается в хранилище на шаге 2. Различные имена процессов). отличаются от параметров, используемых при каждом вызове хранимой процедуры на шаге 3. Они различаются именами параметров, направлениями, типами данных, длиной и т. д. Итак, есть ли способ реализовать все вызовы хранимых процедур? То есть вам нужно только указать имя хранимой процедуры, а затем передать значения параметров в вызывающий метод для реализации вызова хранимой процедуры, а затем использовать определенные структуры данных для сохранения возвращаемого набора строк, значений исходящих параметров и возвращаемые значения процесса. Изучив системные таблицы SQL Server, мы обнаружили, что эта идея осуществима.
2. Системные таблицы и представления информационной структуры
Реляционные базы данных, такие как SQL Server, каким-то образом хранят метаданные в базе данных. В SQL Server это системная база данных и системные таблицы. После установки SQL Server автоматически будут созданы четыре системные базы данных: master, model, msdb и tempdb. Основная база данных — это хранилище всей информации системного уровня в SQL Server. Учетные записи входа, параметры конфигурации, системные хранимые процедуры и существование других баз данных записываются в главную базу данных. В базе данных msdb хранится информация об агенте SQL Server. Когда задания, операторы и оповещения определены, они сохраняются в msdb. Модель — это шаблон для всех баз данных, созданных пользователем. При создании новой базы данных скопируйте модель и создайте необходимые объекты. tempdb сохраняет временные объекты в SQL Server. Для отображения созданных временных таблиц и временных хранимых процедур, а также временных объектов, созданных системой, используется база данных tempdb. [1] И каждая база данных имеет свои собственные системные таблицы. Эти системные таблицы используются для хранения конфигурации и информации об объектах. Из этих системных таблиц мы можем получить информацию обо всех параметрах каждой хранимой процедуры. Эта информация хранится в таблице syscolumns. В нашем методе необходимо использовать имена параметров, типы, длины, направления и т. д. Однако поля в системных таблицах будут меняться в зависимости от версии SQL Server. Например, type и xtype в системных столбцах являются примером таких изменений. Они оба хранят информацию о типе. Чтобы адаптировать наш метод к изменениям версий SQL Server, нам нужно использовать представление информационной структуры. ANSI-92 определяет представления информационной структуры как набор представлений, которые предоставляют системные данные. Используя это представление, вы можете скрыть реальные системные таблицы из вашего приложения. Изменения в системных таблицах не повлияют на приложения, поэтому приложения могут быть независимыми от производителей и версий баз данных. [1] ANSI-92 и SQL Server поддерживают использование трехсегментной структуры именования для ссылки на объекты на локальном сервере. Терминология ANSI-92 называется каталог.схема.объект, а SQL Server — база данных.владелец.объект. [1] Например, если мы хотим найти всю информацию о параметрах всех хранимых процедур, мы можем использовать: select * from INFORMATION_SCHEMA.PARAMETERS. Если мы хотим найти всю информацию о параметрах определенной хранимой процедуры, это: select. * из INFORMATION_SCHEMA.PARAMETERS где SPECIFIC_NAME ='Proc1 ' Благодаря представлению информационной структуры более половины наших проблем были решены. Далее мы рассмотрим, как реализовать наш метод в .NET.
3. Основное внимание в методе реализации уделяется тому, как получить всю информацию о параметрах хранимой процедуры на основе ее имени, а затем автоматически создать каждый параметр на основе этой информации о параметрах. Чтобы автоматизировать эти действия, процесс объявления SqlConnection, SqlCommand и SqlParameter, а также процесс создания каждого SqlParameter должны быть невидимы для пользователя. Единственное, что нужно указать пользователю, — это имя хранимой процедуры, а затем при вызове предоставить различные параметры, причем даже их типы указывать не нужно.
3.1 Получение и создание параметров хранимой процедуры Ключевым моментом является получение и создание параметров вызываемой хранимой процедуры. Мы можем автоматически реализовать этот шаг через представление информационной структуры.
// Получаем и создаем параметры хранимой процедуры
Private void GetProcedureParameter(params object[] параметры)
{ SqlCommand myCommand2 = new SqlCommand();
myCommand2.Connection = this.myConnection;
myCommand2.CommandText = "выберите * из INFORMATION_SCHEMA.PARAMETERS где SPECIFIC_NAME = '" + this.ProcedureName + "' порядок по ORDINAL_POSITION";
SqlDataReader Reader = null; Reader = myCommand2.ExecuteReader(); // Создаем возвращаемый параметр
myParameter = new SqlParameter();
myParameter.ParameterName = "@Value";
myParameter . SqlDbType = SqlDbType.Int;
myParameter.Direction = ПараметрDirection.ReturnValue;
myCommand.Parameters.Add(myParameter);
// Создайте каждый параметр. Здесь вы можете автоматически создать тип SqlParameter, значение, направление и другие атрибуты.
while(reader.Read())
{
myParameter = новый SqlParameter();
myParameter.ParameterName = читатель["PARAMETER_NAME"].ToString();
myParameter.Direction = читатель["PARAMETER_MODE"].ToString()=="IN" ?ParameterDirection.Input:ParameterDirection.Output;
switch(reader["DATA_TYPE"].ToString()) {
case "int" :
if(myParameter.Direction == ПараметрDirection.Input)
myParameter.Value = (int)parameters[i] ;
myParameter.SqlDbType = SqlDbType.Int
;
//...большая часть обработки конкретных типов опускается
по умолчанию :break;
myCommand.Parameters.Add
(myParameter)
;
3.2. Набор данных результата возврата, возвращаемое значение и набор исходящих параметров. После создания параметров хранимой процедуры мы можем вызвать хранимую процедуру. Потому что в .NET обычно используемыми классами, возвращающими наборы результатов, являются SqlDataReader и DataSet, а SqlDataReader можно использовать только при сохранении соединения, а DataSet — нет. В нашей реализации соединение должно быть отключено после вызова, поэтому для сохранения возвращенного набора результатов используется DataSet.
public SqlResult Call(params object[] параметры){ // SqlResult — это самоопределяемый класс, используемый для сохранения наборов данных результатов, возвращаемых значений и наборов исходящих параметров SqlResult result = new SqlResult(); // Определите собственное соединение как. необходимая строка
myConnection = new SqlConnection(ConnectionString);
myCommand = new SqlCommand(this.ProcedureName, myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlDataAdapter = new SqlDataAdapter(myCommand)
; // Получить и создать. Сохраняем параметры процедуры и устанавливаем значения
GetProcedureParameter(parameters);
myAdapter.Fill(result.dataSet, "Table" // Получаем пару значений исходящего параметра и имени хранимой процедуры и сохраняем ее в хэш-таблице. GetOutputValue(result) ; // Здесь освобождаем различные ресурсы и отключаем
myAdapter.Dispose();
myConnection.Close
();
myConnection.Dispose
();
4. Дальнейшая работа Хотя наша реализация здесь предназначена для базы данных SQL Server, этот метод можно использовать для любой базы данных, которая предоставляет представления информационной структуры, соответствует стандарту ANSI-92 или предоставляет метаданные. Мы инкапсулируем его в класс SqlProcedure, и хранимую процедуру можно легко вызвать при необходимости, что сокращает объем повторяющейся работы с кодом. Чтобы класс SqlProcedure поддерживал больше типов данных, в методе GetProcedureParameter() вам необходимо проанализировать тип, направление, длину, значение по умолчанию и другую информацию каждого параметра в соответствии с вашими потребностями, а затем создать этот параметр. По сути, таким способом можно реализовать любой тип, даже типы изображений. Таким образом, класс может быть очень общим и полезным в любом проекте.
Ссылки
[1] Рэй Рэнкинс, Пол Дженсен, Пол Бертуччи, Практическая книга по SQL Server 2000, Пекин: Electronic Industry Press, 2002.
[2] Библиотека MSDN, январь 2003 г., Microsoft Corporation.
Об авторе: Лю Чжибо (1979-), мужчина, из Синьхуа, провинция Хунань, степень магистра, основные направления исследований: нейронные сети и распознавание образов, информационная система автоматизации делопроизводства.
электронная почта: [email protected]