回答

收藏

如何创建具有多个参数的SqlParameterCollection?

技术问答 技术问答 376 人阅读 | 0 人回复 | 2023-09-14

我正在尝试创建一个SqlParameterCollection,但是SqlParameter在sp.Add()方法中添加一些错误。" F' h; G4 `$ B
请帮助我如何添加参数以及如何将其传递给在其中声明aSqlConnection和的另一个函数SqlCommand。7 w# S# _% b1 f6 ?
SqlParameterCollection sp = null;                    * h! J" r* w) `9 f
sp.Add(new SqlParameter("@CmpyCode", SqlDbType.NVarChar)).Value = CV.Global.CMPYCODE;+ B) h6 s3 P* P% {8 f8 M
sp.Add(new SqlParameter("@Code", SqlDbType.NVarChar)).Value = codeName;, P8 @8 p6 \% P& C0 |+ L. B1 b
sp.Add(new SqlParameter("@DisplayCode", SqlDbType.NVarChar)).Value = codeName + "-";* ?$ ~% ?2 t: p* e5 _6 H! U' _. h
sp.Add(new SqlParameter("@TotalDigit", SqlDbType.Int)).Value = CV.Global.PARAMTOTALDIGIT;
- V2 b( X' U& T- h% E3 b' W0 Y1 d4 ~insertData("", sp);4 \$ ]: U0 D* O) a5 M9 Q& {& d
我的另一个功能是insertData(…)
& j0 F/ j1 z( w# binternal static int insertData(string spName, SqlParameterCollection sp)
7 c) \0 n( s# S5 W4 g7 I" I{0 ~7 {) b: `5 d) x8 W! w" j# L" Y; n  v
        int retObj = 0;
: v0 C2 z* j2 f8 ]/ f        using (SqlConnection con = new SqlConnection(CV.Global.CONSTRING))! k- d8 {5 T! w1 ?; }: s
        {, ^0 J8 w+ @* E$ i1 ]
            try
, C4 R' m" {7 [3 F* w+ i5 O            {- l, `4 w# h( ^3 |
                con.Open();
, D' o$ U: H; ]# a                SqlCommand cmd = new SqlCommand(spName, con);: {9 B4 p" k3 u9 ^+ O# R- a
                cmd.CommandType = CommandType.StoredProcedure;
3 J/ `  q0 A; ~                if (sp.Count > 0)
8 m6 N5 o$ l( E0 }# ]6 X1 y                {
7 h0 {; w- @: W; j( {. B5 y                    foreach (SqlParameter param in sp)
; Y4 l5 [8 U5 r, k                        cmd.Parameters.Add(param);* {3 }/ O, C2 U8 ]4 C* ~2 v
                }
8 N# l8 A$ H! r9 D                retObj = cmd.ExecuteNonQuery();8 F3 o1 \( u# W) W* {2 l
            }- _$ `1 H) P' c% X4 n9 Z  Z$ u
            catch (Exception ev) ' p; H% h3 m/ H, }3 Z/ N
            { : Y/ u# r; I+ P, d" X7 L
                Util.Log(ev); - J' w! M" R! t  S! m: \5 ?4 O) T
                throw; " J1 U: b' P' e* ?4 r) b2 O
            }4 Z# a4 p- _7 ?: n7 `
            finally
5 @$ V- A+ r8 v% n2 ~) I6 |) D; g            {0 h2 W* ^$ d2 w
                try
2 V) V' s6 o9 \                {
* s1 B0 n, p# [+ _9 h                    con.Close();
; \1 f  a5 \3 Z4 c7 i                }
4 k' @% j, e% W6 }                catch (Exception ev) { Util.Log(ev); throw; }7 k# l' R. Z" h1 E  O
            }+ m' O; U8 `" b; N
        }
1 C6 s0 R7 ?' h/ H& w7 m% z1 u        return retObj;* ^1 C4 y5 I$ Z& |5 w. b
    }
* n; F, h! Q$ p! M$ M6 @9 I我正在尝试创建一个SqlParameterCollection并将其传递给insertData函数。但是,当我sp.Add()在第一个函数中调用方法时,它将引发错误。
1 b8 F3 {% [# n/ }错误是5 h# z% u2 }  D, f- T0 j+ i
* \4 V9 `; }* k* K
你调用的对象是空的: M5 l, x7 G9 ^& |$ X9 P) |/ ~& a
4 \( U+ B5 g" N$ F0 i8 G! [
               
6 I' D. L- d( }! y8 o5 _解决方案:
" K# r0 n8 N- n: N, }               
8 b9 Z: Y0 A, @! ~: ~% {- P. ?; k/ m9 ~2 e( ^2 @# a  o
$ j+ y# ^2 |& F: ?8 M0 c! x/ D
                如果不SqlParameterCollection调用其构造函数(新),则不能使用任何变量(例如,参考对象),但是不能使用新变量SqlParameterCollection直接对其进行初始化。它没有公共构造函数,只能从existant的属性中检索SqlCommand。
" ~( u- n# {8 W; d6 V! h9 H; u. I SqlCommand cmd = new SqlCommand(commandText, connection);
8 M. t5 c1 ~* t! p# D SqlParameterCollection sp = cmd.Parameters;
5 L3 u4 L$ z/ u我建议将您的InsertData方法更改为接受a,List并让其处理将参数添加到SqlCommand执行命令文本的! R' H; f& y$ [6 ~8 k2 z; A% i8 F1 p
List sp = new List()( R, x4 P' X: R1 ^
{0 L  a: W  {( B* E; t2 B" U. d
    new SqlParameter() {ParameterName = "@CmpyCode", SqlDbType = SqlDbType.NVarChar, Value= CV.Global.CMPYCODE},& o" b: ], C* k& F8 X$ i7 z& C
    new SqlParameter() {ParameterName = "@Code", SqlDbType = SqlDbType.NVarChar, Value = codeName},8 S0 i, b" ~$ u( }( p
    new SqlParameter() {ParameterName = "@DisplayCode", SqlDbType = SqlDbType.NVarChar, Value = codeName + "-"},/ F2 m& L0 n7 w" i
    new SqlParameter() {ParameterName = "@TotalDigit", SqlDbType = SqlDbType.Int, Value = CV.Global.PARAMTOTALDIGIT}
8 n: h6 W! H+ n};
" l5 u- n* l5 ~' m6 rinsertData(CV.Sps.SP_INSERT_PARAM_TABLE, sp);1 U' S6 t3 b* l$ P: Z
并insertData简单地接收SqlParameter的可选列表,并将它们添加到内部SqlCommand参数集合(如果需要)
- B$ B# ~" J6 H7 ^5 \% minternal static int insertData(string spName, List sp = null)+ @4 a: I& K% k1 `
{' }7 o9 a6 N6 e1 V( V1 d+ _
    ....
% ]% Z5 Z/ c0 |0 `, A$ ]    if(sp != null)" _: L4 W6 P! E  w  B' K
        cmd.Parameters.AddRange(sp.ToArray());; Q$ x' c/ H2 [. P
    ....
& _% |# q  Z+ \! I2 {, \9 I' Y}
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则