Avatar billede kischi Novice
06. januar 2009 - 20:55 Der er 10 kommentarer og
1 løsning

2 ting skal ske på samme tid

Hej jeg har gjort så man kan uploade en excel fil til serveren og så ved klik på en anden knap lægger dataen sig ned i en Ms sql database.

Min kode for upload ser sådan ud:
protected void Button2_Click(object sender, EventArgs e)
    {
        string sSavePath;

        sSavePath = "../admin/database.xls";

        if (File1.PostedFile != null)
        {
            // Check file size (mustn’t be 0)
            HttpPostedFile myFile = File1.PostedFile;
            int nFileLen = myFile.ContentLength;
            if (nFileLen == 0)
            {
                lblOutput_excel.Text = "No file was uploaded.";
                return;
            }
           

            if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".xls")
            {
                lblOutput.Text = "The file must have an extension of xls";
                return;

            }
         
            byte[] myData = new Byte[nFileLen];
            myFile.InputStream.Read(myData, 0, nFileLen);

            System.IO.FileStream newFile
                        = new System.IO.FileStream(Server.MapPath(sSavePath),
                                                  System.IO.FileMode.Create);
            newFile.Write(myData, 0, myData.Length);
            newFile.Close();
       
        }


og min kode for at indlæse dataen i ms sql ser sådan ud:

