Как, и обещали, здесь мы
рассмотрим как получить результат
выполнения хранимых процедур. Для этого
надо всего лишь поменять значение
параметра направления на ParameterDirection.Output.
Ниже приведен пример кода
на C Sharp:
SQL Provider
using System.Data;
using System.Data.SQL;
public class SQLConnect {
private SQLConnection dataConn = null;
private SQLDataReader reader = null;
public string openConnection(HttpResponse Response,String
dbConnectString,String cmdString) {
try {
dataConn = new SQLConnection(dbConnectString);
SQLCommand sqlCmd = new SQLCommand(cmdString,dataConn);
sqlCmd.CommandType = CommandType.StoredProcedure;
SQLParameter param = sqlCmd.Parameters.Add(new
SQLParameter("@CustomerID", SQLDataType.Char, 5));
param.Direction = ParameterDirection.Input;
sqlCmd.Parameters["@CustomerID"].Value = "ALFKI";
param = sqlCmd.Parameters.Add(new SQLParameter("@output",
SQLDataType.Int));
param.Direction = ParameterDirection.Output;
dataConn.Open();
sqlCmd.Execute(out reader);
Response.Write("<table><tr><td><b>Product Name</b></td>");
Response.Write("<td><b>Total</b></td></tr>");
while (reader.Read()) {
Response.Write("<tr>");
Response.Write("<td>");
Response.Write(reader["ProductName"].ToString());
Response.Write("</td><td>");
Response.Write(reader["Total"].ToString() + "</td>");
Response.Write("</tr>");
}
Response.Write("</table>");
Response.Write(sqlCmd.Parameters["@output"].Value;
return "<p>SQL Server Data Connection Opened";
}
catch (Exception e) {
return(e.ToString());
}
finally {
if (reader != null) {
reader.Close();
}
if (dataConn != null) {
dataConn.Close();
}
}
}
} // End Class
|
ADO+ Provider:
using System.Data;
using System.Data.ADO;
public class ADOConnect {
private ADOConnection dataConn = null;
private ADODataReader reader = null;
public string openConnection(HttpResponse Response,String
dbConnectString,String cmdString) {
try {
dataConn = new ADOConnection(dbConnectString);
ADOCommand adoCmd = new ADOCommand(cmdString,dataConn);
adoCmd.CommandType = CommandType.StoredProcedure;
ADOParameter param = null;
param=adoCmd.Parameters.Add("@CustomerID", ADODBType.Char, 5);
param.Direction = ParameterDirection.Input;
adoCmd.Parameters["@CustomerID"].Value = "ALFKI";
param = adoCmd.Parameters.Add("@output",ADODBType.Integer);
param.Direction = ParameterDirection.Output;
dataConn.Open();
adoCmd.Execute(out reader);
Response.Write("<table><tr><td><b>Product Name</b></td>");
Response.Write("<td><b>Total</b></td></tr>");
while (reader.Read()) {
Response.Write("<tr>");
Response.Write("<td>");
Response.Write(reader["ProductName"].ToString());
Response.Write("</td>");
Response.Write("<td>");
Response.Write(reader["Total"].ToString());
Response.Write("</td></tr>");
}
Response.Write("</table>");
Response.Write(adoCmd.Parameters["@output"].Value;
return "<p>ADO Server Data Connection Opened";
}
catch (Exception e) {
return(e.ToString());
}
finally {
if (reader != null) {
reader.Close();
}
if (dataConn != null) {
dataConn.Close();
}
}
}
} //End Class
|
Возвращаемые значения
процедур легко получаются следующим
образом:
param = sqlCmd.Parameters.Add(new SQLParameter("RT_VAL", SQLDataType.Int));
param.Direction = ParameterDirection.ReturnValue;
...
Response.Write(sqlCmd.Parameters["RT_VAL"].Value;
|
ADO+ Provider:
param = adoCmd.Parameters.Add("RETURN_VALUE", ADODBType.Integer);
param.Direction = ParameterDirection.ReturnValue;
...
Response.Write(adoCmd.Parameters["RETURN_VALUE"].Value;
|
The DatasetCommand object. Как мы уже
выяснили, Command Object может выполнять SQL
запросы и хранимые процедуры. DatasetCommand
object предоставляет ту же
функциональность плюс дает возможность
взаимодействовать с Dataset object. Вы можете
работать с DatasetCommand так же, как и с Command, но
появляется возможность поместить
полученные данные в Dataset object. Ниже
показан пример объявления и
использования DatasetCommand object. Легко
увидеть, что код - тот же самый за
исключением того, что используются
другие имена объектов.
SQL Provider:
dataConn = new SQLConnection(dbConnectString);
SQLDatasetCommand dsCmd = new SQLDatasetCommand(cmdString,dataConn);
ADO+ Provider:
dataConn = new ADOConnection(dbConnectString);
ADODatasetCommand dsCmd = new ADODatasetCommand(cmdString,dataConn);
Эти примеры заполнят
некий Dataset данными, полученными при
исполнения SQL скрипта. Например, SELECT * FROM
Orders заполнит Dataset всеми колонками и
строками, найденными в таблице Orders. Dataset
может делать гораздо больше, чем просто
помещать данные в Dataset. Возможно
выполнение практически всех операций
над БД, то есть он может быть объявлен
как update, insert, delete Сommand. Например, вместо
того, чтобы каждый раз предоставлять имя
хранимой процедуры, используемой для
обновления БД, вы можете объявить
однажды метод Update() и вызывать его каждый
раз при необходимости. Теперь, после
того, как были сделаны изменения в Dataset
dsOrders вы можете легко обновлять источник
данных с помощью вызова Ds.Update(dsOrders)
Следующая наша статья
будет полностью посвящена Dataset object и
вариантам его использования.