2013-01-19 38 views
1

我有一個用於我公司庫存的遠程MySQL數據庫。庫存數據庫是所有我們轉包設備所在位置的主數據庫。每個屬性都有自己的庫存,對於季度庫存,每個位置需要攜帶筆記本電腦和掃描儀,並掃描庫存,然後將其同步到主數據庫。如何從MySQL數據庫的內容中即時創建Access數據庫並保存到本地

問題是因特網訪問不是在所有位置都可用,所以我需要將數據庫複製到本地文件。併發不是問題,因爲只有一個客戶端會同時連接到數據庫,並且每個位置的數據庫相對較小,基本上由1000列7列組成。

我已經得到儘可能在HD上創建一個Access文件,但我不能真正從MSDN神聖如何創建具有特定模式的文件或如何從我的SELECT語句插入相關數據到數據庫。我一直在着手創建一個表適配器和使用.NET的內置方法來進行數據傳輸,但我仍然無法找到如何以編程方式創建具有特定模式的MS Access文件。如果有人遇到過這樣的問題,我會很感激可以提供的任何見解。我基本上需要將SELECT語句的結果複製到我將本地存儲的MS Access數據庫中。所有其他代碼我已經到位。

我目前使用一個相當笨重的查詢和foreach循環來做我的骯髒的工作,但我希望有一個更優雅的解決方案,也許使用動態創建的數據源。

ADOX.Catalog cat = new ADOX.Catalog(); 

     cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source="+ fileName + ";" + "Jet OLEDB:Engine Type=5"); 

     string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";" + "User Id=admin;Password=;"; 

     OleDbConnection con = new OleDbConnection(conString); 

     con.Open(); 

     //create command to generate database schema 
     OleDbCommand command = new OleDbCommand(); 
     command.CommandText = @"CREATE TABLE items (
      [category] VARCHAR(16) NOT NULL, 
      [manufacturer] VARCHAR(32) NOT NULL, 
      [model] VARCHAR(32), 
      [description] TEXT NOT NULL, 
      [serial_number] VARCHAR(64), 
      [barcode] VARCHAR(8) NOT NULL PRIMARY KEY, 
      [property] VARCHAR(4) NOT NULL, 
      [present] TINYINT 
     )"; 

     command.Connection = con; 
     command.ExecuteNonQuery(); 

     OleDbCommand cmdInsert = new OleDbCommand(); 
     cmdInsert.CommandText = "INSERT INTO items([category],[manufacturer],[model],[description],[serial_number],[barcode],[property],[present]) VALUES (@cat,@man,@mod,@desc,@ser,@bar,@prop,@pres)"; 
     cmdInsert.Connection = con; 

     foreach (DataRow row in itemsTableAdapter1.GetData()) 
     { 
      cmdInsert.Parameters.AddWithValue("@cat",row.ItemArray[0].ToString()); 
      cmdInsert.Parameters.AddWithValue("@man", row.ItemArray[1].ToString()); 
      cmdInsert.Parameters.AddWithValue("@mod", row.ItemArray[2].ToString()); 
      cmdInsert.Parameters.AddWithValue("@desc", row.ItemArray[3].ToString()); 
      cmdInsert.Parameters.AddWithValue("@ser", row.ItemArray[4].ToString()); 
      cmdInsert.Parameters.AddWithValue("@bar", row.ItemArray[5].ToString()); 
      cmdInsert.Parameters.AddWithValue("@prop", row.ItemArray[6].ToString()); 
      cmdInsert.Parameters.AddWithValue("@pres", row.ItemArray[7]); 
      cmdInsert.ExecuteNonQuery(); 
      cmdInsert.Parameters.Clear(); 
     } 
     con.Close(); 
     cat = null; 

回答

0

我試過以前做到這一點,但發現,爲了創建一個新的ACCESSDB其實我有一個現有的數據庫,所有我需要的表格等複製。

你能使用sqlite?它是微小的,穩定的,圖書館可用於大多數語言。您將能夠在客戶端機器上創建您喜歡的任何結構。

+0

沒有我的幫助,人們必須能夠使用此網站。我無法在每臺將要使用的計算機上設置sqlite。上面的代碼工作。它創建一個Access數據庫,將文件存儲在本地,然後將其打開並從遠程mySQL服務器複製所有相關數據。我只是希望有一個更清晰的方式涉及.NET的數據結構。 – spuy767

+0

至於你使用Access的問題,使用上面的代碼,它實際上是在無線空氣中創建一個數據庫並將其存儲在本地硬盤上。 – spuy767

+0

@ spuy767我仍然認爲託比的觀點是有效的。將已經創建但空的數據庫複製到本地計算機然後填充表格,甚至填充然後複製會更快更容易。訪問是基於文件的,因此將其視爲文件。但是,我同意sqlite不是答案。 – Fionnuala

相關問題