在Swift中通过SQLClient从SQL Server中提取数据



我正试图从SQL Server中提取数据,我无法存储数据。我得到所有行,但"外面"的函数,我的数据是零。这意味着在我从数据库断开连接之前,我有数据,但是当我关闭连接时,所有数据都消失了。

我认为这是因为我有浅拷贝,我需要深拷贝

import Foundation
import SQLClient
class RecipeViewModel{
var recipes = [Recipe]()
init(){
    getRecipeFromDB()
}
func getRecipeFromDB(){
    let client = SQLClient.sharedInstance() as! SQLClient
    client.connect("x.x.x.x", username: "xx", password: "xxx", database: "xxx") {
        success in
        client.execute("SELECT item FROM TABLE") {
            results in
            for table in results as! [[[String:AnyObject]]] {
                for row in table {
                    for (columnName, value) in row {
                        let recipe = Recipe(code: value as! String, title: "Title")
                        recipes.append(recipe)
                        }
                    }
                }
// prints all recipes. Everything is perfect
        for i in self.recipes{
            print(i.code)
        }
            client.disconnect()
        }
//prints nothing. recipe.count = 0
        for i in self.recipes{
            print(i.code)
        }
    }
}
func error(error: String!, code: Int32, severity: Int32) {
    print(error)
    }
}

我认为这是因为您在闭包之后执行打印食谱。由于函数中的闭包不是按顺序运行的,因此不应该在闭包函数之后立即读取数据(不能保证闭包将在外部函数下面的下一条语句之前执行)。您必须使用completion闭包来存档您的目标。

func getRecipeFromDB(completion: ([Recipe]) -> Void){
    let client = SQLClient.sharedInstance() as! SQLClient
    client.connect("x.x.x.x", username: "xx", password: "xxx", database: "xxx") {
        success in
        client.execute("SELECT item FROM TABLE") {
            results in
            for table in results as! [[[String:AnyObject]]] {
                for row in table {
                    for (columnName, value) in row {
                        let recipe = Recipe(code: value as! String, title: "Title")
                        recipes.append(recipe)
                    }
                }
            }
            // prints all recipes. Everything is perfect
            for i in self.recipes{
                print(i.code)
            }
            client.disconnect()
            // This is important to invoke the callback when reading data is done
            completion(self.recipes)
        }
    }
}
// Call your query data with a completion
getRecipeFromDB {
    (data) in
    for i in data{
        print(i.code)
    }
}
在Swift项目中使用Obj-C的最佳方法是使用桥接头文件,我对SQLCLient所做的就是从SQL客户端拖放文件,然后Xcode会询问您是否要创建桥接头文件,选择yes。

在桥接头文件中,导入"SQLClient.h",从这里您可以构建项目,所有内容都应该可以编译。然后,您可以像上面那样创建SQLClient对象,并在.connect中确保完成处理程序检查它是否成功,然后在闭包中可以调用client。如果你把一个SQL命令作为字符串,并在.execute完成块中使用data作为变量,如果你打印这个数据变量,你将从SQL Server返回所有数据。它返回JSON,所以从这里你可以使用JSON序列化转换。

如果你有任何问题,请随时给我发消息,我会返回我的代码看起来像一个截图,这样它可能会帮助你!

相关内容

  • 没有找到相关文章

最新更新