对于进入字符串

时间:2017-03-02 17:48:17

标签: c# sql asp.net-mvc

我有一个由数据填充的类。并非所有数据类型都是字符串:

public class NDCContract
{
    public string ndc_id { get; set; }
    public string contract_num_val { get; set; }
    public string quote_price { get; set; }
    public string eff_dt { get; set; }
    public string end_dt { get; set; }
    public string discount_pct { get; set; }
    public string rebate_pct { get; set; }
}

我有一个服务调用一个存储过程,通过JOIN返回这样的东西:

enter image description here

然后循环我的代码以填充列表:

                var ndccont = new List<BusinessObjects.Models.NDCContract>();
                while (reader.Read())
                {
                    var item = new BusinessObjects.Models.NDCContract();
                    item.ndc_id = reader.GetString(0);
                    item.contract_num_val = reader.GetString(1);
                    item.quote_price = reader.GetString(2);
                    item.eff_dt = reader.GetString(3);
                    item.end_dt = reader.GetString(4);
                    item.discount_pct = reader.GetString(5);
                    item.rebate_pct = reader.GetString(6);
                    ndccont.Add(item);
                }

item.quote_price = reader.GetString(2);行上,我收到错误:Unable to cast object of type 'System.Decimal' to type 'System.String'.

为什么当属性是字符串并且它作为字符串读入时我收到此错误?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

只需使用Convert.ToString(reader.GetValue(i))检索您的字段。

reader.GetString(int)不执行任何类型转换。

指定文化

如果您想提供自己的文化而不是当前文化,可以使用System.Globalization.CultureInfo类指定它:

// Note the second argument
string value = Convert.ToString(reader.GetValue(2), CultureInfo.GetCultureInfo("en-US"));

答案 1 :(得分:3)

正确声明您的模型。我不确定数据库中的数据类型是什么,但它们可能是这样的:

public class NDCContract
{
    public string ndc_id { get; set; }
    public string contract_num_val { get; set; }
    public decimal quote_price { get; set; }
    public DateTime eff_dt { get; set; }
    public DateTime  end_dt { get; set; }
    public decimal discount_pct { get; set; }
    public decimal rebate_pct { get; set; }
}

然后正确填充结构:

            while (reader.Read())
            {
                var item = new BusinessObjects.Models.NDCContract();
                item.ndc_id = reader.GetString(0);
                item.contract_num_val = reader.GetString(1);
                item.quote_price = reader.GetDecimal(2);
                item.eff_dt = reader.GetDateTime(3);
                item.end_dt = reader.GetDateTime(4);
                item.discount_pct = reader.GetDecimal(5);
                item.rebate_pct = reader.GetDecimal(6);
                ndccont.Add(item);
            }