我正在尝试将数据从SQL传递到C#,然后传递到R服务器进行数据分析,然后再传回我的Web应用程序;但是,我使用的COM接口不允许在C#和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的数组?
答案 0 :(得分: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();
}
答案 1 :(得分:2)
在Rockford Lhotka(http://search.barnesandnoble.com/Professional-Visual-Basic-60-Business-Objects/Rockford-Lhotka/e/9781861001078)的 Professional Visual Basic 6.0 Business Objects 中,他做出了各种声明,即跨越应用程序边界的COM接口之间最有效的数据传输结构是String。我不知道这是否属实,但我接受他的资格。因此,我相信Biff MaGriff的建议对你的问题来说是一个很好的简单实现。