Avatar billede eerikk Nybegynder
05. august 2004 - 15:03 Der er 23 kommentarer og
1 løsning

Overførsel af data fra en DB til en anden via .Net-applikation

Jeg har to databaser A og B.

A indeholder en tabel med nogle images og nogle strings.
Ud fra en select-statement, skal nogle af denne tabels
data overføres til tabel B. Kontrollen ligger i en .NET-
applikation skrevet i C#. Hvis bare der ikke var nogen
images (som i øvrigt fylder ret meget!) kunne jeg bare
hente data over i en Datastruktur i C#, men jeg ved ikke
hvordan man gør med disse images! Hvordan henter jeg dem fra tabellen i database A til tabellen i database B:

---    -----------------    ---
|A|<-->|.Net-app. i C# |<-->|B|
---    -----------------    ---

Håber nogen kan hjælpe ;o}
Avatar billede arne_v Ekspert
05. august 2004 - 15:07 #1
Er de images for store til at kunne være i memory ?
Avatar billede arne_v Ekspert
05. august 2004 - 15:11 #2
Hvis det kan være i memory er det ret simpelt.

Standard SELECT og kolonnen indeholder bare en:
  byte[]

Med INSERT er du nød til at bruge parameters. Noget a la:


        XxxxCommand ins = new XxxxCommand("INSERT INTO pics VALUES (@id, @pic)", con);
        ins.Parameters.Add("@id", XxxxDbType.Int);
        ins.Parameters.Add("@pic", XxxxDbType.Blob);
        ins.Parameters["@id"].Value = intvalue;
        ins.Parameters["@pic"].Value = bytearrayvalue;
        ins.ExecuteNonQuery();
Avatar billede eerikk Nybegynder
05. august 2004 - 15:44 #3
Arne V.>> Glædeligt gensyn :o)

Jeg tror ikke helt jeg er med "@" - er det fordi det er et eksempelnavn?

Hvordan ser select'en ud? Jeg er lidt lost...
Avatar billede arne_v Ekspert
05. august 2004 - 15:50 #4
Noget a la:

XxxxCommand sel = new XxxxCommand("SELECT * FROM pics", con);
XxxxDataReader rdr = sel.ExecuteReader();
while(rdr.Read()) {
  int id = (int)rdr[0];
  byte[] pic = (byte[])rdr[1];
  // something
}
Avatar billede arne_v Ekspert
05. august 2004 - 15:51 #5
Man bruger @ i de parameter navne.

Jeg ved faktisk ikke om det er krævet eller kun en konvention.
Avatar billede eerikk Nybegynder
06. august 2004 - 10:07 #6
Nogen forslag til hvordan jeg samler data some byte[] og int i en datastruktur? jeg tænkte på at bruge en ArrayList af objeckter, men ved ikke om man kan lave klasser på samme måde som i Java...
Avatar billede eerikk Nybegynder
06. august 2004 - 10:18 #7
jeg fandt ud af hvordan man laver klasser selv - nemmere end jeg troede :o)
Avatar billede eerikk Nybegynder
06. august 2004 - 10:20 #8
Jeg har også en "datetime" datatype i sql - hvordan klarer jeg den i C#?
Avatar billede eerikk Nybegynder
06. august 2004 - 10:41 #9
mht. memory, kan man så ikke bare overføre 100 ad gangen i en iterativ løkke?
Avatar billede eerikk Nybegynder
06. august 2004 - 13:15 #10
jeg kan ikke se hvordan insert'en fungerer rent iterativt - skal det hele gøres ved hvert genemløb?
Avatar billede arne_v Ekspert
06. august 2004 - 15:11 #11
Delvist.




        XxxxCommand ins = new XxxxCommand("INSERT INTO pics VALUES (@id, @pic)", con);
        ins.Parameters.Add("@id", XxxxDbType.Int);
        ins.Parameters.Add("@pic", XxxxDbType.Blob);

    en eller anden løkke
    {
        ins.Parameters["@id"].Value = intvalue;
        ins.Parameters["@pic"].Value = bytearrayvalue;
        ins.ExecuteNonQuery();
    }
Avatar billede arne_v Ekspert
06. august 2004 - 15:13 #12
Med memory så mener jeg for en enkelt række.

Ovenstående henter hele byte arrayet i en klump.

Hvis det er en 2 GB BLOB så virker det ikke særligt godt !
Avatar billede arne_v Ekspert
06. august 2004 - 15:16 #13
Klasser i C# og klasser i Java ligner hinanden rigtigt meget.

