Как выполнить более одного соединения SQL Server в ViewController в рамках viewdidload () в Swift - PullRequest
0 голосов
/ 30 сентября 2019

Обычно, когда я устанавливаю одно соединение с сервером sql под viewcontroller, я могу без проблем подключаться и возвращать данные, а также выполнять операции вставки, удаления или обновления. (Я использую https://github.com/martinrybak/SQLClient для своего соединения.) Однако у меня возникают проблемы, если я буду выполнять более одного SQL-запроса при загрузке формы. Например:

    import UIKit

class ZVC: UIViewController, SQLClientDelegate {
    func error(_ error: String!, code: Int32, severity: Int32) {
        print("\(error!) \(code) \(severity)")
    }

    var strPass:String = "",strUName:String = "",strDBName:String = "",strIP:String = ""
    var client1:SQLClient!
    var client2:SQLClient!
    var uSonuc1: [String] = []
    var uSonuc2: [String] = []


    override func viewDidLoad() {
        super.viewDidLoad()
        client1 = SQLClient.sharedInstance()!
        client2 = SQLClient.sharedInstance()!

        let defaults = UserDefaults.standard
        if let str1 = defaults.string(forKey: "DBIP") { strIP = str1 }
        if let str2 = defaults.string(forKey: "DBName") { strDBName = str2 }
        if let str3 = defaults.string(forKey: "DBUser") { strUName = str3 }
        if let str4 = defaults.string(forKey: "DBPass") { strPass = str4 }

        client1 = SQLClient.sharedInstance()!
        client1.delegate = self
        client1.connect(strIP,username: strUName,password: strPass,database: strDBName){ success in
            if success {
                self.client1.execute("select MUSTERI_ADI as SONUC1 from MUSTERI order by MUSTERI_ADI") {
                    results in
                    for table in results as! [[[String:AnyObject]]] {
                        for row in table {
                            for (columnName, value) in row {
                                print("\(columnName) = \(value)")
                                if(columnName == "SONUC1"){
                                    let newVal = value as? String ?? ""
                                    self.uSonuc1.append(newVal)
                                }}}}
                    self.client1.disconnect()
                }}
            else{}
        }

         client2 = SQLClient.sharedInstance()!
         client2.delegate = self
         client2.connect(strIP,username: strUName,password: strPass,database: strDBName){ success in
         if success {
         self.client2.execute("SELECT UserId AS SONUC2 FROM Usertbl") {
         results in
         for table in results as! [[[String:AnyObject]]] {
         for row in table {
         for (columnName, value) in row {
         print("\(columnName) = \(value)")
         if(columnName == "SONUC2"){
         let newVal = value as? String ?? ""
         self.uSonuc2.append(newVal)
         }}}}
         self.client2.disconnect()
         }}
         else{}
         }
    }
}

Не выдает ошибку при сборке, но когда я запускаю программу в симуляторе, строка 8: EXCBADACCESS (код = 1, адрес = ***********) ошибка появилась в строке dbloginfree (login) файла SQLClient.m в папке ObjcSQLClient;и программа закрывается. Как я могу преодолеть эту проблему?

1 Ответ

0 голосов
/ 02 октября 2019

Я реорганизовал свои коды, например, добавил три кнопки и назначил действия для этих кнопок. при нажатии на эти кнопки я могу подключаться и выполнять запросы по отдельности, например:

    import UIKit

class ZVC: UIViewController, SQLClientDelegate {
    func error(_ error: String!, code: Int32, severity: Int32) {
        print("\(error!) \(code) \(severity)")
    }

    var strPass:String = "",strUName:String = "",strDBName:String = "",strIP:String = ""
    var client:SQLClient!
    var uSonuc1: [String] = []
    var uSonuc2: [String] = []
    var uSonuc3: [String] = []
    var cell:UITableViewCell!
    var rowCount:Int!

    @IBOutlet weak var btnO3: UIButton!
    @IBOutlet weak var btnO2: UIButton!
    @IBOutlet weak var btnO1: UIButton!
    @IBOutlet weak var tv1: UITableView!
    @IBOutlet weak var tv2: UITableView!
    @IBOutlet weak var tv3: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let defaults = UserDefaults.standard
        if let str1 = defaults.string(forKey: "DBIP") { strIP = str1 }
        if let str2 = defaults.string(forKey: "DBName") { strDBName = str2 }
        if let str3 = defaults.string(forKey: "DBUser") { strUName = str3 }
        if let str4 = defaults.string(forKey: "DBPass") { strPass = str4 }

    }

    @IBAction func btn3(_ sender: Any) {
        client = SQLClient.sharedInstance()!
        client.delegate = self
        client.connect(strIP,username: strUName,password: strPass,database: strDBName){ success in
            if success {
                self.client.execute("select IL_ILCE as SONUC3 from IL_ILCE order by IL_ILCE") {
                    results in
                    for table in results as! [[[String:AnyObject]]] {
                        for row in table {
                            for (columnName, value) in row {
                                print("\(columnName) = \(value)")
                                if(columnName == "SONUC3"){
                                    let newVal3 = value as? String ?? ""
                                    self.uSonuc3.append(newVal3)
                                }}}}
                    self.client.disconnect()
                    DispatchQueue.main.async { self.tv3.reloadData() }
                }}
            else{}
        }
    }
    @IBAction func btn1(_ sender: Any) {
        client = SQLClient.sharedInstance()!
        client.delegate = self
        client.connect(strIP,username: strUName,password: strPass,database: strDBName){ success in
            if success {
                self.client.execute("select MUSTERI_ADI as SONUC1 from MUSTERI order by MUSTERI_ADI") {
                    results in
                    for table in results as! [[[String:AnyObject]]] {
                        for row in table {
                            for (columnName, value) in row {
                                print("\(columnName) = \(value)")
                                if(columnName == "SONUC1"){
                                    let newVal1 = value as? String ?? ""
                                    self.uSonuc1.append(newVal1)
                                }}}}
                    self.client.disconnect()
                    DispatchQueue.main.async { self.tv1.reloadData() }
                }}
            else{}
        }
    }
    @IBAction func btn2(_ sender: Any) {
        client = SQLClient.sharedInstance()!
        client.delegate = self
        client.connect(strIP,username: strUName,password: strPass,database: strDBName){ success in
            if success {
                self.client.execute("SELECT UserId AS SONUC2 FROM Usertbl") {
                    results in
                    for table in results as! [[[String:AnyObject]]] {
                        for row in table {
                            for (columnName, value) in row {
                                print("\(columnName) = \(value)")
                                if(columnName == "SONUC2"){
                                    let newVal2 = value as? String ?? ""
                                    self.uSonuc2.append(newVal2)
                                }}}}
                    self.client.disconnect()
                    DispatchQueue.main.async { self.tv2.reloadData() }
                }}
            else{}
        }
    }
}
extension ZVC:UITableViewDelegate, UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch tableView {
        case tv1:
            rowCount = uSonuc1.count
        case tv2:
            rowCount = uSonuc2.count
        case tv3:
            rowCount = uSonuc3.count
        default:
            break
        }
        return rowCount
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        switch tableView {
        case tv1:
            let cell1 = tableView.dequeueReusableCell(withIdentifier:"cel1" , for: indexPath)
            cell1.textLabel?.text = uSonuc1[indexPath.row]
            cell = cell1
        case tv2:
            let cell2 = tableView.dequeueReusableCell(withIdentifier:"cel2" , for: indexPath)
            cell2.textLabel?.text = uSonuc2[indexPath.row]
            cell = cell2
        case tv3:
            let cell3 = tableView.dequeueReusableCell(withIdentifier:"cel3" , for: indexPath)
            cell3.textLabel?.text = uSonuc3[indexPath.row]
            cell = cell3
        default:
            break
        }
        return cell
    }
}

Но я хочу выполнить эти действия без нажатия какой-либо кнопки в viewDidLoad (). Поэтому я добавил этот код ниже после UserDefaults в viewDidLoad () {}:

btnO1.sendActions(for: .touchUpInside)
btnO2.sendActions(for: .touchUpInside)
btnO3.sendActions(for: .touchUpInside)

Сборка прошла успешно, но после запуска приложения, когда приложение viewDidLoad закрывается. Например, из этих трех строк кода, если я использую только одну строку, подобную этой:

//btnO1.sendActions(for: .touchUpInside)
btnO2.sendActions(for: .touchUpInside)
//btnO3.sendActions(for: .touchUpInside)

, в этом случае проблем с выполнением действия btn02 не возникает. Но я хочу выполнить все эти действия один за другим. Как я могу решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...