Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 使用OLEDBPParameter时无法获取值_F#_Oledbcommand_Oledbparameter - Fatal编程技术网

F# 使用OLEDBPParameter时无法获取值

F# 使用OLEDBPParameter时无法获取值,f#,oledbcommand,oledbparameter,F#,Oledbcommand,Oledbparameter,创建这样的查询是不好的 let fnam_query = "select * from file_name_info where fnam_origin = 'invoice_cloud'" 但是下面的代码块有两个问题。首先,fnam_readOk从读取返回false 第二,如何处理OLEDB参数?我尝试使用use,但出现编译时错误,表示无法在use中使用OleDbType.Char let fnam_query = "select * from file_name_info

创建这样的查询是不好的

let fnam_query =
    "select * from file_name_info where fnam_origin = 'invoice_cloud'"
但是下面的代码块有两个问题。首先,fnam_readOk从读取返回false

第二,如何处理OLEDB参数?我尝试使用use,但出现编译时错误,表示无法在use中使用OleDbType.Char

let fnam_query = 
    "select * from file_name_info where fnam_origin = '?' "

use fnam_cmd = new OleDbCommand(fnam_query, db_con)
let local_params = new OleDbParameter("fnam_origin", OleDbType.Char)
fnam_cmd.Parameters.Add(local_params) |> ignore

let fnam_reader = fnam_cmd.ExecuteReader ()
let fnam_readOK = fnam_reader.Read ()

let ic_lb_fnam =
    if fnam_readOK then
        fnam_reader.GetString(2)
    else
        "ic_lockbox.txt" 

这段代码有很多问题。其中之一是使用了传递名称和值的OLEDBPParameter重载。新的OleDbParameterfnam_origin,OleDbType.Char行指定一个名为fnam_origin的参数,其整数值等于OleDbType.Char的基础值

另一个问题是根本不使用该参数。“?”只是一个包含?的字符串

您不需要在参数化查询中引用参数。它们不是字符串替换的占位符。它们指定实际的强类型参数,就像F函数参数一样

您的查询应该是:

let fnam_query = 
"select * from file_name_info where fnam_origin = ? "
还应使用正确的参数类型。Char仅用于固定长度的参数。你应该使用VarChar或者更好的,NVarchar

最后,您应该传递所需的参数值。您的代码根本没有指定参数值

整个函数应如下所示:

let fnam_query =  "select * from file_name_info where fnam_origin = ? "
use db_con = new OleDbConnection("...")
use fnam_cmd = new OleDbCommand(fnam_query, db_con)
let local_params = new OleDbParameter("origin", SqlDbType.NVarChar,100)
fnam_cmd.Parameters.Add(local_params) |> ignore
local_params.Value <- "GR"


db_con.Open()
let fnam_reader = fnam_cmd.ExecuteReader ()
let fnam_readOK = fnam_reader.Read ()
...
不过,更好的实现是创建一次命令,并使用不同的连接和值重用它:

let build_cmd = 
    let fnam_query =  "select * from file_name_info where fnam_origin = ? "
    let fnam_cmd = new OleDbCommand(fnam_query)
    let local_params = new OleDbParameter("whatever", SqlDbType.NVarChar,100)
    fnam_cmd.Parameters.Add(local_params) |> ignore
    fnam_cmd



use db_con = new OleDbConnection("...")
build_cmd.Connection <- db_con
build_cmd.Parameters.[0].Value <- "GR"
db_con.Open()

基于我从Panagiotis Kanavos那里得到的优秀答案,我在代码中改变了一个不同的地方,在那里我需要查询字符串中没有嵌入的参数。我选择使用cmd.Parameters.Add,而不是使用单独的OleDbParameter val


OLEDB参数不可用IDisposable@TheQuickBrownFox那么,如果使用新的创建,如何清理它呢?我开始认为我的部分代码不需要在那里,因为有一个参数数组是OleDbCommand的一部分。你忘了在参数中输入一个实际值吗?这可以解释为什么看起来没有返回行。尝试用发票云替换OleDbType.Char。这使用了不同的OleDbParameter构造函数重载。RE OleDbParameter:它不需要清理,因为它没有保存任何外部资源。@octopusgrabbus发布实际错误,而不是错误文本的摘要。你通过谈论使用来迷惑人们。该错误与use关键字无关,与无效的查询语法有关
(* by looking at the xfer_type, really the arg passed to main, 
we can determine the report type parameter for the Access 
database. *)
let select_report_type xfer_type =
    match xfer_type with
    | "/al" -> 0
    | "/am" -> 1
    | "/ap" -> 2
    | "/pm" -> 3
    | "/pp" -> 4
    | _     -> 99

let query = "select count(*) from ProcessStatus where ReportType = ? and ReportDate = ? and ReportFileName = ? "
use cmd = new OleDbCommand(query , db_con)
cmd.Parameters.Add(new OleDbParameter("ReportType",(OleDbType.VarChar,5))) |> ignore
cmd.Parameters.[0].Value <- ((select_report_type xfer_type).ToString())

cmd.Parameters.Add(new OleDbParameter("ReportDate",OleDbType.VarChar, 11)) |> ignore
cmd.Parameters.[1].Value <- report_date

cmd.Parameters.Add(new OleDbParameter("ReportFileName",OleDbType.VarChar, 100)) |> ignore
cmd.Parameters.[2].Value <- fn

let sql_reader = cmd.ExecuteReader ()
        if (sql_reader.Read ()) then