Med hensyn til DATETIME så har .NET en DateTime struct spm måske kan bruges.
Avatar billede eerikk Nybegynder
06. august 2004 - 15:30 #14
Har gjort som du skrev men har stadig problemer med løkken - den siger at jeg ikke overholder en primary key constraint, men jeg VED at id, som er PK, for de forskellige elementer jeg gennemløber er forskellige - skal men sige ins.next før næste gennemløb eller lign.??
Avatar billede eerikk Nybegynder
06. august 2004 - 15:34 #15
Den sætter EN af flere ind og giver så fejlen...
Avatar billede arne_v Ekspert
06. august 2004 - 15:41 #16
Det er ikek fordi du har kørt programmet flere gange og at nogle af data allerede er lagt ind ?
Avatar billede eerikk Nybegynder
06. august 2004 - 15:45 #17
nej :o)
Avatar billede eerikk Nybegynder
06. august 2004 - 15:46 #18
Den når igennem første gennemløb - først på det andet brokker den siger over at en med damme PK er forsøgt indsat
Avatar billede eerikk Nybegynder
06. august 2004 - 15:48 #19
Her er metoden:

private String migrateFilteredDocs(ArrayList retrDocs)
        {
            QuickSort_Jobs_fullyAutomatized.Document tempDocument = new QuickSort_Jobs_fullyAutomatized.Document();
            int temp_id = 0;
            string temp_uri = null;
            byte[] temp_rawcontents = null;
            string temp_mimetype = null;
            try
            {
                conn=new SqlConnection(connString);
                conn.Open();
               
                SqlCommand sql_migrateDocuments = new SqlCommand("INSERT INTO temp_docs VALUES (@id, @uri, @rawcontents, @mimetype)", conn);
               
                sql_migrateDocuments.Parameters.Add("@id", System.Data.SqlDbType.Int);
                sql_migrateDocuments.Parameters.Add("@uri", System.Data.SqlDbType.VarChar);
                sql_migrateDocuments.Parameters.Add("@rawcontents", System.Data.SqlDbType.Binary);
                sql_migrateDocuments.Parameters.Add("@mimetype", System.Data.SqlDbType.VarChar);
               
                for(int i = 0; i < retrDocs.Count; i++)
                {
                    MessageBox.Show("Jeg når gennemløb: "+ i);
                    tempDocument = retrDocs[i] as QuickSort_Jobs_fullyAutomatized.Document;
                    temp_id = (int) tempDocument.getId();
                    temp_uri = tempDocument.getUri() as string;
                    temp_rawcontents = tempDocument.getRawcontents() as byte[];
                    temp_mimetype = tempDocument.getMimetype() as string;

                    MessageBox.Show("id. "+temp_id+" forsøgt indsat!");
                    sql_migrateDocuments.Parameters["@id"].Value = temp_id;
                    sql_migrateDocuments.Parameters["@uri"].Value = temp_uri;
                    sql_migrateDocuments.Parameters["@rawcontents"].Value = temp_rawcontents;
                    sql_migrateDocuments.Parameters["@mimetype"].Value = temp_mimetype;

                    sql_migrateDocuments.ExecuteNonQuery();
                }
                conn.Close();
            }
            catch(Exception exp)
            {
                MessageBox.Show(exp.ToString());
                return null;
            }
            catch
            {
                MessageBox.Show("Exception cast but not caught!");
                return null;
            }
            return "ok";
        }
Avatar billede arne_v Ekspert
10. august 2004 - 22:10 #20
Hvad viser:

MessageBox.Show("id. "+temp_id+" forsøgt indsat!");

?
Avatar billede eerikk Nybegynder
11. august 2004 - 15:16 #21
Arne V.>> Jeg fandt fejlen (kan desværre ikke huske den nu), men desværre ryger sql-forbindelsen når der tændes og slukkes for VPN - det betyder at jeg ikke helt kan bruge applikationen alligevel. Men smid et svar - du har fortjent pointene :o)
Avatar billede arne_v Ekspert
11. august 2004 - 15:18 #22
ok
Avatar billede arne_v Ekspert
11. august 2004 - 15:20 #23
Kan du ikke teste på State og kalde Open om nødvendigt ?
Avatar billede eerikk Nybegynder
11. august 2004 - 17:39 #24
jooo - det var faktisk en god ide - jeg siger tak :o)
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

IT-JOB

LINK Mobility

Support Specialist

Politiets Efterretningstjeneste

Bliv IT-supporter i PET's IT Servicedesk

Netcompany A/S

Linux Operations Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation