C# 通过COM将数据表传递到R

C# 通过COM将数据表传递到R,c#,r,com,datatable,interop,C#,R,Com,Datatable,Interop,我试图将数据从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,

我试图将数据从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
int count=dataTable.Rows.count;
对象[]y=新对象[计数];
对象[]x=新对象[计数];
//R不接受DataTables,所以这里我们从中提取数据
//将表复制并将其传递到2个双数组中。
for(int i=0;i
我的问题现在出现了,因为我不再局限于双倍,SQL数据库中的任何内容都是公平的(int、varchar等),而且我不再只调用2列数据(可以是用户指定的任意多列)


如何将动态大小和动态数据类型的数据表转换为可以安全传递到rcom的数组?

我将使用CSV。当然,我对RCOM一无所知:It’祝你好运

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();
}
公共静态字符串DataTableToCSV(DataTable myTable)
{
StringBuilder sb=新的StringBuilder();
for(int i=0;i
在Rockford Lhotka()编写的专业Visual Basic 6.0 Business Objects中,他发表了各种声明,指出COM接口之间跨应用程序边界的最有效数据传输结构是字符串。我不知道这是否属实,但我接受他的资格。因此,我相信Biff MaGriff建议将是解决您的问题的一个很好的简单实现。

就是这样(我可以让CSV解决方案也起作用,但您的想法少了一步)。R自动检测CSV的数据类型,因此它应该能够对字符串矩阵执行相同的操作。非常感谢你,事后看起来总是那么明显!