2016-12-06 44 views
0

我是一名PHP開發人員,我需要從Windows機器導入一些文件,這些文件有一個真正的舊應用程序,一天兩次生成.MDB(Access數據庫)信息。我需要查詢這些MDB文件,只要它們在文件系統中創建,查詢數據並導入到現有的MySQL數據庫中。所有這些信息都應在Intranet上提供,並使用PHP開發。C# - FilesystemWatcher,MDB文件和MySQL

不幸的是,Linux沒有免費的ODBC驅動程序,所以我決定使用C#,創建一個應用程序來執行所需的操作。

有人可以給我一些建議,我必須閱讀嗎?

到目前爲止,我知道我必須使用System.IO中的FilesystemWatcher來獲取創建的事件。

目前我測試了一些與MDB數據庫的連接,但我無法從中檢索所有表。

我其實查詢:

select * FROM [Abertura Caixa]; 

有什麼辦法來查詢許多不同的表?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data.OleDb; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      OleDbConnection conn = null; 
      OleDbDataReader reader = null; 
      try 
      { 
       conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\projects\\letseatdev\\public\\fechamentos\\LJ00004CX001DT03122016No0762Per02.mdb"); 
       conn.Open(); 

       OleDbCommand cmd = new OleDbCommand("select * FROM [Abertura Caixa];", conn); 
       OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(cmd); 

       DataSet myDataSet = new DataSet(); 
       DataSet ds = new DataSet(); 

       myDataAdapter.Fill(myDataSet, "Abertura Caixa"); 
       myDataAdapter.Fill(myDataSet, "Caixa Local"); 
       myDataAdapter.Fill(myDataSet, "Cartões Ocorrencias Local"); 
       myDataAdapter.Fill(myDataSet, "Cartões Pagos Local"); 
       myDataAdapter.Fill(myDataSet, "Clientes"); 
       myDataAdapter.Fill(myDataSet, "CombosVendidos Local"); 
       myDataAdapter.Fill(myDataSet, "CombosVendidosItens Local"); 
       myDataAdapter.Fill(myDataSet, "Comissões Local"); 
       myDataAdapter.Fill(myDataSet, "Conciliação de Caixa Local"); 
       myDataAdapter.Fill(myDataSet, "Conta Corrente Assinada"); 
       myDataAdapter.Fill(myDataSet, "Contas Canceladas Local"); 
       myDataAdapter.Fill(myDataSet, "Contas Reimpressas Local"); 
       myDataAdapter.Fill(myDataSet, "Contra Vales Emitidos Local"); 
       myDataAdapter.Fill(myDataSet, "CupomReferenciado"); 
       myDataAdapter.Fill(myDataSet, "Descontos Local"); 
       myDataAdapter.Fill(myDataSet, "Devolucao"); 
       myDataAdapter.Fill(myDataSet, "ECF Log Local"); 
       myDataAdapter.Fill(myDataSet, "Fechamento de Caixa"); 
       myDataAdapter.Fill(myDataSet, "Fidelidade Local"); 
       myDataAdapter.Fill(myDataSet, "Giro de Mesas Local"); 
       myDataAdapter.Fill(myDataSet, "Inventario Local"); 
       myDataAdapter.Fill(myDataSet, "Invetario_SPED"); 
       myDataAdapter.Fill(myDataSet, "Mapa Resumo Local"); 
       myDataAdapter.Fill(myDataSet, "NF_Referenciada"); 
       myDataAdapter.Fill(myDataSet, "Pedidos Cancelados Local"); 
       myDataAdapter.Fill(myDataSet, "PedidosOnline Local"); 
       myDataAdapter.Fill(myDataSet, "Penduras"); 
       myDataAdapter.Fill(myDataSet, "Produto Local"); 
       myDataAdapter.Fill(myDataSet, "Sangrias Local"); 
       myDataAdapter.Fill(myDataSet, "Totalizador Local"); 
       myDataAdapter.Fill(myDataSet, "Transferencia Estoques"); 
       myDataAdapter.Fill(myDataSet, "Transferencia Mesa Local"); 
       myDataAdapter.Fill(myDataSet, "Transporte"); 
       myDataAdapter.Fill(myDataSet, "ComissoesCanceladas Local"); 
       myDataAdapter.Fill(myDataSet, "ECF Item Log Local"); 
       myDataAdapter.Fill(myDataSet, "Livros Fiscais"); 
       myDataAdapter.Dispose(); 
       conn.Close(); 

       int i = 0; 

       for (i = 0; i <= myDataSet.Tables["ECF Item Log Local"].Rows.Count - 1; i++) 
       { 
        Console.WriteLine(myDataSet.Tables["ECF Item Log Local"].Rows[i].ItemArray[1]); 
       } 

       System.Threading.Thread.Sleep(15000); 

      } 

     } 
    } 
} 