protected void Button1_Click(object sender, EventArgs e)
    {

        string excelConnectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;""", Server.MapPath("database.xls"));



        using (OleDbConnection connection =
            new OleDbConnection(excelConnectionString))
        {

            OleDbCommand command = new OleDbCommand
            ("Select * FROM [Sheet1$]", connection);

            connection.Open();

            using (DbDataReader dr = command.ExecuteReader())
            {
                string sqlConnectionString = "Data Source=212.97.133.33;Initial Catalog=kischi2_database;UID=kischi2_radio;PWD=kischi;";

                using (SqlBulkCopy bulkCopy =
                  new SqlBulkCopy(sqlConnectionString))
                {
                    bulkCopy.DestinationTableName = "PROGRAM";
                    bulkCopy.WriteToServer(dr);

                    connection.Close();

                }

Men så ville jeg sætte dem sammen så ved klik på den knap som uploader filen til serveren, skal den også indlæse dataen til ms sql serveren.
Det skrev jeg sådan her:

protected void Button2_Click(object sender, EventArgs e)
    {
        string sSavePath;

        sSavePath = "../admin/database.xls";

        if (File1.PostedFile != null)
        {
            // Check file size (mustn’t be 0)
            HttpPostedFile myFile = File1.PostedFile;
            int nFileLen = myFile.ContentLength;
            if (nFileLen == 0)
            {
                lblOutput_excel.Text = "No file was uploaded.";
                return;
            }
           

            if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".xls")
            {
                lblOutput.Text = "The file must have an extension of xls";
                return;

            }
         
            byte[] myData = new Byte[nFileLen];
            myFile.InputStream.Read(myData, 0, nFileLen);

            System.IO.FileStream newFile
                        = new System.IO.FileStream(Server.MapPath(sSavePath),
                                                  System.IO.FileMode.Create);
            newFile.Write(myData, 0, myData.Length);
            newFile.Close();
       
        }
                string excelConnectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;""", Server.MapPath("database.xls"));


                  using (OleDbConnection connection =
            new OleDbConnection(excelConnectionString))
        {

            OleDbCommand command = new OleDbCommand
            ("Select * FROM [Sheet1$]", connection);

            connection.Open();

            using (DbDataReader dr = command.ExecuteReader())
            {
                string sqlConnectionString = "Data Source=212.97.133.33;Initial Catalog=kischi2_database;UID=kischi2_radio;PWD=kischi;";

                using (SqlBulkCopy bulkCopy =
                  new SqlBulkCopy(sqlConnectionString))
                {
                    bulkCopy.DestinationTableName = "PROGRAM";
                    bulkCopy.WriteToServer(dr);

                    connection.Close();

                }

Men det lægger ikke dataen i databasen, men den kommer heller ikke med nogle fejl.

Er der nogle som kan hjælpe mig?

Mvh. Adam
Avatar billede aaberg Nybegynder
07. januar 2009 - 08:23 #1
Prøv at kald newFile.Flush() lige efter din Write() operation. Så koden kommer til at se sådan ud:

newFile.Write(myData, 0, myData.Length);
newFile.Flush();
newFile.Close();
Avatar billede kischi Novice
07. januar 2009 - 11:35 #2
Tusind tak, det virker!!! :-D

men jeg vil lige spørge dig om for en anden gang, hvad gør: newFile.Flush(); ?
Avatar billede aaberg Nybegynder
07. januar 2009 - 12:44 #3
Når man bruger Write metoden på en FileStream, bliver dataene ikke skrevet ned på disken med det samme, men bliver midlertiddig gemt i en buffer i memory. Når denne buffer bliver en bestemt størrelse, alt efter hvilken hardware du har, bliver det automatisk skrevet ned på disken, og bufferen bliver tømt. Alt dette er for at give så god performance som muligt. Flush metoden tvinger FileStream klassen til at skrive til disken og tømme bufferen.

På andre Stream klasser, som f.eks. MemoryStream eller NetworkStream, bliver Flush metoden ikke brugt. Metoden er der stadig, den bliver bare ignoreret hvis du kalder den. Dette giver mulighed for at bruge samme kode til at skrive til flere forskellige slags Streams.

Når man arbejder med FileStream klassen, er det altid en god ide at kalde Flush før du lukker streamen.
Avatar billede aaberg Nybegynder
07. januar 2009 - 12:45 #4
Avatar billede kischi Novice
07. januar 2009 - 15:43 #5
Tusind tak for det gode svar. :-D
Avatar billede arne_v Ekspert
09. januar 2009 - 02:01 #6
Ah hva.

Jeg er noget skeptisk overfor forskellen ved at kalde Flush lige før Close.

Fra ovenstående link:

Flushing the stream will not flush its underlying encoder unless you explicitly call Flush or Close.

Og et hurtigt kik i koden finder:

public virtual void Close()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

public override void Flush()
{
    if (this._handle.IsClosed)
    {
        __Error.FileNotOpen();
    }
    if (this._writePos > 0)
    {
        this.FlushWrite(false);
    }
 
protected override void Dispose(bool disposing)
{
    try
    {
        if (((this._handle != null) && !this._handle.IsClosed) && (this._writePos > 0))
        {
            this.FlushWrite(!disposing);
        }
    }
Avatar billede aaberg Nybegynder
09. januar 2009 - 08:51 #7
Efter at have bladret lidt i dokumentationen fra Microsoft, ser det ud som om du har ret. Jeg har bare flere gange oplevet lignende problemer som kischi, og det har altid hjulpet at kalde Flush.

Jeg ved ikke om det kan have noget at gøre med alle de abstraktionslag som der er, når man skriver og læser til disken. FileStream klassen skriver ikke direkte til filen, men skriver i stedet til en buffer i operativsystemet. Operativsystemet skriver til bufferen som ligger fysisk på disken via den installerede disk-driver. Disken sørger for at bufferen bliver tømt og gemt... Det er i hvert fald noget i den retning der sker.
Avatar billede kischi Novice
09. januar 2009 - 12:43 #8
Ok, men det som jeg oprindeligt fik at vide af aaberg_cc virker jo. Kan man så ikke nøjes med at bruge det, eller kan man risikere at det skaber problemer på et senere tidspunkt?
Avatar billede aaberg Nybegynder
09. januar 2009 - 13:20 #9
Det kan i hvert fald ikke skade at kalde Flush().
Avatar billede kischi Novice
09. januar 2009 - 16:10 #10
Ok, tak
Avatar billede arne_v Ekspert
10. januar 2009 - 01:36 #11
Det kan ikke skade.

Men normalt vil man kun have brug for Flush når en anden skal læse det skrevne inden
man kalder Close.
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
Kurser inden for grundlæggende programmering

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