回答

收藏

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

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

我正在尝试创建一个SqlParameterCollection,但是SqlParameter在sp.Add()方法中添加一些错误。
) D  K6 H# ^: g7 a& }% O) R请帮助我如何添加参数以及如何将其传递给在其中声明aSqlConnection和的另一个函数SqlCommand。
$ j) I3 M  o' w0 ^9 e9 m/ `- [. dSqlParameterCollection sp = null;                    ' N+ v& J3 f. r7 ?( J
sp.Add(new SqlParameter("@CmpyCode", SqlDbType.NVarChar)).Value = CV.Global.CMPYCODE;& W8 F) x* V1 j) Z# s+ h4 k* d
sp.Add(new SqlParameter("@Code", SqlDbType.NVarChar)).Value = codeName;5 E, r7 m$ _1 P( E) j1 ^( [
sp.Add(new SqlParameter("@DisplayCode", SqlDbType.NVarChar)).Value = codeName + "-";5 _; A9 {/ `% d% H& b( O
sp.Add(new SqlParameter("@TotalDigit", SqlDbType.Int)).Value = CV.Global.PARAMTOTALDIGIT;
+ v" l( r# u7 Z8 u" oinsertData("", sp);' X1 X, `/ J  u8 e4 m
我的另一个功能是insertData(…)
$ c% S- I9 _% f0 E/ iinternal static int insertData(string spName, SqlParameterCollection sp)
2 X: _0 r# T# l/ ~: x$ _{
( Q; B8 g  d+ D7 W& C/ X( B# ?        int retObj = 0;# v/ ?7 k; d7 |; x
        using (SqlConnection con = new SqlConnection(CV.Global.CONSTRING))
  S0 j) O2 U  x+ v0 J        {
4 `+ l# Z0 \3 L0 C# Z            try
$ r, |+ ?1 I# j' ^            {0 t* {$ d' B% ]/ z
                con.Open();
( s" L: }. ^/ W, {" A% J6 W                SqlCommand cmd = new SqlCommand(spName, con);
, Q5 e: \5 D8 o# T9 p% j0 d* c: n                cmd.CommandType = CommandType.StoredProcedure;
/ V( W! n2 c- M3 X- X" J+ k                if (sp.Count > 0)! ?8 v( e4 c, L+ R, T
                {
' z2 N# y+ c( m, F; k0 c; d                    foreach (SqlParameter param in sp)2 u8 W' a7 A5 j7 S
                        cmd.Parameters.Add(param);6 p) e6 s/ L' v- l7 p
                }4 h" i4 M' s! E9 |
                retObj = cmd.ExecuteNonQuery();4 z( Q& w$ u* ~3 _2 {& U
            }# d9 ]7 z3 u7 m  {# w
            catch (Exception ev)
1 q$ K6 G( T7 P5 d5 {- S            { $ C2 I3 ?. U- `! u
                Util.Log(ev); & h4 d8 @1 o, h9 c* N5 V  X8 q
                throw;
0 A' [) G# c  u5 V            }6 X7 j4 Y2 w4 v& A# U
            finally7 K' N7 A. E& J9 Q
            {8 u- J! Q9 v: A% s
                try
, d6 Z$ A, S; |7 w                {* ]! p4 v( g" s
                    con.Close();% \5 Z$ c( ?( F: a" ]  Q4 x* S6 G( @; z
                }4 g, J; h; [% G7 O3 D9 c
                catch (Exception ev) { Util.Log(ev); throw; }
- b! A' `8 a' E6 Y3 N, h0 |- D            }' W# _+ Z' @% C1 O# r( i7 {8 a
        }$ H  a6 _) M3 I- B( }
        return retObj;  W3 e" ~+ m& n( I9 c/ r
    }
! c* c! b/ C  o$ D( o% f我正在尝试创建一个SqlParameterCollection并将其传递给insertData函数。但是,当我sp.Add()在第一个函数中调用方法时,它将引发错误。  M! k1 H/ @% B9 J) Z/ R1 P8 M
错误是
$ \  \/ Z) I( c$ Q# d: z& X: d# C1 k6 ?8 X8 p
你调用的对象是空的
( G6 k6 O0 a) i0 P( T

  p' v6 X1 g& N/ |$ a7 [* E               
% A* b4 D% x2 u) K4 t. Y/ M解决方案:
9 u1 J) z/ Z4 H$ l9 \                5 B0 h' M$ @) C6 w+ w, P5 Y
0 t# K, J& I, j4 O) b7 w  w

5 L6 M7 O/ F- R7 P2 l: B                如果不SqlParameterCollection调用其构造函数(新),则不能使用任何变量(例如,参考对象),但是不能使用新变量SqlParameterCollection直接对其进行初始化。它没有公共构造函数,只能从existant的属性中检索SqlCommand。. B" q" r( Y1 c+ i
SqlCommand cmd = new SqlCommand(commandText, connection);
: X# \  l' X1 b! {1 Z SqlParameterCollection sp = cmd.Parameters;3 w4 K0 H+ K. d' h7 H& Y; T
我建议将您的InsertData方法更改为接受a,List并让其处理将参数添加到SqlCommand执行命令文本的
6 \5 i' Y& J3 k& H8 ?# {List sp = new List()- K. [  w# o8 S% E8 ~* d& N& h
{
7 j1 L/ C' C; F+ v. W) ^; R    new SqlParameter() {ParameterName = "@CmpyCode", SqlDbType = SqlDbType.NVarChar, Value= CV.Global.CMPYCODE},
6 z/ F* f+ `9 X% |( G    new SqlParameter() {ParameterName = "@Code", SqlDbType = SqlDbType.NVarChar, Value = codeName},
" B; ~1 D+ ~0 g3 |    new SqlParameter() {ParameterName = "@DisplayCode", SqlDbType = SqlDbType.NVarChar, Value = codeName + "-"},2 [, a7 g# K, o" M1 \$ a
    new SqlParameter() {ParameterName = "@TotalDigit", SqlDbType = SqlDbType.Int, Value = CV.Global.PARAMTOTALDIGIT}! [4 u" B8 f# @/ I0 w, p( g) `& Y* O
};
; I0 o" G4 o" c. @1 H" ginsertData(CV.Sps.SP_INSERT_PARAM_TABLE, sp);
+ n2 O) E: D  r3 n& |并insertData简单地接收SqlParameter的可选列表,并将它们添加到内部SqlCommand参数集合(如果需要). _5 p' x( r1 O% b
internal static int insertData(string spName, List sp = null)
4 u9 }2 Z( A. }* r2 |* B( Z{
% y  W  {# q# F. u  V5 ]6 ~    ....3 I6 \2 ~. t1 c2 p6 j8 d
    if(sp != null)2 Z" E/ `: {, v! k) r  r
        cmd.Parameters.AddRange(sp.ToArray());1 c3 K! n( M9 y- P, P
    ....0 s, k; E4 O9 [3 Y' S' W% Y
}
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则