2017-04-06 236 views
0

我想編寫一個c#應用程序,它將從表中讀取大量的Access查詢。該表將具有查詢的所有SQL語句。 查詢可能包含Access函數和方法,如InStr,DateAdd等。 在T-SQL中重寫所有這些語句並不是真的可行,因爲表將不斷添加新的查詢。使用C從VBA運行Access查詢#

簡而言之,是否可以從c#運行Access SELECT查詢(包含VBA函數),並將結果讀入DataTable?

+0

您將不得不自動運行查詢,然後找到一種方法從Access讀取數據,也許通過臨時結果表。 –

+0

從您的C#項目引用Microsoft Access互操作程序集,您將擁有幾乎相同的對象模型VBA代碼。關鍵是,它是Access運行查詢,而不是你的C#代碼; VBA的東西嵌入了Access數據庫,所以C#甚至不需要關心它。 –

+1

訪問ODBC驅動程序的較舊的「Jet」'(* .mdb)'版本受其支持的內置「訪問函數」數量的限制。較新的「ACE」(* .mdb,* .accdb)ODBC驅動程序支持更廣泛的這些功能,包括'DateAdd','Replace'等等。您是否試過運行一些更具挑戰性的查詢C#使用'System.Data.Odbc'來查看它們是否會實際工作? –

回答

1

這似乎是一個奇怪的要求,但我確信做這種事情在技術上是可行的。

string strProvider = "@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Database3.accdb"; 
string strSql = "Select * from score"; 
OleDbConnection con = new OleDbConnection(strProvider); 
OleDbCommand cmd = new OleDbCommand(strSql, con); 
con.Open(); 
cmd.CommandType = CommandType.Text; 
OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
DataTable scores = new DataTable(); 
da.Fill(scores); 
dataGridView1.DataSource = scores; 

而且還有異常處理。 。 。

try 
     { 

     Dataset myDataSet=new Dataset(); 

     string connection = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\Database3.accdb"; 
     OleDbCommand cmd = new OleDbCommand("Select * from score", conn); 
     OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(cmd); 

     connection .Open(); 
     myDataAdapter.Fill(myDataSet,"TableName"); 

     } 
     catch (Exception ex) 
     { 
       Console.WriteLine("Error: Failed to retrieve the required data from the DataBase.\n{0}", ex.Message); 
       return; 
     } 
     finally 
     { 
       connection .Close(); 
     } 
+0

@ ryguy2的答案確實起作用。我仍然坐在一個問題是自定義的VBA功能。你知道在這些查詢中是否可以添加我的自定義VBA函數?使用上面的代碼,我會在表達式中得到「未定義函數'MyFunction'」。 –