我有一个 Javascript Windows 8 应用程序。我正在使用 C# 编写一个 WinRT 组件 DLL 来与数据库交互。
对于 OpenDB、ExecuteUpdate、ExecuteQuery 等所有函数(返回一行,返回一列值),我已经完成了 IASyncOperation 并且非常成功。
但是为了处理一个大结果集中的每一行,我需要将一个回调函数从 javascript 传递给 C# WinRT 组件 DLL。所以代码就像,
My.WinRT.Component.Object.processEachRowASyc(query, arguments, function(row) {
/* Row specific processing */
}).then(function(result) {
/* Process after Entire Row processing is Complete */
});
我已经编写了这样的 RT 组件,
namespace mydb
{
public void delegate MyJSCallback(string msg);
public class Database {
public static IAsyncOperation<Database> OpenDB(string dbFile)
{
/* Open DB */
}
public IAsyncOperation<Database> ProcessEachRowASync(string sql,[ReadOnlyArray()] object[] arg, MyJSCallback myJSCallback)
{
return Task<Database>.Run(() =>
{
/* Query Processing */
IDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string toRet = "{\"Name\":\"Raju\", \"Age\":\"21\"}";
//Javascript callback function called.
myJSCallback(toRet);
}
return this;
}).AsAsyncOperation();
}
}
}
现在,当我从 Visual Studio 执行此操作时出现类型转换错误,我确信我在声明委托或其他地方时犯了错误,
有人可以告诉我我做错了什么以及如何纠正。
下载示例项目的 URL 是http://sdrv.ms/18ff3Hl
为了进一步简化这一点,我在 RTComponent 中编写了另一个函数,仅显示回调错误,代码如下 RT Component
public delegate void SQLite3JSNoCallback();
public IAsyncOperation<int> GetLastInsertRowId(SQLite3JSNoCallback someCallback)
{
return Task<int>.Run(() =>
{
someCallback();
return 0;
}).AsAsyncOperation();
}
现在错误发生在执行 someCallback() 时,错误与上面的屏幕截图相同,仅更改了委托。“无法将‘mydb.SQLite3JSNoCallback’类型的对象转换为‘mydb.SQLite3JSNoCallback’。”