为什么我从NVARCHAR获取InvalidCastException到string?

时间:2017-05-10 12:38:09

标签: c# sql-server

我正在尝试从我的SQL数据库中检索一些值,但出于某种原因,我在尝试检索InvalidCastException值的某些(显然不是全部)时会收到NVARCHAR

检索方法看起来像这样(我知道它有点乱):

public PatientDTO DownloadPrivateData(string cpr)
{
    _patient = new PatientDTO();

    using (SqlConnection conn = new SqlConnection(_connectionstring))
    {
        conn.Open();

        using (SqlCommand cmd = new SqlCommand(_testquery, conn))
        {
            cmd.Parameters.AddWithValue("@cpr", cpr);

            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    _patient.Beskrivelse = (string)rdr["borger_beskrivelse"];
                    _patient.CPR = cpr;
                    _patient.Efternavn = (string)rdr["borger_efternavn"];
                    _patient.Fornavn = (string)rdr["borger_fornavn"];
                    _patient.Maalinger = new List<EKGMaalingDTO>()
                        {
                            new EKGMaalingDTO()
                            {
                                EKGMaaleId = (long) rdr["ekgmaaleid"],
                                Dato = (DateTime) rdr["dato"],
                                AntalMaalinger = (int) rdr["antalmaalinger"],
                                MaaltagerFornavn = (string) rdr["sfp_maaltagerfornavn"],
                                MaaltagerEfternavn = (string) rdr["sfp_maltagerefternavn"],
                                MaaltagerMedarbejderNr = (string) rdr["sfp_maaltagermedarbjnr"],
                                MaaltagerOrg = (string) rdr["sfp_mt_org"],
                                MaaltagerKommentar = (string) rdr["sfp_mt_kommentar"],
                                AnsvarsFornavn = (string) rdr["sfp_ansvfornavn"],
                                AnsvarsEfternavn = (string) rdr["sfp_ansvefternavn"],
                                AnsvarsMedarbejderNr = (string) rdr["sfp_ansvrmedarbjnr"],
                                AnsvarsOrg = (string) rdr["sfp_ans_org"],
                                Ansvarskommentar = (string) rdr["sfp_anskommentar"],
                                EKGData = new List<EKGDataDTO>()
                                {
                                    new EKGDataDTO()
                                    {
                                        EKGDataId = (int) rdr["ekgdataid"],
                                        RaaData = (byte[]) rdr["raa_data"],
                                        SampleRateHz = (float) rdr["samplerate_hz"],
                                        IntervalSec = (int) rdr["interval_sec"],
                                        IntervalMin = (float) rdr["interval_min"],
                                        DataFormat = (string) rdr["data_format"],
                                        BinEllerTekst = (char) rdr["bin_eller_tekst"],
                                        MaaleFormatType = (string) rdr["maaleformat_type"],
                                        StartTid = (DateTime) rdr["start_tid"],
                                        Kommentar = (string) rdr["kommentar"],
                                        EKGMaaleId = (long) rdr["ekgmaaleid"],
                                        MaaleEnhed = (string) rdr["maalenehed_identifikation"]
                                    }
                                }
                            }
                        };
                }
            }
        }
    }

    return _patient;
}

使用这两个查询创建了数据库:

CREATE TABLE EKGMAELING 
(
    ekgmaaleid BIGINT IDENTITY(1,1) NOT NULL,
    dato DATETIME NOT NULL,
    antalmaalinger INT NOT NULL,
    sfp_maaltagerfornavn NVARCHAR(MAX) NULL,
    sfp_maltagerefternavn NVARCHAR(MAX) NULL,
    sfp_maaltagermedarbjnr NVARCHAR(MAX) NULL,
    sfp_mt_org NVARCHAR(MAX) NULL,
    sfp_mt_kommentar NTEXT NULL,
    sfp_ansvfornavn NVARCHAR(MAX) NULL,
    sfp_ansvefternavn NVARCHAR(MAX) NULL,
    sfp_ansvrmedarbjnr NVARCHAR(50) NOT NULL,
    sfp_ans_org NVARCHAR(MAX) NOT NULL,
    sfp_anskommentar NVARCHAR(MAX) NULL,
    borger_fornavn NVARCHAR(MAX) NULL,
    borger_efternavn NVARCHAR(MAX) NULL,
    borger_beskrivelse NVARCHAR(MAX) NULL,
    borger_cprnr   NVARCHAR(MAX) NULL,

    CONSTRAINT pk_EKGMAELING 
         PRIMARY KEY CLUSTERED (ekgmaaleid)
)


