【问题标题】:Pulling Integers from Access Database with C#使用 C# 从 Access 数据库中提取整数
【发布时间】:2016-10-18 08:22:53
【问题描述】:

我正在尝试从 2010 Access 数据库中提取数据。这应该是提取供应商编号。

虽然我收到“用户代码未处理无效的 CastException。指定的强制转换无效。”当我尝试构建项目时。我已经在我的数据库中仔细检查了我的列 VNNO,它被设置为一个整数。我一定错过了一些简单的东西。

    public SelectList GetVendors(String selected = "")
    {
        IList<SelectListItem> vendors = new List<SelectListItem>();
        vendors.Add(new SelectListItem { Text = "", Value = "- Select Vendor -" });

        vendors.Add(new SelectListItem { Text = "TO BE ASSIGNED", Value = "TO BE ASSIGNED" });

        using (OleDbConnection myConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["VendorConnection"].ConnectionString))
        {
            myConnection.Open();

            using (OleDbCommand command = new OleDbCommand())
            {
                command.CommandText = "SELECT * FROM [MY PPUR301] ORDER BY [VNNO] ASC";
                command.Connection = myConnection;
                command.Prepare();

                using (OleDbDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string text = "";
                        string value = "";

                        if (!reader.IsDBNull(reader.GetOrdinal("VNNO")))
                        {
                            text = reader.GetInt32(reader.GetOrdinal("VNNO")).ToString();
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("VNNO")))
                        {
                            value = reader.GetInt32(reader.GetOrdinal("VNNO")).ToString();
                        }

                        vendors.Add(new SelectListItem { Text = text.ToUpper(), Value = value.ToUpper() });
                    }
                }
            }
        }

        return new SelectList(vendors, "Text", "Value", selected);
    }

这是另一段完美运行的代码。它会提取供应商的实际名称。

    public SelectList GetVendors(String selected = "")
    {
        IList<SelectListItem> vendors = new List<SelectListItem>();
        vendors.Add(new SelectListItem { Text = "", Value = "- Select Vendor -" });

        vendors.Add(new SelectListItem { Text = "TO BE ASSIGNED", Value = "TO BE ASSIGNED" });

        using (OleDbConnection myConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["VendorConnection"].ConnectionString))
        {
            myConnection.Open();

            using (OleDbCommand command = new OleDbCommand())
            {
                command.CommandText = "SELECT * FROM [MY PPUR301] ORDER BY [VNNAME] ASC";
                command.Connection = myConnection;
                command.Prepare();

                using (OleDbDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string text = "";
                        string value = "";

                        if (!reader.IsDBNull(reader.GetOrdinal("VNNAME")))
                        {
                            text = reader.GetString(reader.GetOrdinal("VNNAME")).ToString().Trim();
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("VNNAME")))
                        {
                            value = reader.GetString(reader.GetOrdinal("VNNAME")).ToString().Trim();
                        }

                        vendors.Add(new SelectListItem { Text = text.ToUpper(), Value = value.ToUpper() });
                    }
                }
            }
        }

        return new SelectList(vendors, "Text", "Value", selected);
    }

【问题讨论】:

  • 你的数据集中的最大整数是多少?你可能需要 Int64 吗?
  • @Zachary 我认为它必须是text = (reader.GetInt32(reader.GetOrdinal("VNNO"))).ToString();
  • @devlincarnate 也测试了 Int64。我相信最大值在 8000 左右
  • 你重复 VNNAME 两次。
  • 究竟是哪一行引发了错误?

标签: c# ms-access-2010


【解决方案1】:

这就是我编写该代码的方式:

public static Tortuga.Chain.AccessDataSource DataSource = Tortuga.Chain.AccessDataSource.CreateFromConfig("VendorConnection");

public class Foo
{
    public int? VNNO { get; set; }
    public string VnnoString
    {
        get
        {
            if (VNNO.HasValue)
                return VNNO.ToString();
            else
                return "";
        }
    }
    public string VNNAME { get; set; }
}



var items = dataSource.From("MY PPUR301").WithSorting("VNNO").ToCollection<Foo>().Execute();

foreach (var item in items)
{
    vendors.Add(new SelectListItem { Text = item.VNNAME.ToUpper(), Value = item.VnnoString });
}

【讨论】:

    【解决方案2】:

    感谢@JonathanAllen 的帮助!它绝对是在数据库方面。我有一个宏从另一个系统中提取并将其转储到我正在使用的 Access DB 中。它最初是转储十进制格式的数字。我进入并将列更新为 int,但是它不起作用。

    因此,我只是将我的 GetInt 更改为 GetDecimal,出于程序的目的,这不会有任何影响。从长远来看,这将节省时间,因此我在提取原始数据时不必创建另一个宏。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多