Avatar billede CJCJCJ Nybegynder
28. maj 2012 - 10:50 Der er 2 kommentarer

Kald undersøgelses stored procedure og opdater eller afbryd

Hej

Jeg vil gerne lave app i C#, hvor jeg først undersøger, om et sæde er ledigt, og i tilfælde af true, så skal der opdateres i tabellen booking, ellers afbryd med besked om ingen ledige sæder. Der er et ledigt sæde i FlySædeStatus, flysædeID = 6, den 2012-07-02-09:00:00.000, men det ser ud som min kode ikke virker ved opdatering af FlyBookingtabellen? Her er min sql tabel, sp og C# kode, idet jeg får fejlen: "Incorrect syntax near 'Betalt'.", når jeg via formen indtaster AfgangFra = CPH, AfgangTil = NY AfGangDatoTid = 2012-07-02-09:00:00.000, PasNummer = 123123123, BilletStatus = Betalt

kan du hjælpe?:


Min tabel i MS SQL SERVER er oprettet sådan med udfyldt testdata:

Create Table FlyBooking(
    BookingID int identity (1, 1)  Primary KEY 
    ,AfgangID int not null
                      references FlyAfgang 
                                on delete no action
                                on update no action
          ,PasNummer int not null
                      references FlyPassager         
                                on delete no action
                                on update Cascade
          ,BookingDatoTid datetime not null
    ,BookingStatus nvarchar (15) not null
    check(BookingStatus ='Bestilt' or BookingStatus='Betalt')
    );

indsættelse af testdata i FlyBooking i MSMSS:

Insert FlyBooking (AfgangID, PasNummer, BookingDatoTid, BookingStatus)
    Values ('1','111111111','2012-04-03 09:30:00:000', 'Betalt');
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('8','111111111','2012-04-03 09:30:00:000', 'Betalt');
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('1','123123123','2012-05-03 10:30:00:000', 'Betalt');
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('9','123123123','2012-04-03 10:30:00:000', 'Betalt');
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('2','123456789','2012-04-09 18:30:19:000', 'Bestilt'); --- ingen tilbagerejse
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('1','321321321','2012-05-09 18:29:59:000', 'Betalt');
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('8','321321321','2012-05-09 18:29:59:000', 'Betalt');
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('2','987654321','2012-02-09 19:17:00:000', 'Betalt');
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('12','987654321','2012-02-09 19:17:00:000', 'Betalt');   
Insert FlyBooking (AfgangID,PasNummer, BookingDatoTid, BookingStatus)
    Values ('18','111111111','2012-04-03 09:30:00:000', 'Betalt');
   

og tabellen LedigtFlysæde:

use Northwind
go
Create Table FlySædeStatus(
    FlySædeID int identity (1, 1)  Primary KEY 
    ,FlyID int not null
        references FlyType   
            on delete no action
            on update Cascade
    ,AfgangID int not null
        references FlyAfgang
            On Delete no action
            On Update no action
    ,PasNummer int Null
        references FlyPassager
            on Delete no Action
            on Update Cascade
    ,FlySædeRække int not null
    ,FlySædeBogstav nvarchar (50) not null
    ,FlySædeStatus nvarchar (50) not null   
        check(FlySædeStatus ='Ledigt' or FlySædeStatus='Optaget')
    );