編輯1 -

新代碼。它不斷從表格「Abertura Caixa」中檢索:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data.OleDb; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      OleDbConnection conn = null; 
      OleDbDataReader reader = null; 
      try 
      { 
       conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\projects\\letseatdev\\public\\fechamentos\\LJ00004CX001DT03122016No0762Per02.mdb"); 
       conn.Open(); 



       DataSet myDataSet = new DataSet(); 
       DataSet ds = new DataSet(); 

       OleDbCommand cmd = new OleDbCommand("select * FROM [Abertura Caixa];", conn); 
       OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(cmd); 
       myDataAdapter.Fill(myDataSet, "Abertura Caixa"); 

       OleDbCommand cmd2 = new OleDbCommand("select * FROM [Caixa Local];", conn); 
       OleDbDataAdapter myDataAdapter2 = new OleDbDataAdapter(cmd); 
       myDataAdapter2.Fill(myDataSet, "Abertura Caixa"); 

       OleDbCommand cmd3 = new OleDbCommand("select * FROM [ECF Item Log Local];", conn); 
       OleDbDataAdapter myDataAdapter3 = new OleDbDataAdapter(cmd); 
       myDataAdapter3.Fill(myDataSet, "ECF Item Log Local"); 

       conn.Close(); 

       int i = 0; 

       for (i = 0; i <= myDataSet.Tables["ECF Item Log Local"].Rows.Count - 1; i++) 
       { 
        Console.WriteLine(myDataSet.Tables["ECF Item Log Local"].Rows[i].ItemArray[3]); 
       } 

       System.Threading.Thread.Sleep(15000); 


      } 
     } 
    } 
} 

回答

0

適配器只執行您在其構造函數中傳遞的命令。如果不爲每個表添加正確的命令文本,則無法填充其他表。一個可能更快,更簡單的方法是使用你感興趣檢索的所有表名的列表,在這個列表上循環創建一個SELECT *命令,然後直接使用該命令加載一個DataTable。之後,您可以將DataTable添加到DataSet存儲的集合中。

List<string> tables = new List<string>() 
{ 
    "Abertura Caixa", "Caixa Local", "Cartões Ocorrencias Local", 
    "Cartões Pagos Local", ..... all other table names... 
}; 

conn = new OleDbConnection("......"); 
conn.Open(); 
DataSet ds = new DataSet(); 
foreach(string table in tables) 
{ 
    OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + table + "]", conn); 
    DataTable dt = new DataTable(table); 
    dt.Load(cmd.ExecuteReader()); 
    ds.Tables.Add(dt); 
} 
+0

謝謝你。我現在因爲TableName空格而出錯,所以我做了:OleDbCommand cmd = new OleDbCommand(「SELECT * FROM \」「+ table +」\「;」,conn);仍然不工作=/ –

+0

我應該使用[]來代替。 OleDbCommand cmd = new OleDbCommand(「SELECT * FROM [」+ table +「];」,conn); –

+0

哦,是的,這些名稱包含空格..你需要在他們的名字周圍的方括號 – Steve