2010-06-29 56 views
3

我想從SQL傳遞數據到C#,然後傳遞給R服務器進行數據分析,然後返回到我的Web應用程序;但是,我使用的COM接口不允許在C#和R(無數據表)之間傳遞複雜的數據類型。我已經使用下面的代碼得到它在過去的工作:將DataTable通過COM傳遞到R

int count = dataTable.Rows.Count; 
    object[] y = new object[count]; 
    object[] x = new object[count]; 

    //R does not accept DataTables, so here we extract the data from 
    //the table and pass it into 2 double arrays. 
    for (int i = 0; i < count; i++) 
    { 
     y[i] = Convert.ToDouble(dataTable.Rows[i][0]); 
     x[i] = Convert.ToDouble(dataTable.Rows[i][1]); 
    } 
    //Instantiate R connection 
    StatConnector r = new STATCONNECTORSRVLib.StatConnectorClass(); 
    r.Init("R"); 
    r.SetSymbol("y", y); //Passes column y into R 
    r.SetSymbol("x", x); //Passes column x into R 

我現在的問題出現,因爲我不再僅限於雙打,任何東西出來的SQL數據庫是公平的遊戲(INT,VARCHAR等等......),而且我不再只調用2列數據(可以是用戶指定的許多列)。

如何將動態大小和動態數據類型的數據錶轉換爲可安全傳遞到rcom的數組?

回答

2

專業的Visual Basic 6.0業務由羅克福德Lhotka(http://search.barnesandnoble.com/Professional-Visual-Basic-60-Business-Objects/Rockford-Lhotka/e/9781861001078)對象,他做各種報表跨應用程序邊界的COM接口之間的最有效的數據傳輸結構是字符串。我不知道這是否屬實,但我接受他的資格。因此,我相信Biff MaGriff的建議對你的問題是一個很好的簡單實現。

+0

這就是它(我可以讓CSV解決方案工作,但你的想法是少一步)。 R自動檢測CSV的數據類型,所以它應該能夠對字符串矩陣做同樣的處理。非常感謝你,事後總是顯得如此明顯! – Dave 2010-07-01 22:17:45

2

我會使用CSV。當然,我對RCOM一無所知:祝你好運!

public static string DataTableToCSV(DataTable myTable) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < myTable.Columns.Count; i++) 
    { 
     sb.Append("\""); 
     sb.Append(myTable.Columns[i].ColumnName); 
     sb.Append("\""); 
     if (i < myTable.Columns.Count - 1) 
      sb.Append(","); 
    } 
    sb.AppendLine(); 
    foreach (DataRow dr in myTable.Rows) 
    { 
     for (int i = 0; i < dr.ItemArray.Length; i++) 
     { 
      sb.Append("\""); 
      sb.Append(dr.ItemArray[i].ToString()); 
      sb.Append("\""); 
      if (i < dr.ItemArray.Length - 1) 
       sb.Append(","); 
     } 
     sb.AppendLine(); 
    } 
    return sb.ToString(); 
}