F #: последовательность SQLiteCommand не работает, но одиночная SQLiteCommand работает. Нет ошибок - PullRequest
1 голос
/ 14 октября 2019

Я создаю приложение, которое создает базу данных SQLite по коду.

Работает нормально, я могу создать БД, Таблицы и добавить атрибуты в таблицы.

Я пытался немного его оптимизировать, взяв последовательность запросов, а затем выполняя их все вместе.

Я заметил, что последовательность SQLiteCommand не будет работать, но одна SQLiteCommand работает нормально.

Вот фрагмент кода моего кода, который работает с последовательностью:

// Insert attribute
let rec querySeq container = seq {
    Console.WriteLine("More attributes? S/N")
    match Console.ReadLine() with 
        | "S" | "s" -> 
            Console.WriteLine("Name?")
            let atrName = Console.ReadLine()
            Console.WriteLine("Type?: \n-int\n-string\n-datetime")
            let atrType = Console.ReadLine()
            match atrType with
                | "int" ->      
                    yield sprintf "alter table "+ TableName + " add "+atrName+" integer"
                    yield! querySeq container
                | "string" ->   
                    yield sprintf "alter table "+ TableName + " add "+atrName+" varchar(20)"
                    yield! querySeq container
                | "datetime" -> 
                    yield sprintf "alter table "+ TableName + " add "+atrName+" datetime"
                    yield! querySeq container
                | _ -> failwith "Error in attribute choice"
        | "N" | "n" -> sprintf "Done" |> ignore
        | _ -> failwith("Only S/N")
}

let container = querySeq Seq.empty

printfn "%A" (Seq.toList container)
//Execute multiple
let commands = Seq.map(fun elem -> new SQLiteCommand(elem, connection) ) container
Seq.map(fun (elem : SQLiteCommand) -> elem.ExecuteNonQuery() ) commands |> ignore


 //Try single query
let structureSql = sprintf "alter table "+ TableName + " add t1 varchar(20)"
Console.WriteLine(structureSql)
 //Execute query
let structureCommand = new SQLiteCommand(structureSql, connection)
structureCommand.ExecuteNonQuery() |> ignore 

connection.Close()

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

Может ли быть проблема с подключением? Нужно ли открывать несколько подключений к одному БД?

1 Ответ

3 голосов
/ 14 октября 2019

Как упомянуто в комментариях Seq.map является ленивым, поэтому ни одно из значений последовательности не оценивается. Вы можете использовать Seq.iter, который заставляет действовать все элементы:

container
|> Seq.iter(fun elem ->
    (new SQLiteCommand(elem, connection)).ExecuteNonQuery() |> ignore<int>)

или for / do синтаксис:

for elem in container do
    (new SQLiteCommand(elem, connection)).ExecuteNonQuery() |> ignore<int>
...