C#使用while循环将项添加到List [关闭]

问题描述 投票:1回答:2

事实证明代码没有任何问题,只是忘了启动XAMPP服务器-_-

我正在尝试与VS2017ENT内部的Xamarin合作开发一个跨平台的C#应用​​程序。我已经开始了一个新的项目,作为使用.NET标准代码共享策略的主要细节。

我的目标是使用数据库中的记录填充List。记录确实被取出,我可以毫无问题地显示这些记录。我遇到的麻烦是使用while循环动态添加这些项目到列表中。

这是我到目前为止的代码,但是使用While循环不起作用。我没有错误或错误的线条,它确实输出我分配的前两个项目manualy(Text =“Overzicht”和Text =“Overzicht2”)。但是项目(文本=(“标题:”+ rdr [1]))没有出现。

        string errorMessage = "";
        items = new List<Item>();
        var mockItems = new List<Item>
        {
            new Item { Id = Guid.NewGuid().ToString(), Text = "Overzicht", Description=("Variabele inhoud") },
            new Item { Id = Guid.NewGuid().ToString(), Text = "Overzicht2", Description=("Variabele inhoud2") },
        };

        string connStr = "server=localhost;user=root;database=xamarin;port=3306;password=";
        MySqlConnection conn = new MySqlConnection(connStr);
        try
        {
            conn.Open();

            string sql = "SELECT * FROM Country";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            MySqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                mockItems.Add(new Item { Id = Guid.NewGuid().ToString(), Text = ("Title: " + rdr[1]), Description = ("Description: " + rdr[2]) });
            }
            rdr.Close();

        }
        catch (Exception ex)
        {
            errorMessage += ex.ToString();
        }

        conn.Close();
c# mysql list while-loop cross-platform
2个回答
0
投票

datareader提供了方便的查询类型数据的方法:

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-data-using-a-datareader

使用适当的GetXXXX()方法 - 可以从这里获取列表(与您的方法相同):https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldatareader?view=netframework-4.7.1

GetString()GetInt()

您也可以更改阅读器本身的使用情况,它可能根本不会返回任何数据:

using (var con = new MySqlConnection("..."))
{
    using (var command = new MySqlCommand( "SELECT * FROM Country", con))
    {
        using (var reader = command.ExecuteReader())
        {
            if (reader.HasRows)
            {
                while (reader.NextResult())
                {
                     // handle resultts
                }
            }
            else
            {
                Debug.Write("No results"); 
            }
        }
    }
} 

即使遇到异常,使用也会为您打开和关闭实例 - 您可以避免以这种方式悬空打开连接。


0
投票

非常感谢大家的提示和信息。我的脚本现在如下:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using App3.Models;

using MySql.Data;
using MySql.Data.MySqlClient;

[assembly: Xamarin.Forms.Dependency(typeof(App3.Services.MockDataStore))]
namespace App3.Services
{
  public class MockDataStore : IDataStore<Item>
  {
    List<Item> items;

    public MockDataStore()
    {
        string errorMessage = "";
        items = new List<Item>();
        var mockItems = new List<Item>
        {
            new Item { Id = Guid.NewGuid().ToString(), Text = "Overzicht", Description=("Variabele inhoud") },
            new Item { Id = Guid.NewGuid().ToString(), Text = "Overzicht2", Description=("Variabele inhoud2") },
        };

        using (MySqlConnection conn = new MySqlConnection("server=localhost;user=root;database=xamarin;port=3306;password="))
        {
            try
            {
                conn.Open();
                using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM Country", conn))
                {
                    using (MySqlDataReader rdr = cmd.ExecuteReader())
                    {
                        while (rdr.Read())
                        {
                            mockItems.Add(new Item { Id = Guid.NewGuid().ToString(), Text = rdr[1].ToString(), Description = rdr[2].ToString() });
                        }
                        rdr.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                errorMessage += ex.ToString();
            }
            conn.Close();
        }

        foreach (var item in mockItems)
        {
            items.Add(item);
        }
    }

    public async Task<bool> AddItemAsync(Item item)
    {
        items.Add(item);

        return await Task.FromResult(true);
    }

    public async Task<bool> UpdateItemAsync(Item item)
    {
        var _item = items.Where((Item arg) => arg.Id == item.Id).FirstOrDefault();
        items.Remove(_item);
        items.Add(item);

        return await Task.FromResult(true);
    }

    public async Task<bool> DeleteItemAsync(Item item)
    {
        var _item = items.Where((Item arg) => arg.Id == item.Id).FirstOrDefault();
        items.Remove(_item);

        return await Task.FromResult(true);
    }

    public async Task<Item> GetItemAsync(string id)
    {
        return await Task.FromResult(items.FirstOrDefault(s => s.Id == id));
    }

    public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
    {
        return await Task.FromResult(items);
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.