powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Использование OracleDataReader в [WebMethod]
15 сообщений из 15, страница 1 из 1
Использование OracleDataReader в [WebMethod]
    #32849980
HoTicE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему вот так работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
[WebMethod]
public DataSet getStreet(string stStName) 
{
	OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
	OracleCommand cmd = conn.CreateCommand();
	cmd.CommandType = CommandType.StoredProcedure;
	cmd.CommandText = "PRIVATE_RECEPTION.PKG_SPR.get_street";
	cmd.Parameters.Add("t_streetName", OracleType.VarChar, 30 ).Value = stStName;
	cmd.Parameters.Add(new OracleParameter("t_cr", OracleType.Cursor)).Direction = ParameterDirection.Output;

	OracleDataAdapter adapter = new OracleDataAdapter();
	adapter.SelectCommand = cmd;
			
	DataSet ds = new DataSet();
			
	adapter.Fill(ds);
	ds.Tables[ 0 ].TableName="streets";
	return ds;
}
а вот так нет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[WebMethod]
public OracleDataReader getStreet(string stStName) 
{
	OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
	OracleCommand cmd = conn.CreateCommand();
	cmd.CommandType = CommandType.StoredProcedure;
	cmd.CommandText = "PRIVATE_RECEPTION.PKG_SPR.get_street";
	cmd.Parameters.Add("t_streetName", OracleType.VarChar, 30 ).Value = stStName;
	cmd.Parameters.Add(new OracleParameter("t_cr", OracleType.Cursor)).Direction = ParameterDirection.Output;

	conn.Open();
	OracleDataReader Rd = cmd.ExecuteReader(CommandBehavior.CloseConnection);

	return Rd;
}
???
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850082
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем именно проблема? Что значит "не работает"? Не компилируется? Выкидывает исключение? Или еще что?
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850114
HoTicE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компилится нормально.
но вот когда заходишь на asmx страничку то говорит
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Server Error in '/websrv' Application.
--------------------------------------------------------------------------------

Object reference not set to an instance of an object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.]
   System.Xml.Serialization.XmlAttributes..ctor(ICustomAttributeProvider provider) + 105 
   System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type) + 106 
   System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, Boolean canBePrimitive, MemberInfo memberInfo) + 1463 
   System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference) + 50 
   System.Xml.Serialization.XmlReflectionImporter.ImportMemberMapping(XmlReflectionMember xmlReflectionMember, String ns, XmlReflectionMember[] xmlReflectionMembers) + 34 
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement) + 300 

[InvalidOperationException: There was an error reflecting 'getStreetResult'.]
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement) + 607 
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(String elementName, String ns, XmlReflectionMember[] members, Boolean hasWrapperElement) + 108 
   System.Web.Services.Protocols.SoapReflector.ImportMembersMapping(XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, Boolean serviceDefaultIsEncoded, Boolean rpc, SoapBindingUse use, SoapParameterStyle paramStyle, String elementName, String elementNamespace, Boolean nsIsDefault, XmlReflectionMember[] members, Boolean validate) + 169 
   System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) + 2927 

[InvalidOperationException: Method nw.getStreet can not be reflected.]
   System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) + 5494 
   System.Web.Services.Description.SoapProtocolReflector.ReflectMethod() + 130 
   System.Web.Services.Description.ProtocolReflector.ReflectBinding(ReflectedBinding reflectedBinding) + 1951 
   System.Web.Services.Description.ProtocolReflector.Reflect() + 506 
   System.Web.Services.Description.ServiceDescriptionReflector.ReflectInternal(ProtocolReflector[] reflectors) + 495 
   System.Web.Services.Description.ServiceDescriptionReflector.Reflect(Type type, String url) + 175 
   System.Web.Services.Protocols.DocumentationServerType..ctor(Type type, String uri) + 158 
   System.Web.Services.Protocols.DocumentationServerProtocol.Initialize() + 269 
   System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) + 106 

[InvalidOperationException: Unable to handle request.]
   System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) + 205 
   System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) + 82 

[InvalidOperationException: Failed to handle request.]
   System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) + 154 
   System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) + 94 
   System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, String path, String pathTranslated, Boolean useAppConfig) + 699 
   System.Web.MapHandlerExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute() + 95 
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) + 173 

 


--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version: 1 . 1 . 4322 . 2032 ; ASP.NET Version: 1 . 1 . 4322 . 2032  
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850159
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже из-за этого -

CommandBehavior.CloseConnection.
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850229
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
врядли ...

DataSet это объект типа MBV с интерфейсом IXmlSerializable, а DbDataReader - MBR, причем не поддерживающий сериализацию.
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850291
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно. Вы пытаетесь вернуть объект типа OracleDataReader, который несериализуем. А веб-метод возвращает сериализованные объекты.
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850393
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кузяврядли ...

DataSet это объект типа MBV с интерфейсом IXmlSerializable, а DbDataReader - MBR, причем не поддерживающий сериализацию.

SqlDataReader тоже вроде не поддерживает сериализацию -

Код: plaintext
1.
public sealed class SqlDataReader : MarshalByRefObject,
   IEnumerable, IDataReader, IDisposable, IDataRecord

А такой код, как у спрашивающего, прокатывает -

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        [WebMethod]
        public SqlDataReader getStreet() 
        {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = "***;packet size=4096";
            SqlCommand cmd = new SqlCommand("SELECT * FROM tbl_anek", conn);
            
            conn.Open();
            SqlDataReader Rd = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return Rd;
        }

с таким вызовом -

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	class Class1
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
            Service1 s = new Service1();
		    SqlDataReader sdr = s.getStreet();
            while (sdr.Read())
            {
                Console.WriteLine(sdr[2].ToString());
            }

		}
	}
}
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850405
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. дело и не в отсутствии поддержки сериализации и не в закрытиии соединения. Тут что-то другое.
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850469
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако возвращать ДатаРидер из веб-метода ИМХО плохая практика.
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850510
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 hDrummer

это результат теста примера из предыдущего топика для SqlDataReader


Server Error in '/WebService1' Application.
--------------------------------------------------------------------------------

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[NullReferenceException: Object reference not set to an instance of an object.]
System.Xml.Serialization.XmlAttributes..ctor(ICustomAttributeProvider provider) +105
System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type) +107
System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, Boolean canBePrimitive, MemberInfo memberInfo) +1463
System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference) +50
System.Xml.Serialization.XmlReflectionImporter.ImportMemberMapping(XmlReflectionMember xmlReflectionMember, String ns, XmlReflectionMember[] xmlReflectionMembers) +34
System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement) +300

[InvalidOperationException: There was an error reflecting 'HelloWorldResult'.]
System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement) +607
System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(String elementName, String ns, XmlReflectionMember[] members, Boolean hasWrapperElement) +108
System.Web.Services.Protocols.SoapReflector.ImportMembersMapping(XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, Boolean serviceDefaultIsEncoded, Boolean rpc, SoapBindingUse use, SoapParameterStyle paramStyle, String elementName, String elementNamespace, Boolean nsIsDefault, XmlReflectionMember[] members, Boolean validate) +169
System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) +2927

[InvalidOperationException: Method SqlService.HelloWorld can not be reflected.]
System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) +5494
System.Web.Services.Description.SoapProtocolReflector.ReflectMethod() +130
System.Web.Services.Description.ProtocolReflector.ReflectBinding(ReflectedBinding reflectedBinding) +1966
System.Web.Services.Description.ProtocolReflector.Reflect() +509
System.Web.Services.Description.ServiceDescriptionReflector.ReflectInternal(ProtocolReflector[] reflectors) +495
System.Web.Services.Description.ServiceDescriptionReflector.Reflect(Type type, String url) +112
System.Web.Services.Protocols.DocumentationServerType..ctor(Type type, String uri) +158
System.Web.Services.Protocols.DocumentationServerProtocol.Initialize() +269
System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) +106

[InvalidOperationException: Unable to handle request.]
System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) +205
System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +82

[InvalidOperationException: Failed to handle request.]
System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +154
System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +94
System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, String path, String pathTranslated, Boolean useAppConfig) +699
System.Web.MapHandlerExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute() +95
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +173
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:1.1.4322.2032; ASP.NET Version:1.1.4322.2032

возможно, ты Web сервисный проект подключаешь через локальную ссылку, а не через "Add Web Reference" ???
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850542
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а для VS 2005 и framework 2.0 еще хлеще :)
такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebServiceBinding(ConformanceClaims=WsiClaims.BP10,EmitConformanceClaims = true)]
public class Service : System.Web.Services.WebService 
{
    [WebMethod]
    public SqlDataReader HelloWorld() 
    {
      SqlConnection dc = new SqlConnection(@"Initial Catalog=TestDB;Data Source=STORAGE;Integrated Security=SSPI;");
      dc.Open();
      SqlCommand cm = new SqlCommand("SELECT * FROM t1", dc);
      SqlDataReader rd = cm.ExecuteReader(CommandBehavior.CloseConnection);
      return rd;
    }
}