CREATE TABLE EKGDATA 
(
    ekgdataid INT IDENTITY(1,1) NOT NULL,
    raa_data VARBINARY NOT NULL,
    samplerate_hz FLOAT NOT NULL,
    interval_sec BIGINT NOT NULL,
    interval_min FLOAT NULL,
    data_format NVARCHAR(MAX) NOT NULL,
    bin_eller_tekst CHAR(1) NOT NULL,
    maaleformat_type NVARCHAR(MAX) NOT NULL,
    start_tid DATETIME NOT NULL,
    kommentar TEXT NULL,
    ekgmaaleid BIGINT NULL,
    maalenehed_identifikation NVARCHAR(MAX) NULL,

    CONSTRAINT pk_EKGDATA 
        PRIMARY KEY CLUSTERED (ekgdataid),

    CONSTRAINT fk_EKGDATA 
        FOREIGN KEY (ekgmaaleid) REFERENCES EKGMAELING (ekgmaaleid)
          ON UPDATE CASCADE
)

似乎我在以下内容中获得了InvalidCastException

sfp_maaltagerfornavn, sfp_maaltagermedarbjnr, sfp_ansvrmedarbjnr, 
samplerate_hz, bin_eller_tekst, maaleformat_type, maalenehed_identifikation.

而且,出于某种原因,这里也是:

enter image description here

创建列表时,我不明白这是怎么回事。

我试图将值转换为以下属性:

public class PatientDTO
{
    private string _cpr;
    public List<EKGMaalingDTO> Maalinger { get; set; }
    public string Fornavn { get; set; }
    public string Efternavn { get; set; }

    public string CPR
    {
        get { return _cpr; }
        set
        {
            if (value.Length == 10)
            {
                _cpr = value;
            }
        } 
    }

    public string Beskrivelse { get; set; }
}

public class EKGMaalingDTO
{
    public List<EKGDataDTO> EKGData { get; set; }
    public long EKGMaaleId { get; set; }
    public DateTime Dato { get; set; }
    public int AntalMaalinger { get; set; }
    public string MaaltagerFornavn { get; set; }
    public string MaaltagerEfternavn { get; set; }
    public string MaaltagerMedarbejderNr { get; set; }
    public string MaaltagerOrg { get; set; }
    public string MaaltagerKommentar { get; set; }
    public string AnsvarsFornavn { get; set; }
    public string AnsvarsEfternavn { get; set; }
    public string AnsvarsMedarbejderNr { get; set; }
    public string AnsvarsOrg { get; set; }
    public string Ansvarskommentar { get; set; }
}

public class EKGDataDTO
{
    public byte[] RaaData { get; set; }
    public float SampleRateHz { get; set; }
    public int IntervalSec { get; set; }
    public float IntervalMin { get; set; }
    public string DataFormat { get; set; }
    public char BinEllerTekst { get; set; }
    public string MaaleFormatType { get; set; }
    public DateTime StartTid { get; set; }
    public string Kommentar { get; set; }
    public long EKGMaaleId { get; set; }
    public string MaaleEnhed { get; set; }
    public int EKGDataId { get; set; }
}

1 个答案:

答案 0 :(得分:4)

您不应该从阅读器中投射返回的值 - 使用SqlDataReader上定义的Get*方法 - 这些将为您执行正确的转换,并且也是类型安全的。< / p>

使用:

Kommentar = rdr.GetString(rdr.GetOrdinal("kommentar"))

而不是:

Kommentar = (string) rdr["kommentar"]