2015-10-06 4 views
0

У меня есть следующий веб-метод на странице asmx, которая не будет подключаться к моей базе данных. Может ли кто-нибудь пролить свет на то, где я ошибся.Ошибка WebMethod

[WebMethod] 
    public int[] getEmployeeIDs() 
    { 
     Connection conn = new Connection(); 
     Recordset rs = new Recordset(); 
     conn.ConnectionString = "Data Source=MyWebBasedServer;Initial Catalog=MyDatabase;Persist Security Info=False;User ID=MyLogin;Password=MyPassword"; 
     rs.Open("SELECT ID from MyTable", conn, CursorTypeEnum.adOpenStatic); 

     int[] ID = new int[rs.RecordCount]; 
     int i = 0; 
     while (!rs.EOF) 
     { 
      ID[i++] = rs.Fields["ID"].Value; 
      rs.MoveNext(); 
     } 
     rs.Close(); 
     conn.Close(); 
     return ID; 
    } 

Сообщение об ошибке я получаю

Соединение не может быть использован для выполнения этой операции. В этом контексте это либо закрыто, либо недействительно. (Указывает на «int [] ID = новый int [rs.RecordCount];»)

Спасибо.

+0

Похоже, что вам нужно позвонить .open() в Connection. Также: с какой базой данных вы подключаетесь? Recordset выглядит как старые классы DAO для меня. Я не видел этот синтаксис много лет. –

+0

Не соединение, открытое rs.Open, когда оно использует соединение «conn». Я подключаюсь к базе данных, размещенной на smarterasp.net, своей базе данных mssql. Я снял это с видео с YouTube. Может быть, ты поможешь мне. Все, что я пытаюсь сделать, приносит список идентификаторов из MyTable из моей базы данных и собирается занести его в приложение для Android. Какие-либо предложения? –

+0

Строка подключения выглядит подозрительной, поскольку вы используете класс ADO Connection, строка подключения должна иметь следующий формат: '' Provider = MySQLProv; server = MyWebBasedServer; uid = MyUserName; pwd = MyPassword; database = MyDatabase "' – vendettamit

ответ

3

В приведенном ниже коде представлены два распространенных способа получения набора результатов из инструкции SELECT в ADO.Net.

Существует сайт под названием ConnectionStrings.com, который показывает все различные способы подключения к SQL Server, а также множество других типов баз данных.

Если вы новичок в программировании на C#, то using statement - отличный способ избежать утечек ресурсов при работе с объектами, реализующими IDisposable.

Возвращение сложных типов от WebMethod может привести к ошибке. Основной XML-сериализатор метода может не знать, как обращаться с определенными типами. В этом случае XmlIncludeAttribute может использоваться для предоставления явной информации о типе. Вот MSDN thread, обсуждая, как это сделать.

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web.Services; 

namespace ConsoleApplication19 
{ 
    public class Program 
    { 
    public static void Main(String[] args) 
    { 
     var connectionString = "Data Source=MyWebBasedServer;Initial Catalog=MyDatabase;Persist Security Info=False;User ID=MyLogin;Password=MyPassword;"; 
     var a = GetEmployeeIDs_Version1(connectionString); 
     var b = GetEmployeeIDs_Version2(connectionString); 
    } 

    /* Version 1 

     Use a "while" loop to fill a WebData list and return it as an array. */ 

    [WebMethod] 
    private static WebData[] GetEmployeeIDs_Version1(String connectionString) 
    { 
     using (var connection = new SqlConnection(connectionString)) 
     { 
     connection.Open(); 

     var commandText = "SELECT ID, SurName from MyTable"; 

     using (var command = new SqlCommand() { Connection = connection, CommandType = CommandType.Text, CommandText = commandText }) 
     { 
      using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection)) 
      { 
      var result = new List<WebData>(); 

      while (reader.Read()) 
       result.Add(new WebData() { ID = Convert.ToInt32(reader["ID"]), Surname = reader["Surname"].ToString() }); 

      return result.ToArray(); 
      } 
     } 
     } 
    } 

    /* Version 2 

     Fill a DataSet with the result set. 

     Because there's only one SELECT statement, ADO.Net will 
     populate a DataTable with that result set and put the 
     DataTable in the dataset's Tables collection. 

     Use LINQ to convert that table into a WebData array. */ 

    [WebMethod] 
    private static WebData[] GetEmployeeIDs_Version2(String connectionString) 
    { 
     using (var connection = new SqlConnection(connectionString)) 
     { 
     connection.Open(); 

     var commandText = "SELECT ID, SurName from MyTable"; 

     using (var command = new SqlCommand() { Connection = connection, CommandType = CommandType.Text, CommandText = commandText }) 
     { 
      using (var adapter = new SqlDataAdapter()) 
      { 
      var dataSet = new DataSet(); 
      adapter.SelectCommand = command; 
      adapter.Fill(dataSet); 

      return 
       dataSet 
       // There should only be one table in the dataSet's Table's collection. 
       .Tables[0] 
       .Rows 
       // DataTable isn't LINQ-aware. An explicit cast is needed 
       // to allow the use of LINQ methods on the DataTable.Rows collection. 
       .Cast<DataRow>() 
       // The rows in a DataTable filled by an SqlDataAdapter 
       // aren't strongly typed. All of a row's columns are 
       // just plain old System.Object. Explicit casts are necessary. 
       .Select(row => new WebData() { ID = Convert.ToInt32(row["ID"]), Surname = row["Surname"].ToString() }) 
       // Use LINQ to convert the IEnumerable<WebData> returned by 
       // the .Select() method to an WebData[]. 
       .ToArray(); 
      } 
     } 
     } 
    } 
    } 

    public class WebData 
    { 
    public Int32 ID { get; set; } 
    public String Surname { get; set; } 
    } 
} 
+0

Спасибо за ваши предложения. Когда я беру эти данные в приложение для Android, мне сказали, что я должен использовать webmethod, так как это связывает строку подключения. Я включил оба ваши предложения и оба делаю именно то, что мне нужно, Могу ли я беспокоить вас дальше и спросить, как я собираюсь привести несколько столбцов в массив, например. ID и фамилия –

+0

Крис, я обновил код примера и добавил пару ссылок о XmlIncludeAttribute, если [WebMethod] имеет проблемы с сериализацией составного типа, такого как класс WebData. –

+0

Спасибо. Все работает :) –