Avatar billede mema Nybegynder
20. marts 2007 - 18:30 Der er 8 kommentarer og
1 løsning

Stored procedure spørgsmål

Hej, I forlængelse af mit oprettede og besvarede spørgsmål: http://www.eksperten.dk/spm/767728 har jeg nu et problem, som jeg gerne ville få hjælp til at løse:

Programmet virker fint, borset fra en situation, hvor en af de valgte turer ikke reseveret i forvejen(dvs. lblID.Text = reader.GetInt32(reader.GetOrdinal("id")).ToString() returnere null) og der vises intet på labels.
Hvis dette sker ville jeg gerne vise Titel(Turnavn) og AntalMax(maksimale plads for resevation) og evt. Ledige pladser som er lig med AntalMax.
Hvordan gør man det. Skal der en ny stored procedure til eller skal man bare gøre det i metoden?
Tak i forvejen for evt. besvarelser.
Avatar billede arne_v Ekspert
20. marts 2007 - 18:33 #1
Jeg ville nok bruge SP som den er og saa lade applikationen teste for DBNull
og goere noget passende.
Avatar billede mema Nybegynder
20. marts 2007 - 22:51 #2
Jeg aner desværre ikke hvor i min metode skal DBNull spørges:
-----
private void VisValues()
{
using (SqlConnection conTur = new SqlConnection(@"Server=GJJH\MC;Integrated Security=SSPI;database=Tilmeld"))
using (SqlCommand command = new SqlCommand("zMem_AntalPladser", conTur))     
{
command.CommandType = CommandType.StoredProcedure;
command.Connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
lblID.Text = reader.GetInt32(reader.GetOrdinal("TurID")).ToString();
lblTur.Text = reader.GetString(reader.GetOrdinal("Titel")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("AntalMax")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("AntalTotal")).ToString();
conTur.Close();
}
}
}
}
----
Udover det ville jeg gerne spørge om det hjælper at sætte "default value" for de ønskede felter i databasen til 0 eller NULL?
Avatar billede arne_v Ekspert
20. marts 2007 - 23:45 #3
en måde er:

if(reader.IsDBNull(reader.GetOrdinal("TurID"))
{
  lblID.Text = "mangler";
}
else
{
  lblID.Text = reader.GetInt32(reader.GetOrdinal("TurID")).ToString();
}
Avatar billede arne_v Ekspert
20. marts 2007 - 23:45 #4
hvis du sætter en default værdi på 0 fremfor NULL skulle du undgå problemet, men
om du synes at 0 ser pænt ud er an anden sag
Avatar billede mema Nybegynder
21. marts 2007 - 11:57 #5
Med beklagelse har jeg lavet en fejl ved at skrive forkert kode. Den rigtige er lidt anderledes:
----
private void VisValues()
{
using (SqlConnection conTur = new SqlConnection(@"Server=GJJH\MC;Integrated Security=SSPI;database=Tilmeld"))
using (SqlCommand command = new SqlCommand("zMem_AntalPladser", conTur))   
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@TurID", lblTurID.Text);
command.Connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
lblTur.Text = reader.GetString(reader.GetOrdinal("Turnavn")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("MaxPrTur")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("Total")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("LedigePladser")).ToString();
conTur.Close();
}
}
}
}
---
Det med din svar arve_v virker desværre ikke. Jeg har tilføjet:
if (reader.IsDBNull(reader.GetOrdinal("id")))
lblID.Text = "mangler";
else
lblID.Text = reader.GetInt32(reader.GetOrdinal("id")).ToString();

Jeg har også prøvet med TurID i stedet for id. Men der vises ikke nogen, hvis ingen har tilmeldt sig til turen endnu. Men i Tur databasen findes alle disse infos vedr. Turnavn (Titel-felt) og MaxPrTur (AntalMax)...
Jeg kan også hente TurID'et med en Session og det gør jeg også egentlig for at kunne i Page_Load fange id'et med:
lblTurID.Text = Session["valgteTur"].ToString();
som bruges i denne linie, som jeg havde glemt at skrive i min forkert version af metoden:
command.Parameters.AddWithValue("@TurID", lblTurID.Text);
Avatar billede mema Nybegynder
21. marts 2007 - 12:00 #6
En gang til. Det er pinligt. Den rigtige kode for min metode:
----
private void VisValues()
{
using (SqlConnection conTur = new SqlConnection(@"Server=GJJH\MC;Integrated Security=SSPI;database=Tilmeld"))
using (SqlCommand command = new SqlCommand("zMem_AntalPladser", conTur)) 
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@TurID", lblTurID.Text);
command.Connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
lblID.Text = reader.GetInt32(reader.GetOrdinal("id")).ToString();
lblTur.Text = reader.GetString(reader.GetOrdinal("Turnavn")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("MaxPrTur")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("Total")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("LedigePladser")).ToString();
conTur.Close();
}
}
}
}
Avatar billede arne_v Ekspert
22. marts 2007 - 00:26 #7
så er det vel

lblID.Text = reader.GetInt32(reader.GetOrdinal("id")).ToString();

der skal være


if(reader.IsDBNull(reader.GetOrdinal("id"))
{
  lblID.Text = "mangler";
}
else
{
  lblID.Text = reader.GetInt32(reader.GetOrdinal("id")).ToString();
}

hvis jeg har forstået dit problem korrekt
Avatar billede mema Nybegynder
22. marts 2007 - 09:56 #8
Jo, det har jeg også prøvet me id i stedet for TurID. Men dette virker heller ikke. Dvs. der vises ikke ID'et ,  Titel (Turnavn), AntalMax (MaxPrTur) og LedigePlads (LedigePladser) af Tur-tabellen.

Der er jo sådan at LedigePlads i Tur tabel allerede har værdien NULL, når jeg i SQL Enterprise Mangager returnere alle poster fra tabellen. Jeg har fjernet default value som var sat til 0.
Avatar billede mema Nybegynder
02. maj 2007 - 10:26 #9
lukker :-(
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