DbHelper.cs 106 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208
  1. using System;
  2. using System.Data;
  3. using System.Xml;
  4. using System.Data.Common;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using CB.Common;
  8. using CB.Config;
  9. using CB.Interface;
  10. namespace CB.Data
  11. {
  12. /// <summary>
  13. /// 数据库操作方法类
  14. /// </summary>
  15. public partial class DbHelper
  16. {
  17. #region 私有变量
  18. /// <summary>
  19. /// 数据库连接字符串
  20. /// </summary>
  21. //protected static string m_connectionstring = null;
  22. /// <summary>
  23. /// DbProviderFactory实例
  24. /// </summary>
  25. //private static DbProviderFactory m_factory = null;
  26. /// <summary>
  27. /// Discuz!NT数据接口
  28. /// </summary>
  29. //private static IDbProvider m_provider = null;
  30. /// <summary>
  31. /// 查询次数统计
  32. /// </summary>
  33. private static int m_querycount = 0;
  34. /// <summary>
  35. /// Parameters缓存哈希表
  36. /// </summary>
  37. private static Hashtable m_paramcache = Hashtable.Synchronized(new Hashtable());
  38. private static object lockHelper = new object();
  39. #endregion
  40. #region 属性
  41. /// <summary>
  42. /// 查询次数统计
  43. /// </summary>
  44. public static int QueryCount
  45. {
  46. get { return m_querycount; }
  47. set { m_querycount = value; }
  48. }
  49. /// <summary>
  50. /// 数据库连接字符串
  51. /// </summary>
  52. public static string ConnectionString(string interfaceId)
  53. {
  54. try
  55. {
  56. return DataProviderConfig.GetConfig(interfaceId).ConnectStringName;
  57. }
  58. catch
  59. {
  60. throw new Exception("未找到:[" + interfaceId + "]接口连接字符串" + DataProviderConfig.GetConfig(interfaceId).DbProviderName);
  61. }
  62. }
  63. /// <summary>
  64. /// IDbProvider接口
  65. /// </summary>
  66. public static IDbProvider Provider(string interfaceId)
  67. {
  68. try
  69. {
  70. return (IDbProvider)Activator.CreateInstance(Type.GetType(DataProviderConfig.GetConfig(interfaceId).DbProviderName, false, true));
  71. }
  72. catch
  73. {
  74. throw new Exception("未找到此类[" + interfaceId + "],无法实例化:" + DataProviderConfig.GetConfig(interfaceId).DbProviderName);
  75. }
  76. }
  77. /// <summary>
  78. /// DbFactory实例
  79. /// </summary>
  80. public static DbProviderFactory Factory(string interfaceId)
  81. {
  82. return Provider(interfaceId).Instance();
  83. }
  84. /// <summary>
  85. /// 刷新数据库提供者
  86. /// </summary>
  87. //public static void ResetDbProvider()
  88. //{
  89. // DatabaseProvider.ResetDbProvider();
  90. // m_connectionstring = null;
  91. // m_factory = null;
  92. // m_provider = null;
  93. //}
  94. #endregion
  95. #region 私有方法
  96. /// <summary>
  97. /// 将DbParameter参数数组(参数值)分配给DbCommand命令.
  98. /// 这个方法将给任何一个参数分配DBNull.Value;
  99. /// 该操作将阻止默认值的使用.
  100. /// </summary>
  101. /// <param name="command">命令名</param>
  102. /// <param name="commandParameters">DbParameters数组</param>
  103. private static void AttachParameters(DbCommand command, DbParameter[] commandParameters)
  104. {
  105. if (command == null) throw new ArgumentNullException("command");
  106. if (commandParameters != null)
  107. {
  108. foreach (DbParameter p in commandParameters)
  109. {
  110. if (p != null)
  111. {
  112. // 检查未分配值的输出参数,将其分配以DBNull.Value.
  113. if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) &&
  114. (p.Value == null))
  115. {
  116. p.Value = DBNull.Value;
  117. }
  118. command.Parameters.Add(p);
  119. }
  120. }
  121. }
  122. }
  123. /// <summary>
  124. /// 将DataRow类型的列值分配到DbParameter参数数组.
  125. /// </summary>
  126. /// <param name="commandParameters">要分配值的DbParameter参数数组</param>
  127. /// <param name="dataRow">将要分配给存储过程参数的DataRow</param>
  128. private static void AssignParameterValues(DbParameter[] commandParameters, DataRow dataRow)
  129. {
  130. if ((commandParameters == null) || (dataRow == null))
  131. return;
  132. int i = 0;
  133. // 设置参数值
  134. foreach (DbParameter commandParameter in commandParameters)
  135. {
  136. // 创建参数名称,如果不存在,只抛出一个异常.
  137. if (commandParameter.ParameterName == null ||
  138. commandParameter.ParameterName.Length <= 1)
  139. throw new Exception(
  140. string.Format("请提供参数{0}一个有效的名称{1}.", i, commandParameter.ParameterName));
  141. // 从dataRow的表中获取为参数数组中数组名称的列的索引.
  142. // 如果存在和参数名称相同的列,则将列值赋给当前名称的参数.
  143. if (dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1)
  144. commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)];
  145. i++;
  146. }
  147. }
  148. /// <summary>
  149. /// 将一个对象数组分配给DbParameter参数数组.
  150. /// </summary>
  151. /// <param name="commandParameters">要分配值的DbParameter参数数组</param>
  152. /// <param name="parameterValues">将要分配给存储过程参数的对象数组</param>
  153. private static void AssignParameterValues(DbParameter[] commandParameters, object[] parameterValues)
  154. {
  155. if ((commandParameters == null) || (parameterValues == null))
  156. return;
  157. // 确保对象数组个数与参数个数匹配,如果不匹配,抛出一个异常.
  158. if (commandParameters.Length != parameterValues.Length)
  159. throw new ArgumentException("参数值个数与参数不匹配.");
  160. // 给参数赋值
  161. for (int i = 0, j = commandParameters.Length; i < j; i++)
  162. {
  163. // If the current array value derives from IDbDataParameter, then assign its Value property
  164. if (parameterValues[i] is IDbDataParameter)
  165. {
  166. IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i];
  167. if (paramInstance.Value == null)
  168. commandParameters[i].Value = DBNull.Value;
  169. else
  170. commandParameters[i].Value = paramInstance.Value;
  171. }
  172. else if (parameterValues[i] == null)
  173. commandParameters[i].Value = DBNull.Value;
  174. else
  175. commandParameters[i].Value = parameterValues[i];
  176. }
  177. }
  178. /// <summary>
  179. /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数
  180. /// </summary>
  181. /// <param name="command">要处理的DbCommand</param>
  182. /// <param name="connection">数据库连接</param>
  183. /// <param name="transaction">一个有效的事务或者是null值</param>
  184. /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
  185. /// <param name="commandText">存储过程名或都SQL命令文本</param>
  186. /// <param name="commandParameters">和命令相关联的DbParameter参数数组,如果没有参数为'null'</param>
  187. /// <param name="mustCloseConnection"><c>true</c> 如果连接是打开的,则为true,其它情况下为false.</param>
  188. private static void PrepareCommand(DbCommand command, DbConnection connection, DbTransaction transaction, CommandType commandType, string commandText, DbParameter[] commandParameters, out bool mustCloseConnection)
  189. {
  190. if (command == null) throw new ArgumentNullException("command");
  191. if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText");
  192. // If the provided connection is not open, we will open it
  193. if (connection.State != ConnectionState.Open)
  194. {
  195. mustCloseConnection = true;
  196. connection.Open();
  197. }
  198. else
  199. {
  200. mustCloseConnection = false;
  201. }
  202. // 给命令分配一个数据库连接.
  203. command.Connection = connection;
  204. // 设置命令文本(存储过程名或SQL语句)
  205. command.CommandText = commandText;
  206. // 分配事务
  207. if (transaction != null)
  208. {
  209. if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  210. command.Transaction = transaction;
  211. }
  212. // 设置命令类型.
  213. command.CommandType = commandType;
  214. // 分配命令参数
  215. if (commandParameters != null)
  216. AttachParameters(command, commandParameters);
  217. return;
  218. }
  219. /// <summary>
  220. /// 探索运行时的存储过程,返回DbParameter参数数组.
  221. /// 初始化参数值为 DBNull.Value.
  222. /// </summary>
  223. /// <param name="connection">一个有效的数据库连接</param>
  224. /// <param name="spName">存储过程名称</param>
  225. /// <param name="includeReturnValueParameter">是否包含返回值参数</param>
  226. /// <returns>返回DbParameter参数数组</returns>
  227. private static DbParameter[] DiscoverSpParameterSet(string interfaceId, DbConnection connection, string spName, bool includeReturnValueParameter)
  228. {
  229. if (connection == null) throw new ArgumentNullException("connection");
  230. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  231. if (connection.State == ConnectionState.Open)
  232. connection.Close();
  233. connection.ConnectionString = ConnectionString(interfaceId);
  234. connection.Open();
  235. DbCommand cmd = connection.CreateCommand();
  236. cmd.CommandText = spName;
  237. cmd.CommandType = CommandType.StoredProcedure;
  238. // 检索cmd指定的存储过程的参数信息,并填充到cmd的Parameters参数集中.
  239. Provider(interfaceId).DeriveParameters(cmd);
  240. connection.Close();
  241. // 如果不包含返回值参数,将参数集中的每一个参数删除.
  242. if (!includeReturnValueParameter)
  243. cmd.Parameters.RemoveAt(0);
  244. // 创建参数数组
  245. DbParameter[] discoveredParameters = new DbParameter[cmd.Parameters.Count];
  246. // 将cmd的Parameters参数集复制到discoveredParameters数组.
  247. cmd.Parameters.CopyTo(discoveredParameters, 0);
  248. // 初始化参数值为 DBNull.Value.
  249. foreach (DbParameter discoveredParameter in discoveredParameters)
  250. {
  251. discoveredParameter.Value = DBNull.Value;
  252. }
  253. return discoveredParameters;
  254. }
  255. /// <summary>
  256. /// DbParameter参数数组的深层拷贝.
  257. /// </summary>
  258. /// <param name="originalParameters">原始参数数组</param>
  259. /// <returns>返回一个同样的参数数组</returns>
  260. private static DbParameter[] CloneParameters(DbParameter[] originalParameters)
  261. {
  262. DbParameter[] clonedParameters = new DbParameter[originalParameters.Length];
  263. for (int i = 0, j = originalParameters.Length; i < j; i++)
  264. {
  265. clonedParameters[i] = (DbParameter)((ICloneable)originalParameters[i]).Clone();
  266. }
  267. return clonedParameters;
  268. }
  269. #endregion 私有方法结束
  270. #region ExecuteNonQuery方法
  271. /// <summary>
  272. /// 执行指定连接字符串,类型的DbCommand.
  273. /// </summary>
  274. /// <remarks>
  275. /// 示例:
  276. /// int result = ExecuteNonQuery("SELECT * FROM [table123]");
  277. /// </remarks>
  278. /// <param name="commandText">存储过程名称或SQL语句</param>
  279. /// <returns>返回命令影响的行数</returns>
  280. public static int ExecuteNonQuery(string interfaceId, string commandText)
  281. {
  282. return ExecuteNonQuery(interfaceId, CommandType.Text, commandText, (DbParameter[])null);
  283. }
  284. /// <summary>
  285. /// 执行指定连接字符串,类型的DbCommand.
  286. /// </summary>
  287. /// <remarks>
  288. /// 示例:
  289. /// int result = ExecuteNonQuery("SELECT * FROM [table123]");
  290. /// </remarks>
  291. /// <param name="commandText">存储过程名称或SQL语句</param>
  292. /// <returns>返回命令影响的行数</returns>
  293. public static int ExecuteNonQuery(string interfaceId, out int id, string commandText)
  294. {
  295. return ExecuteNonQuery(interfaceId, out id, CommandType.Text, commandText, (DbParameter[])null);
  296. }
  297. /// <summary>
  298. /// 执行指定连接字符串,类型的DbCommand.
  299. /// </summary>
  300. /// <remarks>
  301. /// 示例:
  302. /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders");
  303. /// </remarks>
  304. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  305. /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
  306. /// <param name="commandText">存储过程名称或SQL语句</param>
  307. /// <returns>返回命令影响的行数</returns>
  308. public static int ExecuteNonQuery(string interfaceId, CommandType commandType, string commandText)
  309. {
  310. return ExecuteNonQuery(interfaceId, commandType, commandText, (DbParameter[])null);
  311. }
  312. /// <summary>
  313. /// 执行指定连接字符串,并返回刚插入的自增ID
  314. /// </summary>
  315. /// <remarks>
  316. /// 示例:
  317. /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders");
  318. /// </remarks>
  319. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  320. /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
  321. /// <param name="commandText">存储过程名称或SQL语句</param>
  322. /// <returns>返回命令影响的行数</returns>
  323. public static int ExecuteNonQuery(string interfaceId, out int id, CommandType commandType, string commandText)
  324. {
  325. return ExecuteNonQuery(interfaceId, out id, commandType, commandText, (DbParameter[])null);
  326. }
  327. /// <summary>
  328. /// 执行指定连接字符串,类型的DbCommand.如果没有提供参数,不返回结果.
  329. /// </summary>
  330. /// <remarks>
  331. /// 示例:
  332. /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new DbParameter("@prodid", 24));
  333. /// </remarks>
  334. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  335. /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
  336. /// <param name="commandText">存储过程名称或SQL语句</param>
  337. /// <param name="commandParameters">DbParameter参数数组</param>
  338. /// <returns>返回命令影响的行数</returns>
  339. public static int ExecuteNonQuery(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  340. {
  341. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  342. using (DbConnection connection = Factory(interfaceId).CreateConnection())
  343. {
  344. connection.ConnectionString = ConnectionString(interfaceId);
  345. //connection.Open();
  346. return ExecuteNonQuery(interfaceId, connection, commandType, commandText, commandParameters);
  347. }
  348. }
  349. /// <summary>
  350. /// 执行指定连接字符串并返回刚插入的自增ID,类型的DbCommand.如果没有提供参数,不返回结果.
  351. /// </summary>
  352. /// <param name="commandType">命令类型 (存储过程,命令文本, 其它.)</param>
  353. /// <param name="commandText">存储过程名称或SQL语句</param>
  354. /// <param name="commandParameters">DbParameter参数数组</param>
  355. /// <returns>返回命令影响的行数</returns>
  356. public static int ExecuteNonQuery(string interfaceId, out int id, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  357. {
  358. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  359. using (DbConnection connection = Factory(interfaceId).CreateConnection())
  360. {
  361. connection.ConnectionString = ConnectionString(interfaceId);
  362. //connection.Open();
  363. return ExecuteNonQuery(interfaceId, out id, connection, commandType, commandText, commandParameters);
  364. }
  365. }
  366. /// <summary>
  367. /// 执行指定数据库连接对象的命令
  368. /// </summary>
  369. /// <remarks>
  370. /// 示例:
  371. /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");
  372. /// </remarks>
  373. /// <param name="connection">一个有效的数据库连接对象</param>
  374. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  375. /// <param name="commandText">存储过程名称或SQL语句</param>
  376. /// <returns>返回影响的行数</returns>
  377. public static int ExecuteNonQuery(string interfaceId, DbConnection connection, CommandType commandType, string commandText)
  378. {
  379. return ExecuteNonQuery(interfaceId, connection, commandType, commandText, (DbParameter[])null);
  380. }
  381. /// <summary>
  382. /// 执行指定数据库连接对象的命令并返回自增ID
  383. /// </summary>
  384. /// <remarks>
  385. /// 示例:
  386. /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders");
  387. /// </remarks>
  388. /// <param name="connection">一个有效的数据库连接对象</param>
  389. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  390. /// <param name="commandText">存储过程名称或SQL语句</param>
  391. /// <returns>返回影响的行数</returns>
  392. public static int ExecuteNonQuery(string interfaceId, out int id, DbConnection connection, CommandType commandType, string commandText)
  393. {
  394. return ExecuteNonQuery(interfaceId, out id, connection, commandType, commandText, (DbParameter[])null);
  395. }
  396. /// <summary>
  397. /// 执行指定数据库连接对象的命令
  398. /// </summary>
  399. /// <remarks>
  400. /// 示例:
  401. /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new DbParameter("@prodid", 24));
  402. /// </remarks>
  403. /// <param name="connection">一个有效的数据库连接对象</param>
  404. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  405. /// <param name="commandText">T存储过程名称或SQL语句</param>
  406. /// <param name="commandParameters">SqlParamter参数数组</param>
  407. /// <returns>返回影响的行数</returns>
  408. public static int ExecuteNonQuery(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  409. {
  410. if (connection == null) throw new ArgumentNullException("connection");
  411. // 创建DbCommand命令,并进行预处理
  412. DbCommand cmd = Factory(interfaceId).CreateCommand();
  413. bool mustCloseConnection = false;
  414. PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
  415. // 执行DbCommand命令,并返回结果.
  416. int retval = cmd.ExecuteNonQuery();
  417. // 清除参数,以便再次使用.
  418. cmd.Parameters.Clear();
  419. if (mustCloseConnection)
  420. connection.Close();
  421. return retval;
  422. }
  423. /// <summary>
  424. /// 执行指定数据库连接对象的命令
  425. /// </summary>
  426. /// <remarks>
  427. /// 示例:
  428. /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new DbParameter("@prodid", 24));
  429. /// </remarks>
  430. /// <param name="connection">一个有效的数据库连接对象</param>
  431. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  432. /// <param name="commandText">T存储过程名称或SQL语句</param>
  433. /// <param name="commandParameters">SqlParamter参数数组</param>
  434. /// <returns>返回影响的行数</returns>
  435. public static int ExecuteNonQuery(string interfaceId, out int id, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  436. {
  437. if (connection == null) throw new ArgumentNullException("connection");
  438. if (Provider(interfaceId).GetLastIdSql().Trim() == "") throw new ArgumentNullException("GetLastIdSql is \"\"");
  439. // 创建DbCommand命令,并进行预处理
  440. DbCommand cmd = Factory(interfaceId).CreateCommand();
  441. bool mustCloseConnection = false;
  442. PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
  443. // 执行命令
  444. int retval = cmd.ExecuteNonQuery();
  445. // 清除参数,以便再次使用.
  446. cmd.Parameters.Clear();
  447. cmd.CommandType = CommandType.Text;
  448. cmd.CommandText = Provider(interfaceId).GetLastIdSql();
  449. id = TypeConverter.ObjectToInt(cmd.ExecuteScalar());
  450. m_querycount++;
  451. if (mustCloseConnection)
  452. {
  453. connection.Close();
  454. }
  455. return retval;
  456. }
  457. /// <summary>
  458. /// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数.
  459. /// </summary>
  460. /// <remarks>
  461. /// 此方法不提供访问存储过程输出参数和返回值
  462. /// 示例:
  463. /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36);
  464. /// </remarks>
  465. /// <param name="connection">一个有效的数据库连接对象</param>
  466. /// <param name="spName">存储过程名</param>
  467. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  468. /// <returns>返回影响的行数</returns>
  469. public static int ExecuteNonQuery(string interfaceId, DbConnection connection, string spName, params object[] parameterValues)
  470. {
  471. if (connection == null) throw new ArgumentNullException("connection");
  472. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  473. // 如果有参数值
  474. if ((parameterValues != null) && (parameterValues.Length > 0))
  475. {
  476. // 从缓存中加载存储过程参数
  477. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName);
  478. // 给存储过程分配参数值
  479. AssignParameterValues(commandParameters, parameterValues);
  480. return ExecuteNonQuery(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters);
  481. }
  482. else
  483. {
  484. return ExecuteNonQuery(interfaceId, connection, CommandType.StoredProcedure, spName);
  485. }
  486. }
  487. /// <summary>
  488. /// 执行带事务的DbCommand.
  489. /// </summary>
  490. /// <remarks>
  491. /// 示例.:
  492. /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders");
  493. /// </remarks>
  494. /// <param name="transaction">一个有效的数据库连接对象</param>
  495. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  496. /// <param name="commandText">存储过程名称或SQL语句</param>
  497. /// <returns>返回影响的行数/returns>
  498. public static int ExecuteNonQuery(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText)
  499. {
  500. return ExecuteNonQuery(interfaceId, transaction, commandType, commandText, (DbParameter[])null);
  501. }
  502. /// <summary>
  503. /// 执行带事务的DbCommand.
  504. /// </summary>
  505. /// <remarks>
  506. /// 示例.:
  507. /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders");
  508. /// </remarks>
  509. /// <param name="transaction">一个有效的数据库连接对象</param>
  510. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  511. /// <param name="commandText">存储过程名称或SQL语句</param>
  512. /// <returns>返回影响的行数/returns>
  513. public static int ExecuteNonQuery(string interfaceId, out int id, DbTransaction transaction, CommandType commandType, string commandText)
  514. {
  515. return ExecuteNonQuery(interfaceId, out id, transaction, commandType, commandText, (DbParameter[])null);
  516. }
  517. /// <summary>
  518. /// 执行带事务的DbCommand(指定参数).
  519. /// </summary>
  520. /// <remarks>
  521. /// 示例:
  522. /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  523. /// </remarks>
  524. /// <param name="transaction">一个有效的数据库连接对象</param>
  525. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  526. /// <param name="commandText">存储过程名称或SQL语句</param>
  527. /// <param name="commandParameters">SqlParamter参数数组</param>
  528. /// <returns>返回影响的行数</returns>
  529. public static int ExecuteNonQuery(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  530. {
  531. if (transaction == null) throw new ArgumentNullException("transaction");
  532. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  533. // 预处理
  534. DbCommand cmd = Factory(interfaceId).CreateCommand();
  535. bool mustCloseConnection = false;
  536. PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
  537. // 执行
  538. // 执行DbCommand命令,并返回结果.
  539. int retval = cmd.ExecuteNonQuery();
  540. // 清除参数集,以便再次使用.
  541. cmd.Parameters.Clear();
  542. return retval;
  543. }
  544. /// <summary>
  545. /// 执行带事务的DbCommand(指定参数).
  546. /// </summary>
  547. /// <remarks>
  548. /// 示例:
  549. /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  550. /// </remarks>
  551. /// <param name="transaction">一个有效的数据库连接对象</param>
  552. /// <param name="commandType">命令类型(存储过程,命令文本或其它.)</param>
  553. /// <param name="commandText">存储过程名称或SQL语句</param>
  554. /// <param name="commandParameters">SqlParamter参数数组</param>
  555. /// <returns>返回影响的行数</returns>
  556. public static int ExecuteNonQuery(string interfaceId, out int id, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  557. {
  558. if (transaction == null) throw new ArgumentNullException("transaction");
  559. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  560. // 预处理
  561. DbCommand cmd = Factory(interfaceId).CreateCommand();
  562. bool mustCloseConnection = false;
  563. PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
  564. // 执行
  565. int retval = cmd.ExecuteNonQuery();
  566. // 清除参数,以便再次使用.
  567. cmd.Parameters.Clear();
  568. cmd.CommandType = CommandType.Text;
  569. cmd.CommandText = Provider(interfaceId).GetLastIdSql();
  570. id = TypeConverter.ObjectToInt(cmd.ExecuteScalar().ToString());
  571. return retval;
  572. }
  573. /// <summary>
  574. /// 执行带事务的DbCommand(指定参数值).
  575. /// </summary>
  576. /// <remarks>
  577. /// 此方法不提供访问存储过程输出参数和返回值
  578. /// 示例:
  579. /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36);
  580. /// </remarks>
  581. /// <param name="transaction">一个有效的数据库连接对象</param>
  582. /// <param name="spName">存储过程名</param>
  583. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  584. /// <returns>返回受影响的行数</returns>
  585. public static int ExecuteNonQuery(string interfaceId, DbTransaction transaction, string spName, params object[] parameterValues)
  586. {
  587. if (transaction == null) throw new ArgumentNullException("transaction");
  588. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  589. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  590. // 如果有参数值
  591. if ((parameterValues != null) && (parameterValues.Length > 0))
  592. {
  593. // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
  594. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName);
  595. // 给存储过程参数赋值
  596. AssignParameterValues(commandParameters, parameterValues);
  597. // 调用重载方法
  598. return ExecuteNonQuery(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters);
  599. }
  600. else
  601. {
  602. // 没有参数值
  603. return ExecuteNonQuery(interfaceId, transaction, CommandType.StoredProcedure, spName);
  604. }
  605. }
  606. #endregion ExecuteNonQuery方法结束
  607. #region ExecuteCommandWithSplitter方法
  608. /// <summary>
  609. /// 运行含有GO命令的多条SQL命令
  610. /// </summary>
  611. /// <param name="commandText">SQL命令字符串</param>
  612. /// <param name="splitter">分割字符串</param>
  613. public static void ExecuteCommandWithSplitter(string interfaceId, string commandText, string splitter)
  614. {
  615. int startPos = 0;
  616. do
  617. {
  618. int lastPos = commandText.IndexOf(splitter, startPos);
  619. int len = (lastPos > startPos ? lastPos : commandText.Length) - startPos;
  620. string query = commandText.Substring(startPos, len);
  621. if (query.Trim().Length > 0)
  622. {
  623. try
  624. {
  625. ExecuteNonQuery(interfaceId, CommandType.Text, query);
  626. }
  627. catch { ;}
  628. }
  629. if (lastPos == -1)
  630. break;
  631. else
  632. startPos = lastPos + splitter.Length;
  633. } while (startPos < commandText.Length);
  634. }
  635. /// <summary>
  636. /// 运行含有GO命令的多条SQL命令
  637. /// </summary>
  638. /// <param name="commandText">SQL命令字符串</param>
  639. public static void ExecuteCommandWithSplitter(string interfaceId, string commandText)
  640. {
  641. ExecuteCommandWithSplitter(interfaceId, commandText, "\r\nGO\r\n");
  642. }
  643. #endregion ExecuteCommandWithSplitter方法结束
  644. #region ExecuteDataset方法
  645. /// <summary>
  646. /// 执行指定数据库连接字符串的命令,返回DataSet.
  647. /// </summary>
  648. /// <remarks>
  649. /// 示例:
  650. /// DataSet ds = ExecuteDataset("SELECT * FROM [table1]");
  651. /// </remarks>
  652. /// <param name="commandText">存储过程名称或SQL语句</param>
  653. /// <returns>返回一个包含结果集的DataSet</returns>
  654. public static DataSet ExecuteDataset(string interfaceId, string commandText)
  655. {
  656. return ExecuteDataset(interfaceId, CommandType.Text, commandText, (DbParameter[])null);
  657. }
  658. /// <summary>
  659. /// 执行指定数据库连接字符串的命令,返回DataSet.
  660. /// </summary>
  661. /// <remarks>
  662. /// 示例:
  663. /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders");
  664. /// </remarks>
  665. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  666. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  667. /// <param name="commandText">存储过程名称或SQL语句</param>
  668. /// <returns>返回一个包含结果集的DataSet</returns>
  669. public static DataSet ExecuteDataset(string interfaceId, CommandType commandType, string commandText)
  670. {
  671. return ExecuteDataset(interfaceId, commandType, commandText, (DbParameter[])null);
  672. }
  673. /// <summary>
  674. /// 执行指定数据库连接字符串的命令,返回DataSet.
  675. /// </summary>
  676. /// <remarks>
  677. /// 示例:
  678. /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  679. /// </remarks>
  680. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  681. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  682. /// <param name="commandText">存储过程名称或SQL语句</param>
  683. /// <param name="commandParameters">SqlParamters参数数组</param>
  684. /// <returns>返回一个包含结果集的DataSet</returns>
  685. public static DataSet ExecuteDataset(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  686. {
  687. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  688. // 创建并打开数据库连接对象,操作完成释放对象.
  689. using (DbConnection connection = Factory(interfaceId).CreateConnection())
  690. {
  691. connection.ConnectionString = ConnectionString(interfaceId);
  692. // connection.Open();
  693. // 调用指定数据库连接字符串重载方法.
  694. return ExecuteDataset(interfaceId, connection, commandType, commandText, commandParameters);
  695. }
  696. }
  697. /// <summary>
  698. /// 执行指定数据库连接对象的命令,返回DataSet.
  699. /// </summary>
  700. /// <remarks>
  701. /// 示例:
  702. /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders");
  703. /// </remarks>
  704. /// <param name="connection">一个有效的数据库连接对象</param>
  705. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  706. /// <param name="commandText">存储过程名或SQL语句</param>
  707. /// <returns>返回一个包含结果集的DataSet</returns>
  708. public static DataSet ExecuteDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText)
  709. {
  710. return ExecuteDataset(interfaceId, connection, commandType, commandText, (DbParameter[])null);
  711. }
  712. /// <summary>
  713. /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet.
  714. /// </summary>
  715. /// <remarks>
  716. /// 示例:
  717. /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  718. /// </remarks>
  719. /// <param name="connection">一个有效的数据库连接对象</param>
  720. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  721. /// <param name="commandText">存储过程名或SQL语句</param>
  722. /// <param name="commandParameters">SqlParamter参数数组</param>
  723. /// <returns>返回一个包含结果集的DataSet</returns>
  724. public static DataSet ExecuteDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  725. {
  726. if (connection == null) throw new ArgumentNullException("connection");
  727. // connection.Close();
  728. connection.ConnectionString = ConnectionString(interfaceId);
  729. connection.Open();
  730. // 预处理
  731. DbCommand cmd = Factory(interfaceId).CreateCommand();
  732. bool mustCloseConnection = false;
  733. PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
  734. // 创建DbDataAdapter和DataSet.
  735. using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter())
  736. {
  737. da.SelectCommand = cmd;
  738. DataSet ds = new DataSet();
  739. // 填充DataSet.
  740. da.Fill(ds);
  741. m_querycount++;
  742. cmd.Parameters.Clear();
  743. if (mustCloseConnection)
  744. connection.Close();
  745. return ds;
  746. }
  747. }
  748. /// <summary>
  749. /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet.
  750. /// </summary>
  751. /// <remarks>
  752. /// 此方法不提供访问存储过程输入参数和返回值.
  753. /// 示例.:
  754. /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36);
  755. /// </remarks>
  756. /// <param name="connection">一个有效的数据库连接对象</param>
  757. /// <param name="spName">存储过程名</param>
  758. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  759. /// <returns>返回一个包含结果集的DataSet</returns>
  760. public static DataSet ExecuteDataset(string interfaceId, DbConnection connection, string spName, params object[] parameterValues)
  761. {
  762. if (connection == null) throw new ArgumentNullException("connection");
  763. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  764. if ((parameterValues != null) && (parameterValues.Length > 0))
  765. {
  766. // 比缓存中加载存储过程参数
  767. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName);
  768. // 给存储过程参数分配值
  769. AssignParameterValues(commandParameters, parameterValues);
  770. return ExecuteDataset(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters);
  771. }
  772. else
  773. {
  774. return ExecuteDataset(interfaceId, connection, CommandType.StoredProcedure, spName);
  775. }
  776. }
  777. /// <summary>
  778. /// 执行指定事务的命令,返回DataSet.
  779. /// </summary>
  780. /// <remarks>
  781. /// 示例:
  782. /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders");
  783. /// </remarks>
  784. /// <param name="transaction">事务</param>
  785. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  786. /// <param name="commandText">存储过程名或SQL语句</param>
  787. /// <returns>返回一个包含结果集的DataSet</returns>
  788. public static DataSet ExecuteDataset(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText)
  789. {
  790. return ExecuteDataset(interfaceId, transaction, commandType, commandText, (DbParameter[])null);
  791. }
  792. /// <summary>
  793. /// 执行指定事务的命令,指定参数,返回DataSet.
  794. /// </summary>
  795. /// <remarks>
  796. /// 示例:
  797. /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  798. /// </remarks>
  799. /// <param name="transaction">事务</param>
  800. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  801. /// <param name="commandText">存储过程名或SQL语句</param>
  802. /// <param name="commandParameters">SqlParamter参数数组</param>
  803. /// <returns>返回一个包含结果集的DataSet</returns>
  804. public static DataSet ExecuteDataset(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  805. {
  806. if (transaction == null) throw new ArgumentNullException("transaction");
  807. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  808. // 预处理
  809. DbCommand cmd = Factory(interfaceId).CreateCommand();
  810. bool mustCloseConnection = false;
  811. PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
  812. // 创建 DataAdapter & DataSet
  813. using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter())
  814. {
  815. da.SelectCommand = cmd;
  816. DataSet ds = new DataSet();
  817. da.Fill(ds);
  818. cmd.Parameters.Clear();
  819. return ds;
  820. }
  821. }
  822. /// <summary>
  823. /// 执行指定事务的命令,指定参数值,返回DataSet.
  824. /// </summary>
  825. /// <remarks>
  826. /// 此方法不提供访问存储过程输入参数和返回值.
  827. /// 示例.:
  828. /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36);
  829. /// </remarks>
  830. /// <param name="transaction">事务</param>
  831. /// <param name="spName">存储过程名</param>
  832. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  833. /// <returns>返回一个包含结果集的DataSet</returns>
  834. public static DataSet ExecuteDataset(string interfaceId, DbTransaction transaction, string spName, params object[] parameterValues)
  835. {
  836. if (transaction == null) throw new ArgumentNullException("transaction");
  837. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  838. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  839. if ((parameterValues != null) && (parameterValues.Length > 0))
  840. {
  841. // 从缓存中加载存储过程参数
  842. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName);
  843. // 给存储过程参数分配值
  844. AssignParameterValues(commandParameters, parameterValues);
  845. return ExecuteDataset(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters);
  846. }
  847. else
  848. {
  849. return ExecuteDataset(interfaceId, transaction, CommandType.StoredProcedure, spName);
  850. }
  851. }
  852. #endregion ExecuteDataset数据集命令结束
  853. #region ExecuteDataTable方法
  854. /// <summary>
  855. /// 执行指定数据库连接字符串的命令,返回DataSet.
  856. /// </summary>
  857. /// <remarks>
  858. /// 示例:
  859. /// DataSet ds = ExecuteDataset("SELECT * FROM [table1]");
  860. /// </remarks>
  861. /// <param name="commandText">存储过程名称或SQL语句</param>
  862. /// <returns>返回一个包含结果集的DataSet</returns>
  863. public static DataTable ExecuteDatatable(string interfaceId, string commandText)
  864. {
  865. return ExecuteDatatable(interfaceId, CommandType.Text, commandText, (DbParameter[])null);
  866. }
  867. /// <summary>
  868. /// 执行指定数据库连接字符串的命令,返回DataSet.
  869. /// </summary>
  870. /// <remarks>
  871. /// 示例:
  872. /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders");
  873. /// </remarks>
  874. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  875. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  876. /// <param name="commandText">存储过程名称或SQL语句</param>
  877. /// <returns>返回一个包含结果集的DataSet</returns>
  878. public static DataTable ExecuteDatatable(string interfaceId, CommandType commandType, string commandText)
  879. {
  880. return ExecuteDatatable(interfaceId, commandType, commandText, (DbParameter[])null);
  881. }
  882. /// <summary>
  883. /// 执行指定数据库连接字符串的命令,返回DataSet.
  884. /// </summary>
  885. /// <remarks>
  886. /// 示例:
  887. /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  888. /// </remarks>
  889. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  890. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  891. /// <param name="commandText">存储过程名称或SQL语句</param>
  892. /// <param name="commandParameters">SqlParamters参数数组</param>
  893. /// <returns>返回一个包含结果集的DataSet</returns>
  894. public static DataTable ExecuteDatatable(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  895. {
  896. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  897. // 创建并打开数据库连接对象,操作完成释放对象.
  898. using (DbConnection connection = Factory(interfaceId).CreateConnection())
  899. {
  900. connection.ConnectionString = ConnectionString(interfaceId);
  901. // connection.Open();
  902. // 调用指定数据库连接字符串重载方法.
  903. return ExecuteDatatable(interfaceId, connection, commandType, commandText, commandParameters);
  904. }
  905. }
  906. /// <summary>
  907. /// 执行指定数据库连接对象的命令,返回DataSet.
  908. /// </summary>
  909. /// <remarks>
  910. /// 示例:
  911. /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders");
  912. /// </remarks>
  913. /// <param name="connection">一个有效的数据库连接对象</param>
  914. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  915. /// <param name="commandText">存储过程名或SQL语句</param>
  916. /// <returns>返回一个包含结果集的DataSet</returns>
  917. public static DataTable ExecuteDatatable(string interfaceId, DbConnection connection, CommandType commandType, string commandText)
  918. {
  919. return ExecuteDatatable(interfaceId, connection, commandType, commandText, (DbParameter[])null);
  920. }
  921. /// <summary>
  922. /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet.
  923. /// </summary>
  924. /// <remarks>
  925. /// 示例:
  926. /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  927. /// </remarks>
  928. /// <param name="connection">一个有效的数据库连接对象</param>
  929. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  930. /// <param name="commandText">存储过程名或SQL语句</param>
  931. /// <param name="commandParameters">SqlParamter参数数组</param>
  932. /// <returns>返回一个包含结果集的DataSet</returns>
  933. public static DataTable ExecuteDatatable(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  934. {
  935. if (connection == null) throw new ArgumentNullException("connection");
  936. // connection.Close();
  937. connection.ConnectionString = ConnectionString(interfaceId);
  938. connection.Open();
  939. // 预处理
  940. DbCommand cmd = Factory(interfaceId).CreateCommand();
  941. bool mustCloseConnection = false;
  942. PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
  943. // 创建DbDataAdapter和DataSet.
  944. using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter())
  945. {
  946. da.SelectCommand = cmd;
  947. DataTable dt = new DataTable();
  948. // 填充DataSet.
  949. da.Fill(dt);
  950. m_querycount++;
  951. cmd.Parameters.Clear();
  952. if (mustCloseConnection)
  953. connection.Close();
  954. return dt;
  955. }
  956. }
  957. /// <summary>
  958. /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet.
  959. /// </summary>
  960. /// <remarks>
  961. /// 此方法不提供访问存储过程输入参数和返回值.
  962. /// 示例.:
  963. /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36);
  964. /// </remarks>
  965. /// <param name="connection">一个有效的数据库连接对象</param>
  966. /// <param name="spName">存储过程名</param>
  967. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  968. /// <returns>返回一个包含结果集的DataSet</returns>
  969. public static DataTable ExecuteDatatable(string interfaceId, DbConnection connection, string spName, params object[] parameterValues)
  970. {
  971. if (connection == null) throw new ArgumentNullException("connection");
  972. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  973. if ((parameterValues != null) && (parameterValues.Length > 0))
  974. {
  975. // 比缓存中加载存储过程参数
  976. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName);
  977. // 给存储过程参数分配值
  978. AssignParameterValues(commandParameters, parameterValues);
  979. return ExecuteDatatable(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters);
  980. }
  981. else
  982. {
  983. return ExecuteDatatable(interfaceId, connection, CommandType.StoredProcedure, spName);
  984. }
  985. }
  986. /// <summary>
  987. /// 执行指定事务的命令,返回DataSet.
  988. /// </summary>
  989. /// <remarks>
  990. /// 示例:
  991. /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders");
  992. /// </remarks>
  993. /// <param name="transaction">事务</param>
  994. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  995. /// <param name="commandText">存储过程名或SQL语句</param>
  996. /// <returns>返回一个包含结果集的DataSet</returns>
  997. public static DataTable ExecuteDatatable(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText)
  998. {
  999. return ExecuteDatatable(interfaceId, transaction, commandType, commandText, (DbParameter[])null);
  1000. }
  1001. /// <summary>
  1002. /// 执行指定事务的命令,指定参数,返回DataSet.
  1003. /// </summary>
  1004. /// <remarks>
  1005. /// 示例:
  1006. /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  1007. /// </remarks>
  1008. /// <param name="transaction">事务</param>
  1009. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1010. /// <param name="commandText">存储过程名或SQL语句</param>
  1011. /// <param name="commandParameters">SqlParamter参数数组</param>
  1012. /// <returns>返回一个包含结果集的DataSet</returns>
  1013. public static DataTable ExecuteDatatable(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1014. {
  1015. if (transaction == null) throw new ArgumentNullException("transaction");
  1016. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1017. // 预处理
  1018. DbCommand cmd = Factory(interfaceId).CreateCommand();
  1019. bool mustCloseConnection = false;
  1020. PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
  1021. // 创建 DataAdapter & DataSet
  1022. using (DbDataAdapter da = Factory(interfaceId).CreateDataAdapter())
  1023. {
  1024. da.SelectCommand = cmd;
  1025. DataTable dt = new DataTable();
  1026. da.Fill(dt);
  1027. cmd.Parameters.Clear();
  1028. return dt;
  1029. }
  1030. }
  1031. /// <summary>
  1032. /// 执行指定事务的命令,指定参数值,返回DataSet.
  1033. /// </summary>
  1034. /// <remarks>
  1035. /// 此方法不提供访问存储过程输入参数和返回值.
  1036. /// 示例.:
  1037. /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36);
  1038. /// </remarks>
  1039. /// <param name="transaction">事务</param>
  1040. /// <param name="spName">存储过程名</param>
  1041. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1042. /// <returns>返回一个包含结果集的DataSet</returns>
  1043. public static DataTable ExecuteDatatable(string interfaceId, DbTransaction transaction, string spName, params object[] parameterValues)
  1044. {
  1045. if (transaction == null) throw new ArgumentNullException("transaction");
  1046. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1047. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1048. if ((parameterValues != null) && (parameterValues.Length > 0))
  1049. {
  1050. // 从缓存中加载存储过程参数
  1051. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName);
  1052. // 给存储过程参数分配值
  1053. AssignParameterValues(commandParameters, parameterValues);
  1054. return ExecuteDatatable(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters);
  1055. }
  1056. else
  1057. {
  1058. return ExecuteDatatable(interfaceId, transaction, CommandType.StoredProcedure, spName);
  1059. }
  1060. }
  1061. #endregion ExecuteDataset数据集命令结束
  1062. #region ExecuteReader 数据阅读器
  1063. /// <summary>
  1064. /// 枚举,标识数据库连接是由BaseDbHelper提供还是由调用者提供
  1065. /// </summary>
  1066. private enum DbConnectionOwnership
  1067. {
  1068. /// <summary>由BaseDbHelper提供连接</summary>
  1069. Internal,
  1070. /// <summary>由调用者提供连接</summary>
  1071. External
  1072. }
  1073. /// <summary>
  1074. /// 执行指定数据库连接对象的数据阅读器.
  1075. /// </summary>
  1076. /// <remarks>
  1077. /// 如果是BaseDbHelper打开连接,当连接关闭DataReader也将关闭.
  1078. /// 如果是调用都打开连接,DataReader由调用都管理.
  1079. /// </remarks>
  1080. /// <param name="connection">一个有效的数据库连接对象</param>
  1081. /// <param name="transaction">一个有效的事务,或者为 'null'</param>
  1082. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1083. /// <param name="commandText">存储过程名或SQL语句</param>
  1084. /// <param name="commandParameters">DbParameters参数数组,如果没有参数则为'null'</param>
  1085. /// <param name="connectionOwnership">标识数据库连接对象是由调用者提供还是由BaseDbHelper提供</param>
  1086. /// <returns>返回包含结果集的DbDataReader</returns>
  1087. private static DbDataReader ExecuteReader(string interfaceId, DbConnection connection, DbTransaction transaction, CommandType commandType, string commandText, DbParameter[] commandParameters, DbConnectionOwnership connectionOwnership)
  1088. {
  1089. if (connection == null) throw new ArgumentNullException("connection");
  1090. //connection.Close();
  1091. connection.ConnectionString = ConnectionString(interfaceId);
  1092. connection.Open();
  1093. bool mustCloseConnection = false;
  1094. // 创建命令
  1095. DbCommand cmd = Factory(interfaceId).CreateCommand();
  1096. try
  1097. {
  1098. PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
  1099. // 创建数据阅读器
  1100. DbDataReader dataReader;
  1101. if (connectionOwnership == DbConnectionOwnership.External)
  1102. {
  1103. dataReader = cmd.ExecuteReader();
  1104. }
  1105. else
  1106. {
  1107. dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  1108. }
  1109. m_querycount++;
  1110. // 清除参数,以便再次使用..
  1111. bool canClear = true;
  1112. foreach (DbParameter commandParameter in cmd.Parameters)
  1113. {
  1114. if (commandParameter.Direction != ParameterDirection.Input)
  1115. canClear = false;
  1116. }
  1117. if (canClear)
  1118. {
  1119. //cmd.Dispose();
  1120. cmd.Parameters.Clear();
  1121. }
  1122. return dataReader;
  1123. }
  1124. catch
  1125. {
  1126. if (mustCloseConnection)
  1127. connection.Close();
  1128. throw;
  1129. }
  1130. }
  1131. /// <summary>
  1132. /// 执行指定数据库连接字符串的数据阅读器.
  1133. /// </summary>
  1134. /// <remarks>
  1135. /// 示例:
  1136. /// DbDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders");
  1137. /// </remarks>
  1138. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1139. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1140. /// <param name="commandText">存储过程名或SQL语句</param>
  1141. /// <returns>返回包含结果集的DbDataReader</returns>
  1142. public static DbDataReader ExecuteReader(string interfaceId, CommandType commandType, string commandText)
  1143. {
  1144. return ExecuteReader(interfaceId, commandType, commandText, (DbParameter[])null);
  1145. }
  1146. /// <summary>
  1147. /// 执行指定数据库连接字符串的数据阅读器,指定参数.
  1148. /// </summary>
  1149. /// <remarks>
  1150. /// 示例:
  1151. /// DbDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  1152. /// </remarks>
  1153. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1154. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1155. /// <param name="commandText">存储过程名或SQL语句</param>
  1156. /// <param name="commandParameters">SqlParamter参数数组(new DbParameter("@prodid", 24))</param>
  1157. /// <returns>返回包含结果集的DbDataReader</returns>
  1158. public static DbDataReader ExecuteReader(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1159. {
  1160. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  1161. DbConnection connection = null;
  1162. try
  1163. {
  1164. connection = Factory(interfaceId).CreateConnection();
  1165. connection.ConnectionString = ConnectionString(interfaceId);
  1166. //connection.Open();
  1167. return ExecuteReader(interfaceId, connection, null, commandType, commandText, commandParameters, DbConnectionOwnership.Internal);
  1168. }
  1169. catch
  1170. {
  1171. // If we fail to return the SqlDatReader, we need to close the connection ourselves
  1172. if (connection != null) connection.Close();
  1173. throw;
  1174. }
  1175. }
  1176. /// <summary>
  1177. /// 执行指定数据库连接字符串的数据阅读器,指定参数值.
  1178. /// </summary>
  1179. /// <remarks>
  1180. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1181. /// 示例:
  1182. /// DbDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36);
  1183. /// </remarks>
  1184. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1185. /// <param name="spName">存储过程名</param>
  1186. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1187. /// <returns>返回包含结果集的DbDataReader</returns>
  1188. public static DbDataReader ExecuteReader(string interfaceId, string spName, params object[] parameterValues)
  1189. {
  1190. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  1191. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1192. if ((parameterValues != null) && (parameterValues.Length > 0))
  1193. {
  1194. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, spName);
  1195. AssignParameterValues(commandParameters, parameterValues);
  1196. return ExecuteReader(ConnectionString(interfaceId), CommandType.StoredProcedure, spName, commandParameters);
  1197. }
  1198. else
  1199. {
  1200. return ExecuteReader(ConnectionString(interfaceId), CommandType.StoredProcedure, spName);
  1201. }
  1202. }
  1203. /// <summary>
  1204. /// 执行指定数据库连接对象的数据阅读器.
  1205. /// </summary>
  1206. /// <remarks>
  1207. /// 示例:
  1208. /// DbDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders");
  1209. /// </remarks>
  1210. /// <param name="connection">一个有效的数据库连接对象</param>
  1211. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1212. /// <param name="commandText">存储过程名或SQL语句</param>
  1213. /// <returns>返回包含结果集的DbDataReader</returns>
  1214. public static DbDataReader ExecuteReader(string interfaceId, DbConnection connection, CommandType commandType, string commandText)
  1215. {
  1216. return ExecuteReader(interfaceId, connection, commandType, commandText, (DbParameter[])null);
  1217. }
  1218. /// <summary>
  1219. /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数.
  1220. /// </summary>
  1221. /// <remarks>
  1222. /// 示例:
  1223. /// DbDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  1224. /// </remarks>
  1225. /// <param name="connection">一个有效的数据库连接对象</param>
  1226. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1227. /// <param name="commandText">命令类型 (存储过程,命令文本或其它)</param>
  1228. /// <param name="commandParameters">SqlParamter参数数组</param>
  1229. /// <returns>返回包含结果集的DbDataReader</returns>
  1230. public static DbDataReader ExecuteReader(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1231. {
  1232. return ExecuteReader(interfaceId, connection, (DbTransaction)null, commandType, commandText, commandParameters, DbConnectionOwnership.External);
  1233. }
  1234. /// <summary>
  1235. /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值.
  1236. /// </summary>
  1237. /// <remarks>
  1238. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1239. /// 示例:
  1240. /// DbDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36);
  1241. /// </remarks>
  1242. /// <param name="connection">一个有效的数据库连接对象</param>
  1243. /// <param name="spName">T存储过程名</param>
  1244. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1245. /// <returns>返回包含结果集的DbDataReader</returns>
  1246. public static DbDataReader ExecuteReader(string interfaceId, DbConnection connection, string spName, params object[] parameterValues)
  1247. {
  1248. if (connection == null) throw new ArgumentNullException("connection");
  1249. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1250. if ((parameterValues != null) && (parameterValues.Length > 0))
  1251. {
  1252. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName);
  1253. AssignParameterValues(commandParameters, parameterValues);
  1254. return ExecuteReader(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters);
  1255. }
  1256. else
  1257. {
  1258. return ExecuteReader(interfaceId, connection, CommandType.StoredProcedure, spName);
  1259. }
  1260. }
  1261. /// <summary>
  1262. /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值.
  1263. /// </summary>
  1264. /// <remarks>
  1265. /// 示例:
  1266. /// DbDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders");
  1267. /// </remarks>
  1268. /// <param name="transaction">一个有效的连接事务</param>
  1269. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1270. /// <param name="commandText">存储过程名称或SQL语句</param>
  1271. /// <returns>返回包含结果集的DbDataReader</returns>
  1272. public static DbDataReader ExecuteReader(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText)
  1273. {
  1274. return ExecuteReader(interfaceId, transaction, commandType, commandText, (DbParameter[])null);
  1275. }
  1276. /// <summary>
  1277. /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数.
  1278. /// </summary>
  1279. /// <remarks>
  1280. /// 示例:
  1281. /// DbDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new DbParameter("@prodid", 24));
  1282. /// </remarks>
  1283. /// <param name="transaction">一个有效的连接事务</param>
  1284. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1285. /// <param name="commandText">存储过程名称或SQL语句</param>
  1286. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1287. /// <returns>返回包含结果集的DbDataReader</returns>
  1288. public static DbDataReader ExecuteReader(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1289. {
  1290. if (transaction == null) throw new ArgumentNullException("transaction");
  1291. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1292. return ExecuteReader(interfaceId, transaction.Connection, transaction, commandType, commandText, commandParameters, DbConnectionOwnership.External);
  1293. }
  1294. /// <summary>
  1295. /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值.
  1296. /// </summary>
  1297. /// <remarks>
  1298. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1299. ///
  1300. /// 示例:
  1301. /// DbDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36);
  1302. /// </remarks>
  1303. /// <param name="transaction">一个有效的连接事务</param>
  1304. /// <param name="spName">存储过程名称</param>
  1305. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1306. /// <returns>返回包含结果集的DbDataReader</returns>
  1307. public static DbDataReader ExecuteReader(string interfaceId, DbTransaction transaction, string spName, params object[] parameterValues)
  1308. {
  1309. if (transaction == null) throw new ArgumentNullException("transaction");
  1310. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1311. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1312. // 如果有参数值
  1313. if ((parameterValues != null) && (parameterValues.Length > 0))
  1314. {
  1315. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName);
  1316. AssignParameterValues(commandParameters, parameterValues);
  1317. return ExecuteReader(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters);
  1318. }
  1319. else
  1320. {
  1321. // 没有参数值
  1322. return ExecuteReader(interfaceId, transaction, CommandType.StoredProcedure, spName);
  1323. }
  1324. }
  1325. #endregion ExecuteReader数据阅读器
  1326. #region ExecuteScalar 返回结果集中的第一行第一列
  1327. /// <summary>
  1328. /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列.
  1329. /// </summary>
  1330. /// <remarks>
  1331. /// 示例:
  1332. /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount");
  1333. /// </remarks>
  1334. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1335. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1336. /// <param name="commandText">存储过程名称或SQL语句</param>
  1337. /// <returns>返回结果集中的第一行第一列</returns>
  1338. public static object ExecuteScalar(string interfaceId, CommandType commandType, string commandText)
  1339. {
  1340. // 执行参数为空的方法
  1341. return ExecuteScalar(interfaceId, commandType, commandText, (DbParameter[])null);
  1342. }
  1343. /// <summary>
  1344. /// 执行指定数据库连接字符串的命令,指定参数,返回结果集中的第一行第一列.
  1345. /// </summary>
  1346. /// <remarks>
  1347. /// 示例:
  1348. /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new DbParameter("@prodid", 24));
  1349. /// </remarks>
  1350. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1351. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1352. /// <param name="commandText">存储过程名称或SQL语句</param>
  1353. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1354. /// <returns>返回结果集中的第一行第一列</returns>
  1355. public static object ExecuteScalar(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1356. {
  1357. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  1358. // 创建并打开数据库连接对象,操作完成释放对象.
  1359. using (DbConnection connection = Factory(interfaceId).CreateConnection())
  1360. {
  1361. connection.ConnectionString = ConnectionString(interfaceId);
  1362. // connection.Open();
  1363. // 调用指定数据库连接字符串重载方法.
  1364. return ExecuteScalar(interfaceId, connection, commandType, commandText, commandParameters);
  1365. }
  1366. }
  1367. /// <summary>
  1368. /// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列.
  1369. /// </summary>
  1370. /// <remarks>
  1371. /// 示例:
  1372. /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount");
  1373. /// </remarks>
  1374. /// <param name="connection">一个有效的数据库连接对象</param>
  1375. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1376. /// <param name="commandText">存储过程名称或SQL语句</param>
  1377. /// <returns>返回结果集中的第一行第一列</returns>
  1378. public static object ExecuteScalar(string interfaceId, DbConnection connection, CommandType commandType, string commandText)
  1379. {
  1380. // 执行参数为空的方法
  1381. return ExecuteScalar(interfaceId, connection, commandType, commandText, (DbParameter[])null);
  1382. }
  1383. /// <summary>
  1384. /// 执行指定数据库连接对象的命令,指定参数,返回结果集中的第一行第一列.
  1385. /// </summary>
  1386. /// <remarks>
  1387. /// 示例:
  1388. /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new DbParameter("@prodid", 24));
  1389. /// </remarks>
  1390. /// <param name="connection">一个有效的数据库连接对象</param>
  1391. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1392. /// <param name="commandText">存储过程名称或SQL语句</param>
  1393. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1394. /// <returns>返回结果集中的第一行第一列</returns>
  1395. public static object ExecuteScalar(string interfaceId, DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1396. {
  1397. if (connection == null) throw new ArgumentNullException("connection");
  1398. //connection.Close();
  1399. connection.ConnectionString = ConnectionString(interfaceId);
  1400. connection.Open();
  1401. // 创建DbCommand命令,并进行预处理
  1402. DbCommand cmd = Factory(interfaceId).CreateCommand();
  1403. bool mustCloseConnection = false;
  1404. PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
  1405. // 执行DbCommand命令,并返回结果.
  1406. object retval = cmd.ExecuteScalar();
  1407. // 清除参数,以便再次使用.
  1408. cmd.Parameters.Clear();
  1409. if (mustCloseConnection)
  1410. connection.Close();
  1411. return retval;
  1412. }
  1413. /// <summary>
  1414. /// 执行指定数据库连接对象的命令,指定参数值,返回结果集中的第一行第一列.
  1415. /// </summary>
  1416. /// <remarks>
  1417. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1418. ///
  1419. /// 示例:
  1420. /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36);
  1421. /// </remarks>
  1422. /// <param name="connection">一个有效的数据库连接对象</param>
  1423. /// <param name="spName">存储过程名称</param>
  1424. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1425. /// <returns>返回结果集中的第一行第一列</returns>
  1426. public static object ExecuteScalar(string interfaceId, DbConnection connection, string spName, params object[] parameterValues)
  1427. {
  1428. if (connection == null) throw new ArgumentNullException("connection");
  1429. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1430. // 如果有参数值
  1431. if ((parameterValues != null) && (parameterValues.Length > 0))
  1432. {
  1433. // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
  1434. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, connection, spName);
  1435. // 给存储过程参数赋值
  1436. AssignParameterValues(commandParameters, parameterValues);
  1437. // 调用重载方法
  1438. return ExecuteScalar(interfaceId, connection, CommandType.StoredProcedure, spName, commandParameters);
  1439. }
  1440. else
  1441. {
  1442. // 没有参数值
  1443. return ExecuteScalar(interfaceId, connection, CommandType.StoredProcedure, spName);
  1444. }
  1445. }
  1446. /// <summary>
  1447. /// 执行指定数据库事务的命令,返回结果集中的第一行第一列.
  1448. /// </summary>
  1449. /// <remarks>
  1450. /// 示例:
  1451. /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount");
  1452. /// </remarks>
  1453. /// <param name="transaction">一个有效的连接事务</param>
  1454. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1455. /// <param name="commandText">存储过程名称或SQL语句</param>
  1456. /// <returns>返回结果集中的第一行第一列</returns>
  1457. public static object ExecuteScalar(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText)
  1458. {
  1459. // 执行参数为空的方法
  1460. return ExecuteScalar(interfaceId, transaction, commandType, commandText, (DbParameter[])null);
  1461. }
  1462. /// <summary>
  1463. /// 执行指定数据库事务的命令,指定参数,返回结果集中的第一行第一列.
  1464. /// </summary>
  1465. /// <remarks>
  1466. /// 示例:
  1467. /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new DbParameter("@prodid", 24));
  1468. /// </remarks>
  1469. /// <param name="transaction">一个有效的连接事务</param>
  1470. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1471. /// <param name="commandText">存储过程名称或SQL语句</param>
  1472. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1473. /// <returns>返回结果集中的第一行第一列</returns>
  1474. public static object ExecuteScalar(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1475. {
  1476. if (transaction == null) throw new ArgumentNullException("transaction");
  1477. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1478. // 创建DbCommand命令,并进行预处理
  1479. DbCommand cmd = Factory(interfaceId).CreateCommand();
  1480. bool mustCloseConnection = false;
  1481. PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
  1482. // 执行DbCommand命令,并返回结果.
  1483. object retval = cmd.ExecuteScalar();
  1484. m_querycount++;
  1485. // 清除参数,以便再次使用.
  1486. cmd.Parameters.Clear();
  1487. return retval;
  1488. }
  1489. /// <summary>
  1490. /// 执行指定数据库事务的命令,指定参数值,返回结果集中的第一行第一列.
  1491. /// </summary>
  1492. /// <remarks>
  1493. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1494. ///
  1495. /// 示例:
  1496. /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36);
  1497. /// </remarks>
  1498. /// <param name="transaction">一个有效的连接事务</param>
  1499. /// <param name="spName">存储过程名称</param>
  1500. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1501. /// <returns>返回结果集中的第一行第一列</returns>
  1502. public static object ExecuteScalar(string interfaceId, DbTransaction transaction, string spName, params object[] parameterValues)
  1503. {
  1504. if (transaction == null) throw new ArgumentNullException("transaction");
  1505. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1506. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1507. // 如果有参数值
  1508. if ((parameterValues != null) && (parameterValues.Length > 0))
  1509. {
  1510. // PPull the parameters for this stored procedure from the parameter cache ()
  1511. DbParameter[] commandParameters = GetSpParameterSet(interfaceId, transaction.Connection, spName);
  1512. // 给存储过程参数赋值
  1513. AssignParameterValues(commandParameters, parameterValues);
  1514. // 调用重载方法
  1515. return ExecuteScalar(interfaceId, transaction, CommandType.StoredProcedure, spName, commandParameters);
  1516. }
  1517. else
  1518. {
  1519. // 没有参数值
  1520. return ExecuteScalar(interfaceId, transaction, CommandType.StoredProcedure, spName);
  1521. }
  1522. }
  1523. #endregion ExecuteScalar
  1524. #region FillDataset 填充数据集
  1525. /// <summary>
  1526. /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.
  1527. /// </summary>
  1528. /// <remarks>
  1529. /// 示例:
  1530. /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
  1531. /// </remarks>
  1532. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1533. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1534. /// <param name="commandText">存储过程名称或SQL语句</param>
  1535. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1536. /// <param name="tableNames">表映射的数据表数组
  1537. /// 用户定义的表名 (可有是实际的表名.)</param>
  1538. //public static void FillDataset(CommandType commandType, string commandText, DataSet dataSet, string[] tableNames)
  1539. //{
  1540. // if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString");
  1541. // if (dataSet == null) throw new ArgumentNullException("dataSet");
  1542. // // 创建并打开数据库连接对象,操作完成释放对象.
  1543. // using (DbConnection connection = Factory.CreateConnection())
  1544. // {
  1545. // connection.ConnectionString = ConnectionString;
  1546. // connection.Open();
  1547. // // 调用指定数据库连接字符串重载方法.
  1548. // FillDataset(connection, commandType, commandText, dataSet, tableNames);
  1549. // }
  1550. //}
  1551. /// <summary>
  1552. /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数.
  1553. /// </summary>
  1554. /// <remarks>
  1555. /// 示例:
  1556. /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24));
  1557. /// </remarks>
  1558. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1559. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1560. /// <param name="commandText">存储过程名称或SQL语句</param>
  1561. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1562. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1563. /// <param name="tableNames">表映射的数据表数组
  1564. /// 用户定义的表名 (可有是实际的表名.)
  1565. /// </param>
  1566. //public static void FillDataset(CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters)
  1567. //{
  1568. // if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString");
  1569. // if (dataSet == null) throw new ArgumentNullException("dataSet");
  1570. // // 创建并打开数据库连接对象,操作完成释放对象.
  1571. // using (DbConnection connection = Factory.CreateConnection())
  1572. // {
  1573. // connection.ConnectionString = ConnectionString;
  1574. // connection.Open();
  1575. // // 调用指定数据库连接字符串重载方法.
  1576. // FillDataset(connection, commandType, commandText, dataSet, tableNames, commandParameters);
  1577. // }
  1578. //}
  1579. /// <summary>
  1580. /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集,指定存储过程参数值.
  1581. /// </summary>
  1582. /// <remarks>
  1583. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1584. ///
  1585. /// 示例:
  1586. /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 24);
  1587. /// </remarks>
  1588. /// <param name="ConnectionString">一个有效的数据库连接字符串</param>
  1589. /// <param name="spName">存储过程名称</param>
  1590. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1591. /// <param name="tableNames">表映射的数据表数组
  1592. /// 用户定义的表名 (可有是实际的表名.)
  1593. /// </param>
  1594. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1595. //public static void FillDataset(string spName, DataSet dataSet, string[] tableNames, params object[] parameterValues)
  1596. //{
  1597. // if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString");
  1598. // if (dataSet == null) throw new ArgumentNullException("dataSet");
  1599. // // 创建并打开数据库连接对象,操作完成释放对象.
  1600. // using (DbConnection connection = Factory.CreateConnection())
  1601. // {
  1602. // connection.ConnectionString = ConnectionString;
  1603. // connection.Open();
  1604. // // 调用指定数据库连接字符串重载方法.
  1605. // FillDataset(connection, spName, dataSet, tableNames, parameterValues);
  1606. // }
  1607. //}
  1608. /// <summary>
  1609. /// 执行指定数据库连接对象的命令,映射数据表并填充数据集.
  1610. /// </summary>
  1611. /// <remarks>
  1612. /// 示例:
  1613. /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
  1614. /// </remarks>
  1615. /// <param name="connection">一个有效的数据库连接对象</param>
  1616. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1617. /// <param name="commandText">存储过程名称或SQL语句</param>
  1618. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1619. /// <param name="tableNames">表映射的数据表数组
  1620. /// 用户定义的表名 (可有是实际的表名.)
  1621. /// </param>
  1622. public static void FillDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames)
  1623. {
  1624. FillDataset(interfaceId, connection, commandType, commandText, dataSet, tableNames, null);
  1625. }
  1626. /// <summary>
  1627. /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定参数.
  1628. /// </summary>
  1629. /// <remarks>
  1630. /// 示例:
  1631. /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24));
  1632. /// </remarks>
  1633. /// <param name="connection">一个有效的数据库连接对象</param>
  1634. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1635. /// <param name="commandText">存储过程名称或SQL语句</param>
  1636. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1637. /// <param name="tableNames">表映射的数据表数组
  1638. /// 用户定义的表名 (可有是实际的表名.)
  1639. /// </param>
  1640. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1641. public static void FillDataset(string interfaceId, DbConnection connection, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters)
  1642. {
  1643. FillDataset(interfaceId, connection, null, commandType, commandText, dataSet, tableNames, commandParameters);
  1644. }
  1645. /// <summary>
  1646. /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定存储过程参数值.
  1647. /// </summary>
  1648. /// <remarks>
  1649. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1650. ///
  1651. /// 示例:
  1652. /// FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 36);
  1653. /// </remarks>
  1654. /// <param name="connection">一个有效的数据库连接对象</param>
  1655. /// <param name="spName">存储过程名称</param>
  1656. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1657. /// <param name="tableNames">表映射的数据表数组
  1658. /// 用户定义的表名 (可有是实际的表名.)
  1659. /// </param>
  1660. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1661. //public static void FillDataset(DbConnection connection, string spName, DataSet dataSet, string[] tableNames, params object[] parameterValues)
  1662. //{
  1663. // if (connection == null) throw new ArgumentNullException("connection");
  1664. // if (dataSet == null) throw new ArgumentNullException("dataSet");
  1665. // if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1666. // // 如果有参数值
  1667. // if ((parameterValues != null) && (parameterValues.Length > 0))
  1668. // {
  1669. // // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
  1670. // DbParameter[] commandParameters = GetSpParameterSet(connection, spName);
  1671. // // 给存储过程参数赋值
  1672. // AssignParameterValues(commandParameters, parameterValues);
  1673. // // 调用重载方法
  1674. // FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);
  1675. // }
  1676. // else
  1677. // {
  1678. // // 没有参数值
  1679. // FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames);
  1680. // }
  1681. //}
  1682. /// <summary>
  1683. /// 执行指定数据库事务的命令,映射数据表并填充数据集.
  1684. /// </summary>
  1685. /// <remarks>
  1686. /// 示例:
  1687. /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"});
  1688. /// </remarks>
  1689. /// <param name="transaction">一个有效的连接事务</param>
  1690. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1691. /// <param name="commandText">存储过程名称或SQL语句</param>
  1692. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1693. /// <param name="tableNames">表映射的数据表数组
  1694. /// 用户定义的表名 (可有是实际的表名.)
  1695. /// </param>
  1696. //public static void FillDataset(DbTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames)
  1697. //{
  1698. // FillDataset(transaction, commandType, commandText, dataSet, tableNames, null);
  1699. //}
  1700. /// <summary>
  1701. /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定参数.
  1702. /// </summary>
  1703. /// <remarks>
  1704. /// 示例:
  1705. /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24));
  1706. /// </remarks>
  1707. /// <param name="transaction">一个有效的连接事务</param>
  1708. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1709. /// <param name="commandText">存储过程名称或SQL语句</param>
  1710. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1711. /// <param name="tableNames">表映射的数据表数组
  1712. /// 用户定义的表名 (可有是实际的表名.)
  1713. /// </param>
  1714. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1715. public static void FillDataset(string interfaceId, DbTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters)
  1716. {
  1717. FillDataset(interfaceId, transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters);
  1718. }
  1719. /// <summary>
  1720. /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定存储过程参数值.
  1721. /// </summary>
  1722. /// <remarks>
  1723. /// 此方法不提供访问存储过程输出参数和返回值参数.
  1724. ///
  1725. /// 示例:
  1726. /// FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 36);
  1727. /// </remarks>
  1728. /// <param name="transaction">一个有效的连接事务</param>
  1729. /// <param name="spName">存储过程名称</param>
  1730. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1731. /// <param name="tableNames">表映射的数据表数组
  1732. /// 用户定义的表名 (可有是实际的表名.)
  1733. /// </param>
  1734. /// <param name="parameterValues">分配给存储过程输入参数的对象数组</param>
  1735. //public static void FillDataset(DbTransaction transaction, string spName, DataSet dataSet, string[] tableNames, params object[] parameterValues)
  1736. //{
  1737. // if (transaction == null) throw new ArgumentNullException("transaction");
  1738. // if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1739. // if (dataSet == null) throw new ArgumentNullException("dataSet");
  1740. // if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1741. // // 如果有参数值
  1742. // if ((parameterValues != null) && (parameterValues.Length > 0))
  1743. // {
  1744. // // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. ()
  1745. // DbParameter[] commandParameters = GetSpParameterSet(transaction.Connection, spName);
  1746. // // 给存储过程参数赋值
  1747. // AssignParameterValues(commandParameters, parameterValues);
  1748. // // 调用重载方法
  1749. // FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters);
  1750. // }
  1751. // else
  1752. // {
  1753. // // 没有参数值
  1754. // FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames);
  1755. // }
  1756. //}
  1757. /// <summary>
  1758. /// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,映射数据表并填充数据集,DataSet/TableNames/DbParameters.
  1759. /// </summary>
  1760. /// <remarks>
  1761. /// 示例:
  1762. /// FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new DbParameter("@prodid", 24));
  1763. /// </remarks>
  1764. /// <param name="connection">一个有效的数据库连接对象</param>
  1765. /// <param name="transaction">一个有效的连接事务</param>
  1766. /// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
  1767. /// <param name="commandText">存储过程名称或SQL语句</param>
  1768. /// <param name="dataSet">要填充结果集的DataSet实例</param>
  1769. /// <param name="tableNames">表映射的数据表数组
  1770. /// 用户定义的表名 (可有是实际的表名.)
  1771. /// </param>
  1772. /// <param name="commandParameters">分配给命令的SqlParamter参数数组</param>
  1773. private static void FillDataset(string interfaceId, DbConnection connection, DbTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params DbParameter[] commandParameters)
  1774. {
  1775. if (connection == null) throw new ArgumentNullException("connection");
  1776. if (dataSet == null) throw new ArgumentNullException("dataSet");
  1777. // 创建DbCommand命令,并进行预处理
  1778. DbCommand command = Factory(interfaceId).CreateCommand();
  1779. bool mustCloseConnection = false;
  1780. PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);
  1781. // 执行命令
  1782. using (DbDataAdapter dataAdapter = Factory(interfaceId).CreateDataAdapter())
  1783. {
  1784. dataAdapter.SelectCommand = command;
  1785. // 追加表映射
  1786. if (tableNames != null && tableNames.Length > 0)
  1787. {
  1788. string tableName = "Table";
  1789. for (int index = 0; index < tableNames.Length; index++)
  1790. {
  1791. if (tableNames[index] == null || tableNames[index].Length == 0) throw new ArgumentException("The tableNames parameter must contain a list of tables, a value was provided as null or empty string.", "tableNames");
  1792. dataAdapter.TableMappings.Add(tableName, tableNames[index]);
  1793. tableName += (index + 1).ToString();
  1794. }
  1795. }
  1796. // 填充数据集使用默认表名称
  1797. dataAdapter.Fill(dataSet);
  1798. // 清除参数,以便再次使用.
  1799. command.Parameters.Clear();
  1800. }
  1801. if (mustCloseConnection)
  1802. connection.Close();
  1803. }
  1804. #endregion
  1805. #region 检索指定的存储过程的参数集
  1806. /// <summary>
  1807. /// 返回指定的存储过程的参数集
  1808. /// </summary>
  1809. /// <remarks>
  1810. /// 这个方法将查询数据库,并将信息存储到缓存.
  1811. /// </remarks>
  1812. /// <param name="ConnectionString">一个有效的数据库连接字符</param>
  1813. /// <param name="spName">存储过程名</param>
  1814. /// <returns>返回DbParameter参数数组</returns>
  1815. public static DbParameter[] GetSpParameterSet(string interfaceId, string spName)
  1816. {
  1817. return GetSpParameterSet(interfaceId, spName, false);
  1818. }
  1819. /// <summary>
  1820. /// 返回指定的存储过程的参数集
  1821. /// </summary>
  1822. /// <remarks>
  1823. /// 这个方法将查询数据库,并将信息存储到缓存.
  1824. /// </remarks>
  1825. /// <param name="ConnectionString">一个有效的数据库连接字符.</param>
  1826. /// <param name="spName">存储过程名</param>
  1827. /// <param name="includeReturnValueParameter">是否包含返回值参数</param>
  1828. /// <returns>返回DbParameter参数数组</returns>
  1829. public static DbParameter[] GetSpParameterSet(string interfaceId, string spName, bool includeReturnValueParameter)
  1830. {
  1831. if (ConnectionString(interfaceId) == null || ConnectionString(interfaceId).Length == 0) throw new ArgumentNullException("ConnectionString");
  1832. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1833. using (DbConnection connection = Factory(interfaceId).CreateConnection())
  1834. {
  1835. connection.ConnectionString = ConnectionString(interfaceId);
  1836. return GetSpParameterSetInternal(interfaceId, connection, spName, includeReturnValueParameter);
  1837. }
  1838. }
  1839. /// <summary>
  1840. /// [内部]返回指定的存储过程的参数集(使用连接对象).
  1841. /// </summary>
  1842. /// <remarks>
  1843. /// 这个方法将查询数据库,并将信息存储到缓存.
  1844. /// </remarks>
  1845. /// <param name="connection">一个有效的数据库连接字符</param>
  1846. /// <param name="spName">存储过程名</param>
  1847. /// <returns>返回DbParameter参数数组</returns>
  1848. internal static DbParameter[] GetSpParameterSet(string interfaceId, DbConnection connection, string spName)
  1849. {
  1850. return GetSpParameterSet(interfaceId, connection, spName, false);
  1851. }
  1852. /// <summary>
  1853. /// [内部]返回指定的存储过程的参数集(使用连接对象)
  1854. /// </summary>
  1855. /// <remarks>
  1856. /// 这个方法将查询数据库,并将信息存储到缓存.
  1857. /// </remarks>
  1858. /// <param name="connection">一个有效的数据库连接对象</param>
  1859. /// <param name="spName">存储过程名</param>
  1860. /// <param name="includeReturnValueParameter">
  1861. /// 是否包含返回值参数
  1862. /// </param>
  1863. /// <returns>返回DbParameter参数数组</returns>
  1864. internal static DbParameter[] GetSpParameterSet(string interfaceId, DbConnection connection, string spName, bool includeReturnValueParameter)
  1865. {
  1866. if (connection == null) throw new ArgumentNullException("connection");
  1867. using (DbConnection clonedConnection = (DbConnection)((ICloneable)connection).Clone())
  1868. {
  1869. return GetSpParameterSetInternal(interfaceId, clonedConnection, spName, includeReturnValueParameter);
  1870. }
  1871. }
  1872. /// <summary>
  1873. /// [私有]返回指定的存储过程的参数集(使用连接对象)
  1874. /// </summary>
  1875. /// <param name="connection">一个有效的数据库连接对象</param>
  1876. /// <param name="spName">存储过程名</param>
  1877. /// <param name="includeReturnValueParameter">是否包含返回值参数</param>
  1878. /// <returns>返回DbParameter参数数组</returns>
  1879. private static DbParameter[] GetSpParameterSetInternal(string interfaceId, DbConnection connection, string spName, bool includeReturnValueParameter)
  1880. {
  1881. if (connection == null) throw new ArgumentNullException("connection");
  1882. if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName");
  1883. string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : "");
  1884. DbParameter[] cachedParameters;
  1885. cachedParameters = m_paramcache[hashKey] as DbParameter[];
  1886. if (cachedParameters == null)
  1887. {
  1888. DbParameter[] spParameters = DiscoverSpParameterSet(interfaceId, connection, spName, includeReturnValueParameter);
  1889. m_paramcache[hashKey] = spParameters;
  1890. cachedParameters = spParameters;
  1891. }
  1892. return CloneParameters(cachedParameters);
  1893. }
  1894. #endregion 参数集检索结束
  1895. #region 生成参数
  1896. public static DbParameter MakeInParam(string interfaceId, string ParamName, DbType DbType, int Size, object Value)
  1897. {
  1898. return MakeParam(interfaceId, ParamName, DbType, Size, ParameterDirection.Input, Value);
  1899. }
  1900. public static DbParameter MakeOutParam(string interfaceId, string ParamName, DbType DbType, int Size)
  1901. {
  1902. return MakeParam(interfaceId, ParamName, DbType, Size, ParameterDirection.Output, null);
  1903. }
  1904. public static DbParameter MakeParam(string interfaceId, string ParamName, DbType DbType, Int32 Size, ParameterDirection Direction, object Value)
  1905. {
  1906. DbParameter param;
  1907. param = Provider(interfaceId).MakeParam(ParamName, DbType, Size);
  1908. param.Direction = Direction;
  1909. if (!(Direction == ParameterDirection.Output && Value == null))
  1910. param.Value = Value;
  1911. return param;
  1912. }
  1913. public static DbParameter MakeParamByColumn(string interfaceId, string ParamName, DbType DbType, Int32 Size, string ColumnName)
  1914. {
  1915. DbParameter param;
  1916. param = Provider(interfaceId).MakeParam(ParamName, DbType, Size);
  1917. param.Direction = ParameterDirection.Input;
  1918. param.SourceColumn = ColumnName;
  1919. return param;
  1920. }
  1921. #endregion 生成参数结束
  1922. #region 执行ExecuteScalar,将结果以字符串类型输出。
  1923. public static string ExecuteScalarToStr(string interfaceId, CommandType commandType, string commandText)
  1924. {
  1925. object ec = ExecuteScalar(interfaceId, commandType, commandText);
  1926. if (ec == null)
  1927. {
  1928. return "";
  1929. }
  1930. return ec.ToString();
  1931. }
  1932. public static string ExecuteScalarToStr(string interfaceId, CommandType commandType, string commandText, params DbParameter[] commandParameters)
  1933. {
  1934. object ec = ExecuteScalar(interfaceId, commandType, commandText, commandParameters);
  1935. if (ec == null)
  1936. {
  1937. return "";
  1938. }
  1939. return ec.ToString();
  1940. }
  1941. #endregion
  1942. }
  1943. }