2015-01-07 80 views
2

我正在編寫一個c#/ .net4.0程序來替換access vba模塊。我從運行相同的查詢中得到不同的結果。在c#中查詢和訪問vba產生不同的結果

VBA查詢:

dbs.Execute "INSERT INTO tmpTable (L1, D1, L2, UserID, FmN) " & _ 
    "SELECT Table1.Field1, Table2.Field1, " & _ 
    "Sum(Table2.Field2) AS SumOfNoWork, '" & stringUser & "' AS Expr1, 'rampup' AS Expr2 " & _ 
    "FROM Table1 INNER JOIN Table2 ON Table1.Field2 = Table2.Field3 " & _ 
    "WHERE (((Table2.Field4) = 6)) " & _ 
    "GROUP BY Table1.Field1, Table2.Field1, '" & stringUser & "', 'rampup';" 

C#查詢:

string exec1 = "INSERT INTO tmpTable (L1, D1, L2, UserID, FmN) " + 
    "SELECT Table1.Field1, Table2.Field1, " + 
    "Sum(Table2.Field2) AS SumOfNoWork, '" + stringUser + "' AS Expr1, 'rampup' AS Expr2 " + 
    "FROM Table1 INNER JOIN Table2 ON Table1.Field2 = Table2.Field3 " + 
    "WHERE (((Table2.Field4) = 6)) " + 
    "GROUP BY Table1.Field1, Table2.Field1, '" & stringUser & "', 'rampup';"; 

using (OleDbConnection conn = new OleDbConnection(strconn)) 
{ conn.Open(); OleDbCommand comm = new OleDbCommand(exec1, conn); 
    comm.ExecuteNonQuery(); conn.Close(); } 

我跑兩者對比後的結果。從插入查詢中查看tempTable,字段D1和FmN是相同的,但L1和L2在100行中的11行中的c#和vba版本之間不同。而且,它們以不同的順序插入。

在c#版本中沒有任何異常,但這可能是訪問表達式服務的結果嗎?爲什麼行會插入不同的順序和vba和ace.oledb.12.0之間的一些不同?

編輯:我發現了一些我以前沒有注意到的東西 - L1和L2是長整數類型,D1是datetime,userid和fmn是字符串。在執行這些之後,插入到tmpTable中的行與datetime D1的順序完全不同。如果我用D1對錶格進行排序並比較兩者的結果,那麼除了L1和L2不同的100行中的11行之外,所有數據都是相同的。在仔細觀察之後,數據是相同的,只是對於這11行,日期時間是相同的,所以它們不能正確排序。

問題是:爲什麼在Access/vba與c#/。net/ace.oledb.12.0之間執行相同查詢時,查詢插入行的順序與D1不同?

+0

你在C#代碼中使用了什麼連接字符串? – mellamokb

+0

Just:Provider = Microsoft.ACE.OLEDB.12.0; Data Source = pathtodb.mdb。這可能與它有關嗎? – Alex

+0

不應該在'WHERE'子句之前的C#查詢中有多餘的空間嗎? –

回答

1

爲什麼行會以不同的順序插入,而vba和ace.oledb.12.0之間有些不同?

除非您使用ORDER BY子句指定它,否則通常不保證OLEDB查詢返回的數據順序。由於Access直接查詢自己,它可能會保留物理記錄順序。由於您在執行INSERT INTO ... SELECT時無法指定訂單,因此無法強制插入訂單。

至於不同的結果,我會查看一個特定的結果並深入挖掘,在每個系統中運行一個非分組查詢,並查看您是否獲得相同的記錄或翻譯有差異。

作爲一個方面說明,按常量值('" & stringUser & "', 'rampup')分組是不必要的,但它不應該改變您的結果。

相關問題