insert FlySædeStatus (FlyID, AfgangID, PasNummer, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','1','111111111','1','A','Optaget');
insert FlySædeStatus (FlyID, AfgangID, PasNummer, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','1','123123123','1','B','Optaget');
insert FlySædeStatus (FlyID, AfgangID, PasNummer, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','1','321321321','1','C','Optaget');
insert FlySædeStatus (FlyID, AfgangID, PasNummer, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','2','123456789','1','A','Optaget');
insert FlySædeStatus (FlyID, AfgangID, PasNummer, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','2','987654321','1','B','Optaget');
insert FlySædeStatus (FlyID, AfgangID, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','2','1','C','Ledigt');
insert FlySædeStatus (FlyID, AfgangID, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','3','1','A','Ledigt');
insert FlySædeStatus (FlyID, AfgangID, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','3','1','B','Ledigt');
insert FlySædeStatus (FlyID, AfgangID, FlySædeRække, FlySædeBogstav, FlySædeStatus)
    Values ('1','3','1','C','Ledigt');



Stored procedure til undersøgelse af ledigt sæde:
Use Northwind
Go
create procedure sp_FlyTjekLedigtSæde
    @AfgangFra nvarchar(5)
    ,@AFgangTil nvarchar(5)
    ,@AfgangDatoTid Datetime
as
Select FlySædeID
From FlySædeStatus
join FlyAfgang
on FlyAfgang.AfgangID = FlySædeStatus.AfgangID
Where AfgangFra = @AfgangFra and AfgangTil = @AfgangTil and @AfgangDatoTid = AfgangDatoTid and FlySædeStatus = 'Ledigt';



C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace TjekLedigtFlysæde
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            string AfgangFra = "";
            AfgangFra = tAfgangFra.Text;
            string AfgangTil = "";
            AfgangTil = tAfgangTil.Text;
            string AfgangDatoTid = "";
            AfgangDatoTid = tAfgangDatoTid.Text;
            string AfgangID = "";
            AfgangID = tAfgangID.Text;
            string Pasnummer = "";
            Pasnummer = tPasNummer.Text;
            string BookingDatoTid = "2012-05-02 09:00:00.000";
            string BookingStatus = "";
            BookingStatus = tBilletStatus.Text;

            switch (TjekLedigtSæde(AfgangFra, AfgangTil, AfgangDatoTid))
            {
                case true:
                    string insert = string.Format("INSERT INTO FlyBooking (AfgangID, PasNummer, BookingDatoTid, BookingStatus) VALUES ('{0}', '{1}', '{2}' {3})", AfgangID, Pasnummer, BookingDatoTid, BookingStatus);
                    string status = updateDatabase(insert);
                    MessageBox.Show(status, "Status", MessageBoxButtons.OK);
                    break;
                case false:
                    MessageBox.Show("Ingen ledige flysæder på denne afgang. Vælg anden flyafgang.", "Error",
                        MessageBoxButtons.OK);
                    break;
            }
        }
        public static bool TjekLedigtSæde(string AfgangFra, string AfgangTil, string AfgangDatoTid)
        {
            using (SqlConnection conn = new SqlConnection(@"
              data source = .\sqlexpress;
              integrated security = true;
              database = Northwind"))
            {

                SqlDataReader rdr = null;

                try
                {

                    string kk = "";
                    bool kkExist = false;

                    conn.Open();

                    SqlCommand cmd = new SqlCommand("sp_FlyTjekLedigtSæde", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@AfgangFra", AfgangFra));
                    cmd.Parameters.Add(new SqlParameter("@AfgangTil", AfgangTil));
                    cmd.Parameters.Add(new SqlParameter("@AfgangDatoTid", AfgangDatoTid));

                    rdr = cmd.ExecuteReader();

                    while (rdr.Read())
                    {
                        kk = string.Format("{0}", rdr[0].ToString());
                    }
                    if (kk.Length > 0)
                    {
                        kkExist = true;
                    }
                    return kkExist;
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
                    return false;
                }
                finally
                {
                    conn.Close();
                }
            }
        }

        public static string updateDatabase(string statement)
        {
            using (SqlConnection conn = new SqlConnection(@"
                data source = .\sqlexpress;
                integrated security = true;
                database = Northwind"))
            {
                try
                {
                    conn.Open();

                    SqlTransaction sqltrans = conn.BeginTransaction();
                    SqlCommand sqlcmd = conn.CreateCommand();
                    sqlcmd.CommandText = statement;
                    sqlcmd.Transaction = sqltrans;
                    sqlcmd.ExecuteNonQuery();
                    sqltrans.Commit();
                    string returnvalue = "Database Updated";
                    return returnvalue;
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
Avatar billede tjens Nybegynder
28. maj 2012 - 23:14 #1
der mangler et komma og formentlig også apostroffer.
ret
VALUES ('{0}', '{1}', '{2}' {3})
til
VALUES ('{0}', '{1}', '{2}', '{3}') 
Avatar billede arne_v Ekspert
29. maj 2012 - 03:52 #2
Det fjerner nok den fejl.

Saa er der et hav af andre ting som boer fixes:

1) Der boer bruges paramtrs fremfor String.Format

2) Ingen grund til eksplicit transaction md kun 1 SQL saetning

3) Der er ingen grund til at kalde Close paa Connection naar denne er i en using statement

4) Der vil vaere bedre sammenhang mellem C# kode og SP hvis den SP returnerede true eller false

5) Connection string boer hentes fra en config fil

6) Undgaa danske bogstaver i tabel og felt navne
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