创建这样的查询不是很好的形式
let fnam_query =
"select * from file_name_info where fnam_origin = 'invoice_cloud'"但是下面的代码块有两个问题。首先,fnam_readOk从读取中返回false。
第二,如何处理OleDbParameter?我尝试使用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" 发布于 2017-06-19 13:28:53
这段代码有很多问题。其中之一是您使用了传递名称和值的OleDbParameter重载。行new OleDbParameter("fnam_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()发布于 2017-06-19 16:46:08
基于我从Panagiotis Kanavos获得的出色答案,我在代码中更改了一个不同的位置,在这里我需要没有嵌入到查询字符串中的参数。我选择使用cmd.Parameters.Add,而不是使用单独的OleDbParameter val。
(* 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 ()) thenhttps://stackoverflow.com/questions/44591345
复制相似问题