и такое сообщение об ошибке
так выглядит ошибка в VS 2005Server Error in '/WebSite2' Application.
--------------------------------------------------------------------------------
You must implement the Add(System.Object) method on System.Data.SqlClient.SqlDataReader because it inherits from IEnumerable.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: You must implement the Add(System.Object) method on System.Data.SqlClient.SqlDataReader because it inherits from IEnumerable.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:
...
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.40607.16; ASP.NET Version:2.0.40607.16
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850734
HoTicE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, впринципе, чего добивался - я хотел получить аналог CursorType = adOpenForwardOnly - просто в некоторых местах мне нжно только прочитать данные и выдать их списком. Думал выиграть по производительности...
может есть другие способы.
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850742
HoTicE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hDrummer
А такой код, как у спрашивающего, прокатывает -
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        [WebMethod]
        public SqlDataReader getStreet() 
        {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = "***;packet size=4096";
            SqlCommand cmd = new SqlCommand("SELECT * FROM tbl_anek", conn);
            
            conn.Open();
            SqlDataReader Rd = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return Rd;
        }

с таким вызовом -

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	class Class1
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
            Service1 s = new Service1();
		    SqlDataReader sdr = s.getStreet();
            while (sdr.Read())
            {
                Console.WriteLine(sdr[2].ToString());
            }

		}
	}
}


у меня есть вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
namespace DBTier {
	using System;
	using System.Configuration;
	using System.Data;
	using System.Data.OracleClient;
	
	public class userPackage {
		
		public OracleDataReader GetUserInfo(String tLogin,String tPass) {
			OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
	
			OracleCommand cmd = conn.CreateCommand();
			cmd.CommandType = CommandType.StoredProcedure;
	
			cmd.CommandText = "PRIVATE_RECEPTION.PKG_USERS.get_user";
			cmd.Parameters.Add("t_login", OracleType.VarChar).Value = tLogin;
			cmd.Parameters.Add("t_pass", OracleType.VarChar).Value = tPass;
			cmd.Parameters.Add(new OracleParameter("t_cr", OracleType.Cursor)).Direction = ParameterDirection.Output;

            conn.Open();
			OracleDataReader Rd = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            return Rd;
		}
		
	}
}
потом компилется dll, в global.asax
Код: plaintext
<%@ Import Namespace="DBTier" %>
потом в файле _users.ascx
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<%@ Control Language="C#" Debug="true"%>
<%@ import Namespace="System.Data.OracleClient" %>
<%@ outputcache duration="3600" varybyparam="None" %>
<script runat="server">

    public String log, pas;
    
    void Page_Load(Object sender, EventArgs e)
    {
        log = "login"; pas = "pass";
        
        DBTier.userPackage tUser = new DBTier.userPackage();
        
        MyList.DataSource = tUser.GetUserInfo(log,pas);
	    MyList.DataBind();

	}
</script>
я использую подобную конструкцию на серверной стороне, на кленте пользуюсь созданым webservice.
но это не webmethod.
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32850893
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно, ты Web сервисный проект подключаешь через локальную ссылку, а не через "Add Web Reference" ???

да, так и есть. поторопился (
...
Рейтинг: 0 / 0
Использование OracleDataReader в [WebMethod]
    #32852292
HoTicE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что я написал - работает на сервере и только на сервере
обращение к базе идет без использования вэб-сервиса.
Вэб-сервис используется только на клиенте.
Только так я добился того что пользователю ненужно ничего кроме браузера.

серверная сторона - стандартная трехзвенка.
вэб-форма<->контролс с бизнеслогикой<->компонент доступа к бд<->бд

клиент - javascript <-(http запросы на Xml Вэб-сервис)->XmlWebService<->бд

Правда работает только в IE - опера не может создать activeX
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
NetScape ругается навсе что толькоможно - невидит ни процедур обработки нажатий и ругается вот так
Код: plaintext
1.
2.
Error: redeclaration of function SOAPResponse
Source File: http://localhost/includes/reception.js
Line:  1 
или вот так
Код: plaintext
Error: visitorSName_onKeyUP is not defined

Ну и возвращаясь к теме топика
почитал MSDN - Для работы с Xml подходит только DataSet, потому как DataReader не поддерживает сериализацию и может использоваться только для возвращения скалярного выражения (это касается вэб-сервиса). Но если очень нужно DataReader, то можно в самом коде Вэб-сервиса Пройтись по DataReader и нарисовать Xml самому - но это IMHO уже изврат.
Оставил DataSet.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Использование OracleDataReader в [WebMethod]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]