2010-06-29 31 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(); 
} 
相关问题