Добавить результат запроса SQL SELECT в список - PullRequest
0 голосов
/ 17 декабря 2018

Я новичок в C # и не очень хорошо знаю, как следует устанавливать соединение с базой данных MySql .

У меня есть таблица с именем packages , в которой содержится модель, для которой я создал:

namespace CService.Models
{
    public class Package
    {   

        public int id { get; set; }
        public String name { get; set; }
        public String description { get; set; }
        public Boolean tracking { get; set; }
        public int senderCityId { get; set; }
        public int destinationCityId { get; set; }
        public int senderId { get; set; }
        public int receiverId { get; set; }

        public Package(int id, string name, string description, Boolean tracking, int senderCityId,
            int destinationCityId, int senderId, int receiverId)
        {
            this.id = id;
            this.name = name;
            this.description = description;
            this.tracking = tracking;
            this.senderCityId = senderCityId;
            this.destinationCityId = destinationCityId;
            this.senderId = senderId;
            this.receiverId = receiverId;        }
    }
}

Я пытаюсь сделать оператор выбора и присвоить результатв локальный список :

MySqlConnection conn = new MySqlConnection("server = localhost; user id = root; database=assignment_four; password=Mysqlpassword123");

        public List<Package> getPackages()
        {

            List<Package> packages = new List<Package>();
            conn.Open();
            MySqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT * from packages";

            MySqlDataReader reader = cmd.ExecuteReader();

            try
            {
                conn.Open();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    packages.Add(new Package(
                        reader.GetInt32(reader.GetOrdinal("id")),
                        reader.GetString(reader.GetOrdinal("name")),
                        reader.GetString(reader.GetOrdinal("description")),
                        reader.GetBoolean(reader.GetOrdinal("tracking")),
                        reader.GetInt32(reader.GetOrdinal("senderCity_id")),
                        reader.GetInt32(reader.GetOrdinal("destinationCity_id")),
                        reader.GetInt32(reader.GetOrdinal("sender_id")),
                        reader.GetInt32(reader.GetOrdinal("receiver_id"))

                    ));

                }
                reader.Close();
            }
            catch (Exception exp)
            {
                throw;
            }
            finally
            {

                conn.Close();
            }

        return packages;

Однако, когда я пытаюсь запустить это как службу WCF, я получаю следующую ошибку:

Ошибкадобавить услугу.Метаданные службы могут быть недоступны.Убедитесь, что ваша служба работает и предоставляет метаданные.

Служба работала до добавления вышеуказанного кода, поэтому я предполагаю, что проблема заключается в моем подходе к извлечению данных.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Во-первых, подробности ошибки в основном указывают на то, что мы должны предоставлять метаданные службы, чтобы использовать службу на стороне клиента, но это не может решить нашу проблему.
Во-вторых, мы должны добавить OperationContractAttribute в метод операции и добавитьDataContractAttribute для пользовательского сложного типа.
Я сделал демонстрационный пример, хотел бы, чтобы он был полезен для вас.
Интерфейс и служба реализуют

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(RequestFormat =WebMessageFormat.Json,ResponseFormat =WebMessageFormat.Json)]
    List<Product> GetProducts(); }
[DataContract]
public class Product
{
    [DataMember]
    public int ID { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Price { get; set; }
    public Product(int id, string name, int price)
    {
        this.ID = id;
        this.Name = name;
        this.Price = price;
    } }
public class Service1 : IService1
{

    public List<Product> GetProducts()
    {
        List<Product> products = new List<Product>();
        SqlConnection connection = new SqlConnection(@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DataStore;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False");
        SqlCommand command = new SqlCommand("select * from Products", connection);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            products.Add(new Product(reader.GetInt32((reader.GetOrdinal("Id"))), reader.GetString(reader.GetOrdinal("Name")), reader.GetInt32(reader.GetOrdinal("Price"))));
        }
        reader.Close();
        connection.Close();

        return products;
    }
}

web.config

<system.serviceModel>
<services>
  <service name="WcfService1.Service1">
    <endpoint address="" binding="webHttpBinding" contract="WcfService1.IService1" behaviorConfiguration="rest"></endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="rest">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpGetUrl="mex"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

Результат.enter image description here Кроме того, следует отметить, что если мы хотим запросить базу данных localdb (встроенная база данных vs2017) в IIS, мы должны настроить следующее в пуле приложений IIS, в котором размещен wcfсервис.

loadUserProfile="true" setProfileEnvironment="true" 

Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.

0 голосов
/ 17 декабря 2018

Прежде всего, я рекомендую вам использовать Entity Framework как ORM .

Это изменения, которые вы должны внести в свой код.Обычно вы пытаетесь запустить программу чтения перед открытием соединения:

public List<Package> getPackages()
    {
        var conn = new MySqlConnection("server = localhost; user id = root; database=assignment_four; password=Mysqlpassword123");
        var packages = new List<Package>();

        try
        {
            conn.Open();
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT * from packages";

                using (var reader = cmd.ExecuteReader())
                {

                    while (reader.Read())
                    {
                        packages.Add(new Package(
                            reader.GetInt32(reader.GetOrdinal("id")),
                            reader.GetString(reader.GetOrdinal("name")),
                            reader.GetString(reader.GetOrdinal("description")),
                            reader.GetBoolean(reader.GetOrdinal("tracking")),
                            reader.GetInt32(reader.GetOrdinal("senderCity_id")),
                            reader.GetInt32(reader.GetOrdinal("destinationCity_id")),
                            reader.GetInt32(reader.GetOrdinal("sender_id")),
                            reader.GetInt32(reader.GetOrdinal("receiver_id"))
                        ));

                    }
                    reader.Close();
                }
            }
        }
        catch (Exception exp)
        {
            throw;
        }
        finally
        {
            conn.Close();
        }

        return packages;
    }

Некоторое понимание кода:

  • Используйте var всякий раз, когда вы можете вместо явного типа.
  • Используйте оператор using () для удаления таких объектов, как SqlCommand или SqlDataReader
  • Поместите соединение в метод, или, если этот метод является частью класса DAL, создайте другой метод для открытия / закрытия соединения, если это необходимо.
  • Все операторы, которые могут генерировать исключения внутри блока try / cath (например, open или executeReader, таким образом вы узнаете, что не так в вашем коде).
  • Были дублированные операторы, такие как openсоединение, executeReader.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...