2013-10-15 75 views
2

我在使用c#Unity脚本中的ODBC访问.xsl文件中的数据。连接有效,我可以从文件中检索数据,但是我的元数据遇到问题。当我调用GetSchema(string)函数时,它会陷入无限的递归调用,直到它导致堆栈溢出。无论我尝试获得什么特定模式,都会发生此问题。在Unity中从excel中检索元数据

这里是我使用的代码:我就遇到了这个问题,我自己

string connectionString = "Driver={Microsoft Excel Driver (*.xls)}; DriverId=790; Dbq=" + file + ";UNICODESQL=1;Unicode=yes;"; 

OdbcConnection dbCon = null; 
OdbcDataReader dbData = null; 

try 
{ 
    dbCon = new OdbcConnection(connectionString); 
    Debug.Log(connectionString); 

    dbCon.Open(); 

    DataTable sheets = dbCon.GetSchema(OdbcMetaDataCollectionNames.Tables); 
    foreach(DataRow sheet in sheets.Rows) 
    { 
    string sheetName = sheet["TABLE_NAME"].ToString().Trim('\'').TrimEnd('$');  
    OdbcCommand dbCommand = new OdbcCommand("SELECT * FROM [" + sheetName + "$]", dbCon); 
    DataTable data = new DataTable(sheetName); 
    dbData = dbCommand.ExecuteReader(); 
    data.Load(dbData); 
    } 
} 
catch (Exception ex) 
{ 
    if (ex != null) 
    { 
    Debug.LogError(ex.Message); 
    Debug.LogError(ex.StackTrace); 
    } 
    else 
    Debug.LogError("Exception raise loading '" + file + "'"); 
} 
finally 
{ 
    if (dbData != null) 
    dbData.Close(); 

    if (dbCon != null) 
    dbCon.Close(); 
} 

}

+0

欢迎来到SO,Wili。 – Brian

+0

我不熟悉使用XLS作为数据源,但可能需要关闭连接吗? –

回答

0

。它与monodevelop的getschema(string str)的实现有关。它不符合人们的期望;它会调用它的其中一个实例,然后它会自动递归调用它(这会导致堆栈溢出),如果连接已关闭,则会抛出异常,另一方面会自行调用它。换句话说,它不会返回它将要返回的东西,它会自动调用自己,直到stackoverflow或连接被关闭(这可能不会发生,因为close-command通常会在后面调用)。

public override DataTable GetSchema (string collectionName) 
{ 
    return GetSchema (collectionName, null); 
} 
public override DataTable GetSchema (string collectionName, string [] restrictionValues) 
{ 
    if (State == ConnectionState.Closed) 
     throw ExceptionHelper.ConnectionClosed(); 
    return GetSchema (collectionName, null); 
} 

^从技术文档:https://github.com/mono/mono/blob/mono-4.0.0-branch/mcs/class/System.Data/System.Data.Odbc/OdbcConnection.cs

这是您的错误的原因,但我很遗憾没有在这个时候任何实际的解决方案,但我的解决办法可能是使用的人。我想在我的Excel文件中获得一些图纸名称,所以我所做的是添加所有我想在特定图纸“Unity”中使用的sheetNames。然后我读入,以获取sheetnames,然后逐个加载它们。

这是一个非常容易出错的解决方案,因为它计数在一个手动列表中,并且该列表正确,但我按时按下,没有其他已知的替代方法,但也许它可以对某人有所帮助。