Avatar billede djblues Nybegynder
29. november 2007 - 23:22 Der er 6 kommentarer

Database export til Txt fil (SILENT)

Hej

Jeg har en Access database, som bliver opdateret fra et andet program kontinueligt.
Jeg vil gerne have lavet et lille stykke vb-kode som åbner databasen, eksporterer data til en txt-fil og markerer de data der er eksporteret med et ja. ( data skal kun kunne eksporteres en gang, derfor skal eksporten tage højde for om "eksporteret" er sat til Ja eller Nej.. )
Avatar billede djblues Nybegynder
29. november 2007 - 23:28 #1
Et eksempel på hvad jeg gerne vil bare i VBA (access) :

Function Go()
  Dim strSQL As String
 
  'DoCmd.SetWarnings False

  ' Sæt mærke
  DoCmd.RunSQL "UPDATE Tabel SET Medtag=True WHERE Eksporteret=False"
  ' DoCmd.RunSQL "UPDATE Tbl 1 SET Medtag=True WHERE EtEllerAndet=EtEllerAndet AND Eksporteret=False"
  ' Eksporter
  strSQL = "SELECT Tabel.* FROM Tabel WHERE Medtag=True"
  DoCmd.TransferText acExportDelim, , strSQL, "Filnavn.Txt", True
  ' Marker eksporterede poster
  DoCmd.RunSQL "UPDATE Tabel SET Eksporteret=True WHERE Medtag=True"
  ' Slet mærke igen (måske lidt overfødigt)
  DoCmd.RunSQL "UPDATE Tabel SET Medtag=False WHERE Medtag=True"

  DoCmd.SetWarnings True

  Application.Quit
End Function
Avatar billede neoman Novice
29. november 2007 - 23:42 #2
Hvis jeg skulel gøre det så ville jeg læse hele tabellen ind i et dataset i første omgang, for at se om det virker - det er beskrevet her:http://www.vbdotnetheaven.com/UploadFile/mahesh/DBControlsVBNET04232005024802AM/DBControlsVBNET.aspx

Derpå, ændre SQL
en (du kan genbruge den du har i dit eksempel) og få de "rigtige" data ind

Derpå lave en Update metode for adapteren, så du kan opdatere i access

når alt det funket

så kan du spytte tabellen ud i en textfil rimeligt simpelt :
ger har jeg en stump i C#  den kan du omskrive eller konvertere til VB.

                               
string[] rowString = new string[dataSet11.Tables["Customers"].Rows.Count];
int i=0;
foreach (DataRow dr in dataSet11.Tables["Customers"].Rows)
{
    rowString[i] = dr.ItemArray.GetValue(0).ToString() + ",";
    rowString[i] += dr.ItemArray.GetValue(1).ToString() + ",";
    rowString[i] += dr.ItemArray.GetValue(2).ToString();
    i++;
}
File.WriteAllLines(@"C:\customer.txt", rowString);
MessageBox.Show("Data Exported to text file");

konverteringen kan ske automatisk her:

http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx
Avatar billede neoman Novice
29. november 2007 - 23:55 #3
hvis noget er sort snak så sig hvad:)
Avatar billede djblues Nybegynder
06. december 2007 - 09:57 #4
Hej neoman
Det virker fint, MEN det med update, kan du give mig et HINT. TAK
Avatar billede djblues Nybegynder
09. december 2007 - 23:40 #5
Hej Neoman... sendt et svar og du får points...
Avatar billede arne_v Ekspert
26. december 2007 - 04:04 #6
Nu er dette spørgsmål jo længe overstået.

Men man kan faktisk godt lave en DoCmd.TransferText i .NET !

Eksempel:

Imports System
Imports System.IO
Imports System.Data.OleDb
Imports System.Runtime.InteropServices

Imports Access

Namespace E
    Public Class Program
        Public Shared Sub ExportOldWay(db As String, tbl As String, fnm As String)
            Dim ac As Application = New ApplicationClass()
            ac.OpenCurrentDatabase(db, False, "")
            Try
                ac.DoCmd.TransferText(AcTextTransferType.acExportDelim, Nothing, tbl, fnm, False, Nothing, 1252)
            Finally
                ac.CloseCurrentDatabase()
                ac.DoCmd.Quit(AcQuitOption.acQuitSaveNone)
                Marshal.ReleaseComObject(ac)
            End Try
        End Sub
        Public Shared Sub ExportNewWay(db As String, tbl As String, fnm As String)
            Using con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db)
                con.Open()
                Dim sw As New StreamWriter(fnm)
                Dim cmd As New OleDbCommand("SELECT * FROM " & tbl, con)
                Dim rdr As OleDbDataReader = cmd.ExecuteReader()
                While rdr.Read()
                    For i As Integer = 0 To rdr.FieldCount - 1
                        If i > 0 Then
                            sw.Write(";")
                        End If
                        If TypeOf rdr(i) Is String Then
                            sw.Write("""" & Convert.ToString(rdr(i)) & """")
                        Else
                            sw.Write(rdr(i))
                        End If
                    Next
                    sw.WriteLine()
                End While
                rdr.Close()
                sw.Close()
            End Using
        End Sub
        Public Shared Sub Main(args As String())
            ExportOldWay("C:\Databases\MSAccess\Test.mdb", "T1", "C:\z1.txt")
            ExportNewWay("C:\Databases\MSAccess\Test.mdb", "T1", "C:\z2.txt")
            Console.ReadKey()
        End Sub
    End Class
End Namespace
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