首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当OleDbParameter使用

当OleDbParameter使用
EN

Stack Overflow用户
提问于 2017-06-16 14:07:19
回答 2查看 167关注 0票数 1

创建这样的查询不是很好的形式

代码语言:javascript
复制
let fnam_query =
    "select * from file_name_info where fnam_origin = 'invoice_cloud'"

但是下面的代码块有两个问题。首先,fnam_readOk从读取中返回false。

第二,如何处理OleDbParameter?我尝试使用use,但在编译时出错,说OleDbType.Char不能在使用范围内使用。

代码语言:javascript
复制
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" 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-19 13:28:53

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

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

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

您的查询应该是:

代码语言:javascript
复制
let fnam_query = 
"select * from file_name_info where fnam_origin = ? "

您还应该使用正确的参数类型。Char仅用于固定长度的参数.您应该使用VarChar,甚至更好,NVarchar。

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

整个函数应该如下所示:

代码语言:javascript
复制
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 ()
...

不过,一个更好的实现是创建一次命令并使用不同的连接和值重用它:

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2017-06-19 16:46:08

基于我从Panagiotis Kanavos获得的出色答案,我在代码中更改了一个不同的位置,在这里我需要没有嵌入到查询字符串中的参数。我选择使用cmd.Parameters.Add,而不是使用单独的OleDbParameter val。

代码语言:javascript
复制
(* 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44591345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档