Avatar billede starf Nybegynder
14. juni 2005 - 19:09 Der er 20 kommentarer og
1 løsning

text fil til db

hey

hvordan får jeg et c# program til at læse alle *.txt filer i en mappe og smide den tekst de indholder ind i en database felt for hver fil?
Avatar billede arne_v Ekspert
14. juni 2005 - 19:13 #1
Du mener en række per fil ikke ?
Avatar billede arne_v Ekspert
14. juni 2005 - 19:16 #2
lav en XxxxConnection og en XxxxCommand med INSERT (Xxxx afhænger af databasen)
kald Directory.GetFiles til at hente all de filnavne som matcher
lav en løkke over dem
læs filen med en StreamReader og ReadToEnd metoden
sæt data ind i kommandoen og gem i databasen med ExecuteNonQuery
Avatar billede arne_v Ekspert
14. juni 2005 - 19:28 #3
eksempel:

using System;
using System.IO;
using System.Data.OleDb;

class MainClass
{
    public static void Main(string[] args)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb");
        con.Open();
        OleDbCommand cre = new OleDbCommand("CREATE TABLE files (filename VARCHAR(255), content TEXT)", con);
        cre.ExecuteNonQuery();
        OleDbCommand ins = new OleDbCommand("INSERT INTO files VALUES (?, ?)", con);
        ins.Parameters.Add("@filename", OleDbType.VarChar);
        ins.Parameters.Add("@content", OleDbType.LongVarChar);
        string[] filenames = Directory.GetFiles(@"C:\scripts", "*.bat");
        for(int i = 0; i < filenames.Length; i++)
        {
            StreamReader sr = new StreamReader(filenames[i]);
            string content = sr.ReadToEnd();
            sr.Close();
            ins.Parameters["@filename"].Value = filenames[i];
            ins.Parameters["@content"].Value = content;
            ins.ExecuteNonQuery();
        }
        OleDbCommand drp = new OleDbCommand("DROP TABLE files", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede starf Nybegynder
14. juni 2005 - 19:31 #4
jep jeg mener en række... kigger lige på dit sidste svar :)
Avatar billede starf Nybegynder
14. juni 2005 - 19:35 #5
det jeg mener er jeg har en Mysql database der har følgende tabel:
backup, som indeholder disse 3 felter:

id ---- file.

id er bare auto nummer, file skal abre indeholde teksten fra filen.

så skla den sætte dem ind så jeg får en lang række idér som jeg kan hente det der står i file ud fra.. giver det bedre mening nu?
Avatar billede nielle Nybegynder
14. juni 2005 - 19:37 #6
Mit bud:

using System;
using System.Data;
using System.Data.OleDb;
using System.IO;

namespace e625974
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            string ConnStr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Source.C#\e625974\db.mdb";
            OleDbConnection Conn = new OleDbConnection(ConnStr);

            DirectoryInfo DI = new DirectoryInfo(@"C:\Windows");
            foreach (FileInfo FI in DI.GetFiles("*.txt"))
            {
                string FileName = FI.FullName;
                long FileSize = FI.Length;
                byte[] FileContent = new byte[FileSize];

                using (FileStream FS = new FileStream(FileName, FileMode.Open, FileAccess.Read))
                {
                    using (BinaryReader BR = new BinaryReader(FS))
                    {
                        FileContent = BR.ReadBytes((int)FileSize);

                        string InsertSQL = "INSERT INTO FilTabel (FileName, FileContent) VALUES (@FileName, @FileContent)";
                        OleDbCommand InsertCmd = new OleDbCommand(InsertSQL, Conn);
                        InsertCmd.Parameters.Add("@FileName", OleDbType.VarChar, 50).Value = FileName;
                        InsertCmd.Parameters.Add("@FileContent", OleDbType.Binary, (int)FileSize).Value = FileContent;

                        Conn.Open();
                        InsertCmd.ExecuteNonQuery();
                        Conn.Close();
                    }
                }
            }
        }
    }
}
Avatar billede arne_v Ekspert
14. juni 2005 - 19:57 #7
jeg ved ikke om det giver mere mening

du vil gemme under et auto number id og ikke under filnavn

og det er MySQL og ikke Access

vil du have hjælp til at lave de 2 ændringer ?
Avatar billede starf Nybegynder
14. juni 2005 - 19:58 #8
jeg sidder dog lige selv og prøver at lave de ændringer.. men ja tak :)
Avatar billede starf Nybegynder
14. juni 2005 - 19:59 #9
og ja jeg bruger mysql, havde ikke lige tænkt med det med fil navn, det er måske en god ide at gemme filnavnet også, men vil stadig fortrække man gemte med et auto nummer id felt
Avatar billede nielle Nybegynder
14. juni 2005 - 20:02 #10
Hvis databasen er til backup så er det da bestemt en god ide at gemme filnavn sammen med indhold.
Avatar billede nielle Nybegynder
14. juni 2005 - 20:04 #11
Min model gemmer i øvrigt indholdet som en BLOB. På den måde er der ingen grund til at spekulere over encoding og den slags.
Avatar billede arne_v Ekspert
14. juni 2005 - 20:05 #12
MySQL version med auto number:

using System;
using System.IO;
using MySql.Data.MySqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
        con.Open();
        MySqlCommand cre = new MySqlCommand("CREATE TABLE files (filename INTEGER PRIMARY KEY AUTO_INCREMENT, content TEXT)", con);
        cre.ExecuteNonQuery();
        MySqlCommand ins = new MySqlCommand("INSERT INTO files(content) VALUES (?content)", con);
        ins.Parameters.Add("@content", MySqlDbType.VarChar);
        string[] filenames = Directory.GetFiles(@"C:\scripts", "*.bat");
        for(int i = 0; i < filenames.Length; i++)
        {
            StreamReader sr = new StreamReader(filenames[i]);
            string content = sr.ReadToEnd();
            sr.Close();
            ins.Parameters["?content"].Value = content;
            ins.ExecuteNonQuery();
        }
        MySqlCommand drp = new MySqlCommand("DROP TABLE files", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede arne_v Ekspert
14. juni 2005 - 20:06 #13
ins.Parameters.Add("@content", MySqlDbType.VarChar);

skal iøvrigt være

ins.Parameters.Add("@content", MySqlDbType.Blob);
Avatar billede starf Nybegynder
14. juni 2005 - 20:10 #14
yes takker.. det ser ud til at virke :)
Avatar billede starf Nybegynder
14. juni 2005 - 20:13 #15
using MySql.Data.MySqlClient; den der er det bytefx mysql client eller?
Avatar billede arne_v Ekspert
14. juni 2005 - 20:22 #16
nej og ja

det er MySQL Connector for .NET

som er ByteFX efter at MySQL AB overtog det
Avatar billede arne_v Ekspert
14. juni 2005 - 20:23 #17
samme kode

så vidt jeg ved samme developer

men de har omdøbt namespace fra ByteFX til MySQL sådan for at markere at det er
officielt nu
Avatar billede starf Nybegynder
14. juni 2005 - 20:26 #18
ah ok, hvor kan man hente den nye?
Avatar billede arne_v Ekspert
14. juni 2005 - 20:35 #19
Avatar billede starf Nybegynder
14. juni 2005 - 20:45 #20
takker :)

ser ud til at virke fint.. skal bare lige laves så den acceptere at blive kørt igen når tabellerne er der, samt der efter kun tage de nyeste filer.. men det burde jeg selv kunne klare.. tak for hjælpen

smed et svar og få point :)
Avatar billede arne_v Ekspert
14. juni 2005 - 20:54 #21
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
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