Avatar billede JJK1988 Nybegynder
26. november 2014 - 15:32 Der er 6 kommentarer og
1 løsning

transaction sql max ID + C#

Hej

Så vender man tilbage til det.

Jeg sidder og skal indsætte i 2 forskellige tabeller gerne på 1 gang.

Koden

public Sample insertSampleWithproject(string sample_EksternalNo, DateTime sample_Date, string materiale, string diagnose,
            int patient_ID, int placement_ID, int location_ID, int sampleType_ID,int Project_ID)
        {
           
            var newSample = new Sample();
            var newPatient = new Patient();
            var newPlacement = new Placement();
            var newLocation = new Location();
            var newSampleType = new SampleType();
            var newProject = new Project();

            newSample.Patient = newPatient;
            newSample.Placement = newPlacement;
            newSample.Location = newLocation;
            newSample.SampleType = newSampleType;
            newSample.Project = newProject;

            DBSample S = new DBSample();
           

            //Sample maxID =  new GetMaxSample();
            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HFLDB"].ConnectionString))
            {
               
                conn.Open();
                SqlCommand command = conn.CreateCommand();
                SqlTransaction transaction;

                transaction = conn.BeginTransaction("SampleTransaction");

                command.Connection = conn;
                command.Transaction = transaction;
                try
                {
                    command.CommandText = "INSERT INTO HFL_Sample(Sample_EksternalNo,Sample_Date,Materiale,Diagnose, Patient_ID, Placement_ID ,Location_ID ,SampleType_ID)" +
                        "VALUES (@Sample_EksternalNo,@Sample_Date,@Materiale,@Diagnose, @Patient_ID, @Placement_ID ,@Location_ID ,@SampleType_ID)";
                    command.Parameters.AddWithValue("@Sample_EksternalNo", sample_EksternalNo);
                    command.Parameters.AddWithValue("@Sample_Date", sample_Date);
                    command.Parameters.AddWithValue("@Materiale", materiale);
                    command.Parameters.AddWithValue("@Patient_ID", patient_ID);
                    command.Parameters.AddWithValue("@Diagnose", diagnose);
                    command.Parameters.AddWithValue("@Placement_ID", placement_ID);
                    command.Parameters.AddWithValue("@Location_ID", location_ID);
                    command.Parameters.AddWithValue("@SampleType_ID", sampleType_ID);
                    command.ExecuteNonQuery();

                    newSample.Patient.Patient_ID = patient_ID;
                    newSample.Placement.Placement_ID = placement_ID;
                    newSample.Location.Location_ID = location_ID;
                    newSample.SampleType.SampleType_ID = sampleType_ID;

                    //command.CommandText = "SELECT MAX(Sample_ID) FROM HFL_Sample";
                    S.GetMaxSample();

                    command.CommandText = "INSERT INTO HFL_ProjSample (Sample_ID, Project_ID) VALUES (@Sample_ID, @Project_ID)";
                    command.Parameters.AddWithValue("@Sample_ID", S);
                    command.Parameters.AddWithValue("@Project_ID", Project_ID);
                    command.ExecuteNonQuery();

                    newSample.Project.Project_ID = Project_ID;

                    transaction.Commit();
                    Console.WriteLine("Both Records where inserted!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("(DBSample) Commit Exception Type: {0}", ex.GetType());
                    Console.WriteLine("Message : {0}", ex.Message);

                    //try a rollback if it throws and exception
                    try
                    {
                        transaction.Rollback();
                    }
                    catch (Exception rollEx)
                    {
                        Console.WriteLine("Rollback Exception Type: {0}", rollEx.GetType());
                        Console.WriteLine("Message: {0}", rollEx.Message);
                    }
                }             
            }
            return newSample;
        }

den metohde jeg så kalder getMaxSample

public Sample GetMaxSample()
        {
            var foundID = new Sample();
            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HFLDB"].ConnectionString))
            {
                using (var cmd = new SqlCommand("SELECT MAX(Sample_ID) FROM HFL_Sample"))
                {
                    conn.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while(reader.Read())
                        {
                            try
                            {
                                foundID = BuildSample(reader);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("(DBSample) : GetMaxSample_ID() :: Fejl :: " + ex);
                            }
                            finally { }
                        }
                    }
                }
            }
            return foundID;
        }

Jeg skal til at indsætte i tabel 2 gerne bruge det ID der er autoincrementet fra tabel 1

Kan det lad sig gør?
Avatar billede arne_v Ekspert
26. november 2014 - 15:43 #1
Bare insaet @@IDENTITY eller bedre SCOPE_IDENTITY()
Avatar billede JJK1988 Nybegynder
27. november 2014 - 00:06 #2
har godt læst om dem begge men er ikke helt med på hvad det er de gør?
Avatar billede arne_v Ekspert
27. november 2014 - 00:13 #3
INSERT INTO t1 (f2,f3) VALUES(1,'ABC') -- f1 faar genereret en vaerdi
INSRT INTO t2 (f4,f5) VALUES(123, SCOPE_IDENTITY()) -- her indsaettes den genererede vaerdi
Avatar billede arne_v Ekspert
27. november 2014 - 00:14 #4
1, 'ABC' og 123 skal naturlighvis vaere parameters

SCOPE_IDENTITY() skal *ikke* vaere en parameter
Avatar billede JJK1988 Nybegynder
02. december 2014 - 08:22 #5
Hej arne

Tak for tålmodigheden.

Først insert

command.commandText("INSERT INTO [Parent] name, age, gender VALUES] @name, @age, @gender")

Nu bruger jeg command.CommandText vil det sige at jeg i min commandText kan skrive følgende på min anden insert metode. og vil have parent fra første insert statement så kan jeg skrive følgende?

Anden insert
command.commandText("INSERT INTO [Child] name, age, gender, id [VALUES] @name, @age, @gender, SCOPE_IDENTITY()")

??
Avatar billede JJK1988 Nybegynder
02. december 2014 - 09:06 #6
Takker Arne den er fikset med brugen af SCOPE_IDENTITY()
du kan bare afgive svar.
Avatar billede arne_v Ekspert
02. december 2014 - 15:10 #7
svar
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

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