2013-07-17 56 views
2

我是一個業餘愛好程序員,直到最近才使用ASP經典。我正在使用Razor語法並嘗試從ASP Classic複製一些代碼。自動生成一個數據庫查詢的HTML表格

從我一直在使用W3Schools的ASP的經典代碼如下

<% 
set conn=Server.CreateObject("ADODB.Connection") 
conn.Provider="Microsoft.Jet.OLEDB.4.0" 
conn.Open "c:/webdata/northwind.mdb" 

set rs = Server.CreateObject("ADODB.recordset") 
sql="SELECT Companyname, Contactname FROM Customers" 
rs.Open sql, conn 
%> 

<table border="1" width="100%"> 
    <tr> 
    <%for each x in rs.Fields 
    response.write("<th>" & x.name & "</th>") 
    next%> 
    </tr> 
    <%do until rs.EOF%> 
    <tr> 
    <%for each x in rs.Fields%> 
    <td><%Response.Write(x.value)%></td> 
    <%next 
    rs.MoveNext%> 
    </tr> 
<%loop 
rs.close 
conn.close 
%> 
</table> 

我知道大多數人會說使用的WebGrid。是的,我已經做到了這一點,它真的很慢,所以我試圖通過將它與此進行比較來排除故障。 我的剃刀代碼如下

var SelectCommand1 = "DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); " + 
         "SET @cols = STUFF((SELECT ',' + QUOTENAME(tblTests.Name) " + 
          "FROM tblTestsInEvents c INNER JOIN tblTests ON c.Test_ID = tblTests.Test_ID " + 
          "WHERE c.Event_ID = @0 order by c.TestsInEvents_ID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') " + 
         "set @query = 'SELECT Car_Number, First_Name, Last_Name, ' + @cols + ' " + 
          "from (select First_Name, Last_Name, tblTestsLog.Driver_ID, Name, CorrectedTime, tblDriversInEvents.Car_Number "+ 
            "FROM tblTests INNER JOIN "+ 
             "tblTestsLog ON tblTests.Test_ID = tblTestsLog.Test_ID INNER JOIN "+ 
             "UserProfile ON tblTestsLog.Driver_ID = UserProfile.UserId INNER JOIN "+ 
             "tblDriversInEvents ON UserProfile.UserId = tblDriversInEvents.Driver_ID AND tblTestsLog.Event_ID = tblDriversInEvents.Event_ID) "+ 
         "x pivot (sum(CorrectedTime) for Name in (' + @cols + ')) p ' "+ 
         "execute(@query)"; 
    var SelectedData1 = db.Query(SelectCommand1, EventID); 

內嵌代碼是這樣的:

@{//grid.GetHtml() 
    <text><table></text> 
    foreach (var x in SelectedData1) 
    { 
    @:<tr> 
    foreach (var y in x.Fields) 
    { 
     <text><td>@y.value</td></text> 
    } 
    @:</tr> 

    } 
} 
</table> 

的x.Fields此刻正在失敗,我無法找到一個等效。 任何建議和提示將是偉大的。 謝謝

+0

它的失敗意味着什麼?錯誤是什麼? – gdp

+0

感謝您的回覆。錯誤是指無效的列名稱「Fields」。 .Fields意味着ASP Classic中的某些內容,但不包含在剃刀中。另一種說出我的問題的方法是如何遍歷查詢結果中的所有列 – Trevor78

回答

0

在做了一些更多的搜索之後,我發現這是最好的解決方案。感謝@IUnknown爲我提供了關於這一點的指針。

<table><tr> 
    @{ 
    //This populates the column headings 
    List<string> ColHeads = new List<string>(); 
    var col = SelectedData1.ElementAt(0); 
    foreach(var x in col.Columns) 
    { 
     ColHeads.Add(x); 
     <td>@x</td> 
    }} 
</tr> 
    @{//This populates each row 
    foreach (var tblrow in SelectedData1) 
    {@:<tr> 
     foreach (var rowcolumn in ColHeads) 
     { 
     <td>@tblrow[rowcolumn]</td> 
     } 
     @:</tr> 
    }} 
</table> 

基本上我做了一個列表來包含所有列標題,因爲我正在加載標題行。然後我使用該列表從查詢中獲取數據並填充表格

0

首先,我假設你正在做ASPNET MVC。在這種情況下,我強烈建議將控制器中的數據庫代碼移到更高的位置,填充要在視圖中呈現的特定模型。

因此,例如,您可能有一個DriversInEvents模型(一個簡單的C#類)。你創建一個這樣的集合,並使用從你的數據庫中獲取的內容填充你寫的sql。

您可以收集,然後傳遞給視圖像

return View(driversInEvents); 

在你可以使用類似MVCContrib grid的看法。在codeplex和偉大的網格上免費開始。您不必使用這樣的表格創建網格,網格會爲您處理它,以便您可以專注於定製它的外觀和感覺。 PS:歡迎來到ASPNET MVC。

+0

感謝您的回覆。我可以理解你在說什麼的概念,是的,它會適用於這個例子。但對於未來的查詢,如 '「SELECT * FROM tblTestsLog」'我不認爲你以上的解決方案將工作。糾正我,如果我錯了 – Trevor78

+0

1.如果你正在做一個選擇*你做的一切都是錯誤的。 2.它仍然有效,因爲一旦你有了結果,你就會創建Driver對象的集合。 3.之後,它是同樣的事情 – IUnknown