Avatar billede simsen Mester
09. januar 2021 - 22:44 Der er 3 kommentarer og
2 løsninger

Sql db og mvc

Hej,
Nu har jeg været ved at gå fuldstændig grassat over en fejl, jeg har knoklet med i 3 dage. Jeg har hele tiden troet, det var en fejl i mvc men er ikke så sikker mere.

Nu har jeg fundet ud af hvad fejlen er, men ikke hvorfor, og hvordan jeg retter den.

Jeg har en EmployeeBusinessLayer klasse her henter jeg en liste af Employees fra en sql databasen. Der er flere felter Id, Navn (og den vigtige) Gender. Gender består af en DataType nvarchar(100) og ja jeg ved godt det er alt for meget - lige nu leger jeg bare.

Alt kommer fint ud, undtagen Gender. I tabellen har jeg lavet flere Employees og her har jeg så valgt nogle er Female i Gender og andre er Male.

Tager jeg og laver en select eller kører den stored procedure jeg har lavet, så viser den fint kolonnen med Gender hvor der står Male/Female nedad. Der er  INGEN blanke felter efter.

Nu henter jeg så de employees ind, og pludselig, så er der blanke felter efter Female/Male teksterne.

Hvor skal jeg fejlfinde henne, for at finde ud af om hvem, det er der putter blanke felter bagefter dem (det er kun der det er galt ikke i de andre tekstfelter) og ikke mindst hvordan jeg retter det?

Her er min BusinessLayer
public IEnumerable<Employee> Employees
        {
            get
            {
                string connectionString = ConfigurationManager.ConnectionStrings["EmployeeContext"].ConnectionString;

                List<Employee> employees = new List<Employee>();

                using (SqlConnection con = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand("spEmployees_GetAll", con)
                    {
                        CommandType = CommandType.StoredProcedure
                    };
                    con.Open();
                    SqlDataReader rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {
                        Employee employee = new Employee
                        {
                            Id = Convert.ToInt32(rdr["EmployeeId"]),
                            Name = rdr["Name"].ToString(),
                            City = rdr["City"].ToString(),
                            Gender = rdr["Gender"].ToString()
                        };
                        if (!(rdr["DateOfBirth"] is DBNull))
                        {
                            employee.DateOfBirth = Convert.ToDateTime(rdr["DateOfBirth"]);
                        }

                        employees.Add(employee);
                    }
                }

                return employees;
            }
        }

Her er min stored procedure
USE [MyFirstMvc]
GO
/****** Object:  StoredProcedure [dbo].[spEmployees_GetAll]    Script Date: 09-01-2021 22:41:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        AS
-- Create date: 02-01-2021
-- Description:    Employees
-- =============================================
ALTER PROCEDURE [dbo].[spEmployees_GetAll]
   
AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
    from tblEmployee
END
Avatar billede keysersoze Guru
09. januar 2021 - 23:40 #1
Kunne det tænkes at feltet engang har været nchar?

Noget helt andet er, at det ikke lyder som den optimale måde at håndtere gender på hvis man kigger på normalformer og evt også multi language.
Avatar billede arne_v Ekspert
10. januar 2021 - 01:11 #2
Hvad viser:

SELECT LEN(gender),CONCAT('|',gender,'|') FROM tabelnavn

?
Avatar billede arne_v Ekspert
10. januar 2021 - 01:13 #3
Jeg har ioevrigt aldrigt kunnet lide kode som:

                          Id = Convert.ToInt32(rdr["EmployeeId"]),
                            Name = rdr["Name"].ToString(),
                            City = rdr["City"].ToString(),
                            Gender = rdr["Gender"].ToString()

Jeg foretraekker:

                          Id = (int)rdr["EmployeeId"],
                            Name = (string)rdr["Name"],
                            City = (string)rdr["City"],
                            Gender = (string)rdr["Gender"]

Hvis man aendrer data type i databasen, saa faar man en exception fremfor et mystisk resultat (.ToString giver ikke fejl).
Avatar billede simsen Mester
10. januar 2021 - 11:39 #4
keysersoze
Det kan helt sikkert godt være tilfældet (= engang imellem glemmer jeg at checke, jeg har valgt nvarcar og så ændrer jeg det, når jeg ser, jeg har lavet forkert). Hvad har det af betydning (når jeg nu har ændret det til nvarcar)?

arne_v
Den viser i No Colum Name, at der står der IMale....................| (punktummerne er lig med mellemrum.

Mht. til koden  Id = Convert.ToInt32(rdr["EmployeeId"]), så laver jeg det lige pt nøjagtig som videoerne siger. Men jeg kan da godt forstå, hvad du siger, det giver jo ret meget mening, så mange tak for tippet.
Avatar billede keysersoze Guru
10. januar 2021 - 11:52 #5
Hvis feltet har været nchar vil alle felter være padded til den længde feltet har været - så er du nødt til at lave en update på alle felter hvor du trimmer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester