SqlDbHelper.cs 105 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Configuration;
  6. using System.Data.SqlClient;
  7. using System.Reflection;
  8. using System.Data;
  9. using System.Collections;
  10. using System.Web;
  11. using System.Web.Caching;
  12. public class SqlDbHelper
  13. {
  14. public static string constr = ConfigurationManager.AppSettings["MESProduction"].ToString();
  15. #region 验证数据库是否连接
  16. /// <summary>
  17. /// 测试数据库是否可以正常连接,time如果默认就不填写 如果填写则加timeout连接字符串
  18. /// </summary>
  19. /// <returns></returns>
  20. public static bool ChechSqlServer(int timeout)
  21. {
  22. string connnectstring = "";
  23. if (timeout != 0)
  24. {
  25. connnectstring = constr + ";Connect Timeout=" + timeout;
  26. }
  27. else { connnectstring = constr; }
  28. //constr里不要加;Connect Timeout=5000参数如果加参数此处需要修改
  29. bool succeed = false;
  30. try
  31. {
  32. SqlConnection p_connectionString = new SqlConnection(connnectstring);
  33. p_connectionString.Open();
  34. SqlCommand p_selectCommand = new SqlCommand("SELECT 1", p_connectionString);
  35. SqlDataReader reader = p_selectCommand.ExecuteReader();
  36. if (reader.HasRows)
  37. succeed = true;
  38. reader.Dispose();
  39. reader.Close();
  40. p_connectionString.Close();
  41. }
  42. catch
  43. { }
  44. return succeed;
  45. }
  46. #endregion
  47. #region 根据实体类名获取表名
  48. /// <summary>
  49. /// 根据实体类名返回数据库表名和其字段
  50. /// </summary>
  51. /// <typeparam name="T">实体类</typeparam>
  52. /// <param name="t">实体对象</param>
  53. /// <returns>数据表名和字段</returns>
  54. public static Dictionary<string, PropertyInfo[]> GetTableName<T>(T t)
  55. {
  56. if (t == null)
  57. {
  58. return null;
  59. }
  60. PropertyInfo[] propertys = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
  61. if (propertys.Length <= 0)
  62. {
  63. return null;
  64. }
  65. Dictionary<string, PropertyInfo[]> dic = new Dictionary<string, PropertyInfo[]>();
  66. string fname = t.ToString();
  67. string cname = typeof(T).Name;
  68. dic[cname] = propertys;
  69. return dic;
  70. }
  71. #endregion
  72. #region 增加一个记录
  73. /// <summary>
  74. /// 添加一条数据到数据库,排除主键在SQL中出现
  75. /// </summary>
  76. /// <typeparam name="T">数据实体类</typeparam>
  77. /// <param name="t">数据实体对象</param>
  78. /// <param name="constr">数据连接字符串</param>
  79. /// <returns>是否写入成功</returns>
  80. public static bool InsertModel<T>(T t, string constr)
  81. {
  82. SqlConnection conn = new SqlConnection(constr);
  83. string sql = string.Empty; SqlParameter[] sp = null;
  84. InsertSqlParams<T>(t, out sql, out sp);
  85. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  86. }
  87. /// <summary>
  88. /// 添加一条数据到数据库,排除主键在SQL中出现
  89. /// </summary>
  90. /// <typeparam name="T">数据实体类</typeparam>
  91. /// <param name="t">数据实体对象</param>
  92. /// <returns>是否写入成功</returns>
  93. public static bool InsertModel<T>(T t)
  94. {
  95. SqlConnection conn = new SqlConnection(constr);
  96. string sql = string.Empty; SqlParameter[] sp = null;
  97. InsertSqlParams<T>(t, out sql, out sp);
  98. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  99. }
  100. /// <summary>
  101. /// 添加一条数据到数据库,主键在SQL中出现
  102. /// </summary>
  103. /// <typeparam name="T">数据实体类</typeparam>
  104. /// <param name="t">数据实体对象</param>
  105. /// <param name="constr">数据连接字符串</param>
  106. /// <returns>是否写入成功</returns>
  107. public static bool InsertModelGuid<T>(T t)
  108. {
  109. SqlConnection conn = new SqlConnection(constr);
  110. string sql = string.Empty; SqlParameter[] sp = null;
  111. InsertSqlParamsNoParimary<T>(t, out sql, out sp, constr);
  112. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  113. }
  114. /// <summary>
  115. /// 添加一条数据到数据库,主键在SQL中出现
  116. /// </summary>
  117. /// <typeparam name="T">数据实体类</typeparam>
  118. /// <param name="t">数据实体对象</param>
  119. /// <param name="constr">数据连接字符串</param>
  120. /// <returns>是否写入成功</returns>
  121. public static bool InsertModelGuid<T>(T t, string constr)
  122. {
  123. SqlConnection conn = new SqlConnection(constr);
  124. string sql = string.Empty; SqlParameter[] sp = null;
  125. InsertSqlParamsNoParimary<T>(t, out sql, out sp, constr);
  126. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  127. }
  128. /// <summary>
  129. /// 添加一条数据到数据库,不进行数据表字段对比
  130. /// </summary>
  131. /// <typeparam name="T">数据实体类</typeparam>
  132. /// <param name="t">实体对象</param>
  133. /// <param name="constr">连接字符串</param>
  134. /// <returns>是否写入成功</returns>
  135. public static bool InsertModelnoEq<T>(T t, string constr)
  136. {
  137. SqlConnection conn = new SqlConnection(constr);
  138. string sql = string.Empty; SqlParameter[] sp = null;
  139. if (InsertSqlParamsnoEp<T>(t, out sql, out sp))
  140. {
  141. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  142. }
  143. return false;
  144. }
  145. /// <summary>
  146. /// 添加一条数据到数据库,并返回主标识id
  147. /// </summary>
  148. /// <typeparam name="T">数据实体类</typeparam>
  149. /// <param name="t">数据实体对象</param>
  150. /// <param name="id">数据成功插入后返回主标识id</param>
  151. /// <param name="constr">数据库连接字符串</param>
  152. /// <returns>数据插入是否成功</returns>
  153. public static bool InsertModel<T>(T t, out int id, string constr)
  154. {
  155. SqlConnection conn = new SqlConnection(constr);
  156. string sql = string.Empty; SqlParameter[] sp = null;
  157. InsertSqlParamsWithIdentity<T>(t, out sql, out sp);
  158. id = ExecuteNonQueryWithIdentity(conn, CommandType.Text, sql, sp);
  159. if (id > 0)
  160. {
  161. return true;
  162. }
  163. return false;
  164. }
  165. /// <summary>
  166. /// 插入一条数据并返回主键ID
  167. /// </summary>
  168. /// <typeparam name="T">数据实体</typeparam>
  169. /// <param name="t">实体参数</param>
  170. /// <param name="constr">数据库连接字符串</param>
  171. /// <returns>主键</returns>
  172. public static int InsertModelReturnIdentity<T>(T t, string constr)
  173. {
  174. SqlConnection conn = new SqlConnection(constr);
  175. string sql = string.Empty; SqlParameter[] sp = null;
  176. InsertSqlParamsWithIdentity<T>(t, out sql, out sp);
  177. return ExecuteNonQueryWithIdentity(conn, CommandType.Text, sql, sp);
  178. }
  179. public static bool InsertSqlParamsWithIdentity<T>(T t, out string sql, out SqlParameter[] paras)
  180. {
  181. sql = ""; paras = null;
  182. try
  183. {
  184. string cname = typeof(T).Name;
  185. //构造参数化SQL命令
  186. StringBuilder ExeSql = new StringBuilder();
  187. StringBuilder Params = new StringBuilder();
  188. ExeSql.Append("insert into " + cname + " (");
  189. //循环补充字段和参数
  190. List<SqlParameter> list = new List<SqlParameter>();
  191. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  192. if (dic == null || dic.Count == 0)
  193. {
  194. return false;
  195. }
  196. int counts = dic.Count;
  197. foreach (PropertyInfo pi in typeof(T).GetProperties())
  198. {
  199. CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower());
  200. if (item != null)
  201. {
  202. if (!item.IsPrimary)
  203. {
  204. object v = pi.GetValue(t, null);
  205. if (v != null)//只对赋值了的属性进行操作
  206. {
  207. ExeSql.Append(pi.Name + ",");
  208. Params.Append("@" + pi.Name + ",");
  209. list.Add(CP.cPa(item, v));
  210. }
  211. }
  212. }
  213. }
  214. SqlParameter sp = new SqlParameter("@" + ParameterDirection.ReturnValue.ToString(), SqlDbType.Int);
  215. sp.Direction = ParameterDirection.Output;
  216. list.Add(sp);
  217. sql = ExeSql.ToString().TrimEnd(',') + ") values (" + Params.ToString().TrimEnd(',') + ");select @" + ParameterDirection.ReturnValue.ToString() + "=SCOPE_IDENTITY()";
  218. paras = list.ToArray();
  219. return true;
  220. }
  221. catch { return false; }
  222. }
  223. /// <summary>
  224. /// 循环T类型属性,表主键不插入方法
  225. /// </summary>
  226. /// <typeparam name="T"></typeparam>
  227. /// <param name="t"></param>
  228. /// <param name="sql"></param>
  229. /// <param name="paras"></param>
  230. /// <returns></returns>
  231. public static bool InsertSqlParams<T>(T t, out string sql, out SqlParameter[] paras)
  232. {
  233. sql = ""; paras = null;
  234. try
  235. {
  236. StringBuilder ExeSql = new StringBuilder();
  237. StringBuilder Params = new StringBuilder();
  238. string cname = typeof(T).Name;
  239. ExeSql.Append("insert into " + cname + " (");
  240. //循环补充字段和参数
  241. List<SqlParameter> list = new List<SqlParameter>();
  242. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  243. if (dic == null || dic.Count == 0)
  244. {
  245. return false;
  246. }
  247. foreach (PropertyInfo pi in typeof(T).GetProperties())
  248. {
  249. CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower());
  250. if (item != null)
  251. {
  252. if (!item.IsPrimary)
  253. {
  254. object v = pi.GetValue(t, null);
  255. if (v != null)//只对赋值了的属性进行操作
  256. {
  257. ExeSql.Append(pi.Name + ",");
  258. Params.Append("@" + pi.Name + ",");
  259. list.Add(CP.cPa(item, v));
  260. }
  261. }
  262. }
  263. }
  264. sql = ExeSql.ToString().TrimEnd(',') + ") values (" + Params.ToString().TrimEnd(',') + ")";
  265. paras = list.ToArray();
  266. return true;
  267. }
  268. catch { return false; }
  269. }
  270. /// <summary>
  271. /// 循环T类型属性,表主键插入方法
  272. /// </summary>
  273. /// <typeparam name="T"></typeparam>
  274. /// <param name="t"></param>
  275. /// <param name="sql"></param>
  276. /// <param name="paras"></param>
  277. /// <returns></returns>
  278. public static bool InsertSqlParamsNoParimary<T>(T t, out string sql, out SqlParameter[] paras, string constr)
  279. {
  280. sql = ""; paras = null;
  281. try
  282. {
  283. StringBuilder ExeSql = new StringBuilder();
  284. StringBuilder Params = new StringBuilder();
  285. string cname = typeof(T).Name;
  286. ExeSql.Append("insert into " + cname + " (");
  287. //循环补充字段和参数
  288. List<SqlParameter> list = new List<SqlParameter>();
  289. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  290. if (dic == null || dic.Count == 0)
  291. {
  292. return false;
  293. }
  294. foreach (PropertyInfo pi in typeof(T).GetProperties())
  295. {
  296. CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower());
  297. if (item != null)
  298. {
  299. object v = pi.GetValue(t, null);
  300. if (v != null)//只对赋值了的属性进行操作
  301. {
  302. ExeSql.Append(pi.Name + ",");
  303. Params.Append("@" + pi.Name + ",");
  304. list.Add(CP.cPa(item, v));
  305. }
  306. }
  307. }
  308. sql = ExeSql.ToString().TrimEnd(',') + ") values (" + Params.ToString().TrimEnd(',') + ")";
  309. paras = list.ToArray();
  310. return true;
  311. }
  312. catch { return false; }
  313. }
  314. /// <summary>
  315. /// 构造添加执行语句
  316. /// </summary>
  317. /// <typeparam name="T"></typeparam>
  318. /// <param name="t"></param>
  319. /// <param name="sql"></param>
  320. /// <param name="paras"></param>
  321. /// <returns>是否异常</returns>
  322. public static bool InsertSqlParamsnoEp<T>(T t, out string sql, out SqlParameter[] paras)
  323. {
  324. sql = ""; paras = null;
  325. StringBuilder ExeSql = new StringBuilder();
  326. StringBuilder Params = new StringBuilder();
  327. try
  328. {
  329. string cname = typeof(T).Name;
  330. List<SqlParameter> list = new List<SqlParameter>();
  331. ExeSql.Append("insert into " + cname + " (");
  332. foreach (PropertyInfo item in typeof(T).GetProperties())
  333. {
  334. object o = item.GetValue(t, null);
  335. if (o != null)
  336. {
  337. if (item.Name.ToLower() != "id")
  338. {
  339. ExeSql.Append(item.Name + ",");
  340. Params.Append("@" + item.Name + ",");
  341. list.Add(createParam(item, o));
  342. }
  343. }
  344. }
  345. sql = ExeSql.ToString().TrimEnd(',') + ")values(" + Params.ToString().TrimEnd(',') + ")";
  346. paras = list.ToArray();
  347. return true;
  348. }
  349. catch
  350. {
  351. return false;
  352. }
  353. }
  354. /// <summary>
  355. /// 添加一条数据到数据库
  356. /// </summary>
  357. /// <param name="Fields">表字段</param>
  358. /// <param name="Table">表名</param>
  359. /// <param name="constr">数据连接字符串</param>
  360. /// <returns>是否成功完成操作</returns>
  361. public static bool InsertRecord(Dictionary<string, object> Fields, string Table, string constr)
  362. {
  363. SqlConnection connection = new SqlConnection(constr);
  364. StringBuilder builder = new StringBuilder("");
  365. Table = Table.Replace("'", "");
  366. builder.Append("insert into " + Table + " (");
  367. IEnumerator<KeyValuePair<string, object>> enumerator = Fields.GetEnumerator();
  368. StringBuilder builder2 = new StringBuilder();
  369. List<SqlParameter> pitems = new List<SqlParameter>();
  370. while (enumerator.MoveNext())
  371. {
  372. KeyValuePair<string, object> current = enumerator.Current;
  373. string key = current.Key;
  374. object obj = current.Value;
  375. //只处理已赋值的项
  376. if (!string.IsNullOrEmpty(key) && (obj != null))
  377. {
  378. builder.Append(key + ",");
  379. builder2.Append("@" + key + ",");
  380. pitems.Add(createParam(key, obj));
  381. }
  382. }
  383. string sql = builder.ToString().TrimEnd(',') + ") values (" + builder2.ToString().TrimEnd(',') + ")";
  384. if (ExecuteNonQuery(connection, CommandType.Text, sql, pitems.ToArray()) > 0)
  385. return true;
  386. return false;
  387. }
  388. /// <summary>
  389. /// 添加一条数据到数据库
  390. /// </summary>
  391. /// <param name="Fields">表字段</param>
  392. /// <param name="Table">表名</param>
  393. /// <param name="id">数据插入后返回主标识(自动增长字段值)</param>
  394. /// <param name="constr">数据连接字符串</param>
  395. /// <returns>是否成功完成操作</returns>
  396. public static bool InsertRecord(Dictionary<string, object> Fields, string Table, out int id, string constr)
  397. {
  398. id = 0;
  399. SqlConnection connection = new SqlConnection(constr);
  400. StringBuilder builder = new StringBuilder("");
  401. Table = Table.Replace("'", "");
  402. builder.Append("insert into " + Table + " (");
  403. IEnumerator<KeyValuePair<string, object>> enumerator = Fields.GetEnumerator();
  404. StringBuilder builder2 = new StringBuilder();
  405. List<SqlParameter> pitems = new List<SqlParameter>();
  406. while (enumerator.MoveNext())
  407. {
  408. KeyValuePair<string, object> current = enumerator.Current;
  409. string key = current.Key;
  410. object obj = current.Value;
  411. //只处理已赋值的项
  412. if (!string.IsNullOrEmpty(key) && (obj != null))
  413. {
  414. builder.Append(key + ",");
  415. builder2.Append("@" + key + ",");
  416. pitems.Add(createParam(key, obj));
  417. }
  418. }
  419. SqlParameter sp = new SqlParameter("@out_return_id", SqlDbType.Int);
  420. sp.Direction = ParameterDirection.Output;
  421. pitems.Add(sp);
  422. string sql = builder.ToString().TrimEnd(',') + ") values (" + builder2.ToString().TrimEnd(',') + ") select @out_return_id=SCOPE_IDENTITY()";
  423. if (ExecuteNonQueryOutID(connection, CommandType.Text, sql, pitems.ToArray()) > 0)
  424. return true;
  425. return false;
  426. }
  427. #endregion
  428. #region 更新一个记录
  429. /// <summary>
  430. /// 更新一个记录,按主键
  431. /// </summary>
  432. /// <typeparam name="T">数据实体类</typeparam>
  433. /// <param name="t">数据实体对象</param>
  434. /// <param name="constr">数据库连接字符串</param>
  435. /// <returns></returns>
  436. public static bool UpdateModel<T>(T t, string constr)
  437. {
  438. SqlConnection conn = new SqlConnection(constr);
  439. string sql = string.Empty; SqlParameter[] sp = null;
  440. UpdateSqlParams<T>(t, out sql, out sp);
  441. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  442. }
  443. /// <summary>
  444. /// 更新某条记录,按主键 更新多个字段
  445. /// </summary>
  446. /// <typeparam name="T">数据实体类</typeparam>
  447. /// <param name="p">字典参数</param>
  448. /// <param name="constr">数据库连接字符串</param>
  449. /// <returns></returns>
  450. public static bool UpdateModel<T>(Dictionary<string, object> p, string constr)
  451. {
  452. SqlConnection conn = new SqlConnection(constr);
  453. string sql = string.Empty; SqlParameter[] sp = null;
  454. UpdateSqlParams<T>(p, out sql, out sp);
  455. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  456. }
  457. /// <summary>
  458. /// 更新某条记录,按主键 更新多个字段
  459. /// </summary>
  460. /// <typeparam name="T">数据实体类</typeparam>
  461. /// <param name="t">实体对象</param>
  462. /// <param name="constr">数据库连接字符串</param>
  463. /// <returns></returns>
  464. public static bool UpdateModelnoEp<T>(T t, string constr)
  465. {
  466. SqlConnection conn = new SqlConnection(constr);
  467. string sql = string.Empty; SqlParameter[] sp = null;
  468. if (UpdateSqlParamsnoEp<T>(t, out sql, out sp))
  469. {
  470. return (ExecuteNonQuery(conn, CommandType.Text, sql, sp) > 0);
  471. }
  472. return false;
  473. }
  474. public static bool UpdateSqlParams<T>(T t, out string sql, out SqlParameter[] paras)
  475. {
  476. sql = ""; paras = null;
  477. PropertyInfo[] propertys = typeof(T).GetProperties();
  478. string cname = typeof(T).Name;
  479. //构造参数化SQL命令
  480. StringBuilder ExeSql = new StringBuilder();
  481. ExeSql.Append("update " + cname + " set ");
  482. //循环补充字段和参数
  483. List<SqlParameter> list = new List<SqlParameter>();
  484. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  485. if (dic == null || dic.Count == 0)
  486. {
  487. return false;
  488. }
  489. string primaryKey = string.Empty;
  490. foreach (PropertyInfo pi in propertys)
  491. {
  492. var propertyType = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType;//得到属性定义类型
  493. string t_p = propertyType.ToString().ToLower();//转化为小写
  494. t_p = t_p.Substring(t_p.IndexOf('.') + 1, t_p.Length - t_p.IndexOf('.') - 1);
  495. object v = pi.GetValue(t, null);
  496. if ((t_p == "string" || t_p == "char") && v == null)
  497. v = "";
  498. //object v = pi.GetValue(t, null);
  499. if (v != null)//只对赋值了的属性进行操作
  500. {
  501. CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower());
  502. if (item != null)
  503. {
  504. if (!item.IsPrimary)
  505. {
  506. ExeSql.Append(pi.Name + "=@" + pi.Name + ",");
  507. }
  508. else
  509. {
  510. primaryKey = pi.Name;
  511. }
  512. list.Add(CP.cPa(item, v));
  513. }
  514. }
  515. }
  516. sql = ExeSql.ToString().TrimEnd(',') + " where " + primaryKey + "=@" + primaryKey;
  517. paras = list.ToArray();
  518. return true;
  519. }
  520. public static bool UpdateSqlParams<T>(Dictionary<string, object> p, out string sql, out SqlParameter[] paras)
  521. {
  522. sql = ""; paras = null;
  523. try
  524. {
  525. PropertyInfo[] propertys = typeof(T).GetProperties();
  526. string cname = typeof(T).Name;
  527. StringBuilder ExeSql = new StringBuilder();
  528. //构造参数化SQL命令
  529. ExeSql.Append("update " + cname + " set ");
  530. //循环补充字段和参数
  531. List<SqlParameter> list = new List<SqlParameter>();
  532. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  533. if (dic == null || dic.Count == 0)
  534. {
  535. return false;
  536. }
  537. //集合枚举
  538. IEnumerator<KeyValuePair<string, object>> enumerator = p.GetEnumerator();
  539. string primaryKey = string.Empty;//主键参数
  540. foreach (PropertyInfo pi in propertys)
  541. {
  542. while (enumerator.MoveNext())
  543. {
  544. KeyValuePair<string, object> current = enumerator.Current;
  545. string key = current.Key;
  546. object obj = current.Value;
  547. if (!string.IsNullOrEmpty(key) && (obj != null))
  548. {
  549. CP.ColumnInfo item = dic.Find(c => c.ColName.ToLower() == key.ToLower());
  550. if (item != null)
  551. {
  552. if (item.IsPrimary)
  553. {
  554. primaryKey = pi.Name;
  555. }
  556. else
  557. {
  558. ExeSql.Append(key + "=@" + key + ",");
  559. }
  560. list.Add(CP.cPa(item, obj));
  561. }
  562. }
  563. }
  564. }
  565. sql = ExeSql.ToString().TrimEnd(',') + " where " + primaryKey + "=@" + primaryKey;
  566. paras = list.ToArray();
  567. return true;
  568. }
  569. catch { return false; }
  570. }
  571. public static bool UpdateSqlParamsnoEp<T>(T t, out string sql, out SqlParameter[] paras)
  572. {
  573. sql = ""; paras = null;
  574. try
  575. {
  576. string cname = typeof(T).Name;
  577. //构造参数化SQL命令
  578. StringBuilder ExeSql = new StringBuilder();
  579. ExeSql.Append("update " + cname + " set ");
  580. //循环补充字段和参数
  581. List<SqlParameter> list = new List<SqlParameter>();
  582. string primaryKey = string.Empty; //主键
  583. foreach (PropertyInfo item in typeof(T).GetProperties())
  584. {
  585. object v = item.GetValue(t, null);
  586. if (v != null)
  587. {
  588. if (item.Name.ToLower() != "id")
  589. {
  590. ExeSql.Append(item.Name + "=@" + item.Name + ",");
  591. }
  592. else
  593. {
  594. primaryKey = item.Name + "=@" + item.Name;
  595. }
  596. list.Add(createParam(item, v));
  597. }
  598. }
  599. sql = ExeSql.ToString().TrimEnd(',') + " where " + primaryKey;
  600. paras = list.ToArray();
  601. return true;
  602. }
  603. catch { return false; }
  604. }
  605. #endregion
  606. #region 得到一个记录
  607. /// <summary>
  608. /// 根据主键标识id获取一个记录
  609. /// </summary>
  610. /// <typeparam name="T">数据实体类</typeparam>
  611. /// <param name="id">主键标识id</param>
  612. /// <param name="constr">数据库连接字符串</param>
  613. /// <returns>一个数据实体所有信息</returns>
  614. public static T GetModel<T>(int id, string constr) where T : new()
  615. {
  616. // 获得此模型的类型
  617. T t = new T();
  618. string sql = string.Empty; SqlParameter[] sp = null; PropertyInfo[] propertys = null;
  619. GetSqlParams<T>(id, out sql, out sp, out propertys);
  620. DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp);
  621. if (ds.Tables.Count == 0)
  622. {
  623. return default(T);
  624. }
  625. DataTable dt = ds.Tables[0];
  626. if (dt.Rows.Count <= 0)
  627. {
  628. return default(T);
  629. }
  630. string tempName = "";
  631. foreach (DataRow dr in dt.Rows)
  632. {
  633. // 获得此模型的公共属性
  634. foreach (PropertyInfo pi in propertys)
  635. {
  636. tempName = pi.Name;
  637. // 检查DataTable是否包含此列
  638. if (dt.Columns.Contains(tempName))
  639. {
  640. // 判断此属性是否有Setter
  641. if (!pi.CanWrite) continue;
  642. object value = dr[tempName];
  643. if (value != DBNull.Value && value != null)
  644. pi.SetValue(t, value, null);
  645. }
  646. }
  647. }
  648. return t;
  649. }
  650. public static bool GetSqlParams<T>(int id, out string sql, out SqlParameter[] paras, out PropertyInfo[] py)
  651. {
  652. sql = ""; paras = null;
  653. //获取数据实体信息
  654. string cname = typeof(T).Name;
  655. py = typeof(T).GetProperties();
  656. List<SqlParameter> list = new List<SqlParameter>();
  657. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  658. string searchCols = string.Empty;
  659. string primaryKey = string.Empty;
  660. foreach (PropertyInfo pi in py)
  661. {
  662. CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower());
  663. if (item != null)
  664. {
  665. if (item.IsPrimary)
  666. {
  667. primaryKey = item.ColName;
  668. list.Add(CP.cPa(item, id));
  669. }
  670. searchCols += pi.Name + ",";
  671. }
  672. }
  673. searchCols = searchCols.TrimEnd(',');
  674. sql = "select " + searchCols + " from " + cname + " where " + primaryKey + "=@" + primaryKey;
  675. paras = list.ToArray();
  676. return true;
  677. }
  678. public static bool GetSqlParams<T>(int id, out string sql, out SqlParameter[] paras)
  679. {
  680. sql = ""; paras = null;
  681. // 获得此模型的类型
  682. string cname = typeof(T).Name;
  683. //获取数据实体信息
  684. List<SqlParameter> list = new List<SqlParameter>();
  685. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  686. if (dic == null || dic.Count == 0) { return false; }
  687. string searchCols = string.Empty;
  688. string primaryKey = string.Empty;
  689. foreach (PropertyInfo pi in typeof(T).GetProperties())
  690. {
  691. CP.ColumnInfo item = dic.Find(p => p.ColName.ToLower() == pi.Name.ToLower());
  692. if (item != null)
  693. {
  694. if (item.IsPrimary)
  695. {
  696. primaryKey = item.ColName;
  697. list.Add(CP.cPa(item, id));
  698. }
  699. searchCols += pi.Name + ",";
  700. }
  701. }
  702. searchCols = searchCols.TrimEnd(',');
  703. sql = "select " + searchCols + " from " + cname + " where " + primaryKey + "=@" + primaryKey;
  704. paras = list.ToArray();
  705. return true;
  706. }
  707. /// <summary>
  708. /// 根据一个或多个实体赋值字段做为查询条件得到一个新的实体
  709. /// </summary>
  710. /// <typeparam name="T">数据实体类</typeparam>
  711. /// <param name="t">数据实体对象</param>
  712. /// <param name="constr">数据库连接字符串</param>
  713. /// <returns>一个数据实体所有信息</returns>
  714. public static T GetModel<T>(IDictionary<string, object> p, string constr) where T : new()
  715. {
  716. string sql = ""; SqlParameter[] sp = null; PropertyInfo[] propertys = null;
  717. T t = new T();
  718. GetSqlParams<T>(p, out sql, out sp, out propertys);
  719. DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp);
  720. if (ds.Tables.Count == 0)
  721. {
  722. return default(T);
  723. }
  724. DataTable dt = ds.Tables[0];
  725. if (dt.Rows.Count <= 0)
  726. {
  727. return default(T);
  728. }
  729. string tempName = "";
  730. foreach (DataRow dr in dt.Rows)
  731. {
  732. // 获得此模型的公共属性
  733. foreach (PropertyInfo pi in propertys)
  734. {
  735. tempName = pi.Name;
  736. // 检查DataTable是否包含此列
  737. if (dt.Columns.Contains(tempName))
  738. {
  739. // 判断此属性是否有Setter
  740. if (!pi.CanWrite) continue;
  741. object value = dr[tempName];
  742. if (value != DBNull.Value && value != null)
  743. pi.SetValue(t, value, null);
  744. }
  745. }
  746. }
  747. return t;
  748. }
  749. public static bool GetSqlParams<T>(IDictionary<string, object> p, out string sql, out SqlParameter[] paras)
  750. {
  751. sql = ""; paras = null;
  752. string cname = typeof(T).Name;
  753. //获取数据实体信息
  754. List<SqlParameter> list = new List<SqlParameter>();
  755. List<CP.ColumnInfo> dic = null;
  756. //判断T是否为视图
  757. dic = cname.StartsWith("V") ? CP.TCV(cname, constr) : CP.TC(cname, constr);
  758. string searchCols = string.Empty;
  759. string primaryKey = string.Empty;
  760. string temp = "";
  761. bool Isfirst = true;
  762. foreach (PropertyInfo pi in typeof(T).GetProperties())
  763. {
  764. CP.ColumnInfo item = dic.Find(c => c.ColName.ToLower() == pi.Name.ToLower());
  765. if (item != null)
  766. {
  767. searchCols += pi.Name + ",";
  768. }
  769. }
  770. //检查查询字典,如果为空,直接返回
  771. if (p != null && p.Count != 0)
  772. {
  773. IEnumerator<KeyValuePair<string, object>> enumera = p.GetEnumerator();
  774. while (enumera.MoveNext())
  775. {
  776. KeyValuePair<string, object> current = enumera.Current;
  777. string key = current.Key;
  778. object v = current.Value;
  779. if (!string.IsNullOrEmpty(key) && (v != null))
  780. {
  781. CP.ColumnInfo item = dic.Find(m => m.ColName.ToLower() == key.ToLower());
  782. if (item != null)
  783. {
  784. list.Add(CP.cPa(item, v));
  785. if (Isfirst)
  786. {
  787. temp += item.ColName + "=@" + item.ColName;
  788. Isfirst = false;
  789. }
  790. else
  791. {
  792. temp += " and " + item.ColName + "=@" + item.ColName;
  793. }
  794. }
  795. }
  796. }
  797. }
  798. else
  799. {
  800. temp = "1=1";
  801. }
  802. searchCols = searchCols.TrimEnd(',');
  803. sql = "select " + searchCols + " from " + cname + " where " + temp;
  804. paras = list.ToArray();
  805. return true;
  806. }
  807. public static bool GetSqlParams<T>(IDictionary<string, object> p, out string sql, out SqlParameter[] paras, out PropertyInfo[] py)
  808. {
  809. sql = ""; paras = null;
  810. py = typeof(T).GetProperties();
  811. string cname = typeof(T).Name;
  812. //获取数据实体信息
  813. List<SqlParameter> list = new List<SqlParameter>();
  814. List<CP.ColumnInfo> dic = CP.TC(cname, constr);
  815. string searchCols = string.Empty;
  816. string primaryKey = string.Empty;
  817. string temp = "";
  818. bool Isfirst = true;
  819. foreach (PropertyInfo pi in py)
  820. {
  821. CP.ColumnInfo item = dic.Find(c => c.ColName.ToLower() == pi.Name.ToLower());
  822. if (item != null)
  823. {
  824. searchCols += pi.Name + ",";
  825. }
  826. }
  827. //检查查询字典,如果为空,直接返回
  828. if (p == null || p.Count == 0) { return false; }
  829. IEnumerator<KeyValuePair<string, object>> enumera = p.GetEnumerator();
  830. while (enumera.MoveNext())
  831. {
  832. KeyValuePair<string, object> current = enumera.Current;
  833. string key = current.Key;
  834. object v = current.Value;
  835. if (!string.IsNullOrEmpty(key) && (v != null))
  836. {
  837. CP.ColumnInfo item = dic.Find(m => m.ColName.ToLower() == key.ToLower());
  838. if (item != null)
  839. {
  840. list.Add(CP.cPa(item, v));
  841. if (Isfirst)
  842. {
  843. temp += item.ColName + "=@" + item.ColName;
  844. Isfirst = false;
  845. }
  846. else
  847. {
  848. temp += " and " + item.ColName + "=@" + item.ColName;
  849. }
  850. }
  851. }
  852. }
  853. searchCols = searchCols.TrimEnd(',');
  854. sql = "select " + searchCols + " from " + cname + " where " + temp;
  855. paras = list.ToArray();
  856. return true;
  857. }
  858. #endregion
  859. #region 删除一个记录
  860. /// <summary>
  861. /// 删除一个记录
  862. /// </summary>
  863. /// <param name="id">标示ID</param>
  864. /// <param name="tableName">数据表名</param>
  865. /// <returns>成功失败</returns>
  866. public static bool DelSingle(string sql, string constr)
  867. {
  868. using (SqlConnection conn = new SqlConnection(constr))
  869. {
  870. SqlCommand cmd = new SqlCommand();
  871. PrepareCommand(cmd, conn, null, CommandType.Text, sql, null);
  872. int count = 0;
  873. try
  874. {
  875. count = cmd.ExecuteNonQuery();
  876. }
  877. catch (Exception e)
  878. {
  879. throw e;
  880. }
  881. finally
  882. {
  883. CloseConnection(conn);
  884. }
  885. if (count > 0)
  886. return true;
  887. return false;
  888. }
  889. }
  890. /// <summary>
  891. /// 从数据库表中删除一个记录,按主键标识id
  892. /// </summary>
  893. /// <typeparam name="T">数据实体类</typeparam>
  894. /// <param name="t">数据实体对象</param>
  895. /// <param name="constr">数据连接字符串</param>
  896. /// <returns>是否删除成功</returns>
  897. public static bool DeleteModel<T>(T t, string constr)
  898. {
  899. if (t == null)
  900. {
  901. return false;
  902. }
  903. // 获得此模型的公共属性
  904. PropertyInfo[] propertys = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
  905. if (propertys.Length <= 0)
  906. {
  907. return false;
  908. }
  909. string fname = t.ToString();
  910. string cname = fname.Substring(fname.LastIndexOf(".") + 1, fname.Length - fname.LastIndexOf(".") - 1);
  911. bool result = false;
  912. foreach (PropertyInfo pi in propertys)
  913. {
  914. object v = pi.GetValue(t, null);
  915. if (v != null)//只对赋值了的属性进行操作,
  916. {
  917. if (pi.Name.ToString().ToLower() == "id")
  918. {
  919. SqlParameter[] pitems = { new SqlParameter("@" + pi.Name, SqlDbType.Int) };
  920. pitems[0].Value = int.Parse(v.ToString());
  921. string sql = "delete from " + cname + " where id=@" + pi.Name + "";
  922. SqlConnection conn = new SqlConnection(constr);
  923. if (ExecuteNonQuery(conn, CommandType.Text, sql, pitems) > 0)
  924. {
  925. result = true;
  926. }
  927. break;
  928. }
  929. }
  930. }
  931. return result;
  932. }
  933. /// <summary>
  934. /// 根据主键ID删除一条记录,注:主键必须是ID,且存在
  935. /// </summary>
  936. /// <typeparam name="T">删除实体</typeparam>
  937. /// <param name="id">ID</param>
  938. /// <param name="constr">数据库连接</param>
  939. /// <returns>成功失败</returns>
  940. public static bool DeleteModel<T>(int id, string constr) where T : new()
  941. {
  942. if (id == 0)
  943. return false;
  944. string cname = typeof(T).Name;
  945. string sql = "delete from " + cname + " where id=@id";
  946. SqlParameter para = new SqlParameter("@id", id);
  947. SqlConnection conn = new SqlConnection(constr);
  948. if (ExecuteNonQuery(conn, CommandType.Text, sql, para) > 0)
  949. return true;
  950. return false;
  951. }
  952. /// <summary>
  953. /// 删除多条记录,按条件
  954. /// </summary>
  955. /// <typeparam name="T">要删除的实体类</typeparam>
  956. /// <param name="p">键值对</param>
  957. /// <param name="constr">数据库连接</param>
  958. /// <returns>成功失败</returns>
  959. public static bool DeleteModel<T>(IDictionary<string, object> p, string constr)
  960. {
  961. if (p == null || p.Count == 0)
  962. return false;
  963. string tablename = typeof(T).Name;
  964. StringBuilder ExeSql = new StringBuilder();
  965. ExeSql.Append("delete from " + tablename);
  966. IEnumerator<KeyValuePair<string, object>> enumerator = p.GetEnumerator();
  967. List<SqlParameter> list = new List<SqlParameter>();
  968. bool isFirst = true;
  969. while (enumerator.MoveNext())
  970. {
  971. KeyValuePair<string, object> current = enumerator.Current;
  972. string key = current.Key;
  973. object obj = current.Value;
  974. if (!string.IsNullOrEmpty(key) && (obj != null))
  975. {
  976. if (isFirst)
  977. {
  978. ExeSql.Append(" where " + key + "=@" + key);
  979. isFirst = false;
  980. }
  981. else
  982. {
  983. ExeSql.Append(" and " + key + "=@" + key);
  984. }
  985. list.Add(createParam(key, obj));
  986. }
  987. }
  988. SqlConnection conn = new SqlConnection(constr);
  989. try
  990. {
  991. if (ExecuteNonQuery(conn, CommandType.Text, ExeSql.ToString(), list.ToArray()) > 0)
  992. return true;
  993. return false;
  994. }
  995. catch { return false; }
  996. }
  997. #endregion
  998. #region 得到多个记录
  999. /// <summary>
  1000. /// 根据ID得到多个记录
  1001. /// </summary>
  1002. /// <typeparam name="T"></typeparam>
  1003. /// <param name="sql">SQL查询命令</param>
  1004. /// <param name="constr">数据库连接</param>
  1005. /// <param name="paras">可变参数</param>
  1006. /// <returns></returns>
  1007. public static List<T> GetMoreModel<T>(string sql, string constr, params SqlParameter[] paras) where T : new()
  1008. {
  1009. List<T> list = new List<T>();
  1010. DataSet ds = Query(sql, paras);
  1011. int count = ds.Tables[0].Rows.Count;
  1012. if (count == 0)
  1013. {
  1014. return null;
  1015. }
  1016. string tempName = "";
  1017. foreach (DataRow dr in ds.Tables[0].Rows)
  1018. {
  1019. T v = new T();
  1020. // 获得此模型的公共属性
  1021. foreach (PropertyInfo pi in typeof(T).GetProperties())
  1022. {
  1023. tempName = pi.Name;
  1024. // 检查DataTable是否包含此列
  1025. if (ds.Tables[0].Columns.Contains(tempName))
  1026. {
  1027. // 判断此属性是否有Setter
  1028. if (!pi.CanWrite) continue;
  1029. object value = dr[tempName];
  1030. if (value != DBNull.Value && value != null)
  1031. pi.SetValue(v, value, null);
  1032. }
  1033. }
  1034. list.Add(v);
  1035. }
  1036. return list;
  1037. }
  1038. /// <summary>
  1039. /// 根据键值对获取多个记录
  1040. /// </summary>
  1041. /// <typeparam name="T">类型</typeparam>
  1042. /// <param name="p">条件</param>
  1043. /// <param name="constr">数据库连接</param>
  1044. /// <param name="param">参数</param>
  1045. /// <returns></returns>
  1046. public static List<T> GetMoreModel<T>(Dictionary<string, object> p, string constr, params SqlParameter[] param) where T : new()
  1047. {
  1048. List<T> list = new List<T>();
  1049. string sql = string.Empty; SqlParameter[] sp = null;
  1050. GetSqlParams<T>(p, out sql, out sp);
  1051. DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp);
  1052. int count = ds.Tables[0].Rows.Count;
  1053. if (count == 0)
  1054. {
  1055. return null;
  1056. }
  1057. string tempName = "";
  1058. foreach (DataRow dr in ds.Tables[0].Rows)
  1059. {
  1060. T v = new T();
  1061. // 获得此模型的公共属性
  1062. foreach (PropertyInfo pi in typeof(T).GetProperties())
  1063. {
  1064. tempName = pi.Name;
  1065. // 检查DataTable是否包含此列
  1066. if (ds.Tables[0].Columns.Contains(tempName))
  1067. {
  1068. // 判断此属性是否有Setter
  1069. if (!pi.CanWrite) continue;
  1070. object value = dr[tempName];
  1071. if (value != DBNull.Value && value != null)
  1072. pi.SetValue(v, value, null);
  1073. }
  1074. }
  1075. list.Add(v);
  1076. }
  1077. return list;
  1078. }
  1079. /// <summary>
  1080. /// 根据键值对获取多个记录
  1081. /// </summary>
  1082. /// <typeparam name="T">类型</typeparam>
  1083. /// <param name="p">条件</param>
  1084. /// <param name="sort">条件排序 id desc</param>
  1085. /// <param name="constr">数据库连接</param>
  1086. /// <param name="param">参数</param>
  1087. /// <returns></returns>
  1088. //public static List<T> GetMoreModel<T>(Dictionary<string, object> p,string sort, string constr, params SqlParameter[] param) where T : new()
  1089. //{
  1090. // List<T> list = new List<T>();
  1091. // string sql = string.Empty; SqlParameter[] sp = null;
  1092. // GetSqlParams<T>(p, out sql, out sp);
  1093. // if (!string.IsNullOrEmpty(sort)) { sql += " order by "+sort; }
  1094. // DataSet ds = ExecuteDataset(constr, CommandType.Text, sql, sp);
  1095. // int count = ds.Tables[0].Rows.Count;
  1096. // if (count == 0)
  1097. // {
  1098. // return null;
  1099. // }
  1100. // string tempName = "";
  1101. // foreach (DataRow dr in ds.Tables[0].Rows)
  1102. // {
  1103. // T v = new T();
  1104. // // 获得此模型的公共属性
  1105. // foreach (PropertyInfo pi in typeof(T).GetProperties())
  1106. // {
  1107. // tempName = pi.Name;
  1108. // // 检查DataTable是否包含此列
  1109. // if (ds.Tables[0].Columns.Contains(tempName))
  1110. // {
  1111. // // 判断此属性是否有Setter
  1112. // if (!pi.CanWrite) continue;
  1113. // object value = dr[tempName];
  1114. // if (value != DBNull.Value && value != null)
  1115. // pi.SetValue(v, value, null);
  1116. // }
  1117. // }
  1118. // list.Add(v);
  1119. // }
  1120. // return list;
  1121. //}
  1122. #endregion
  1123. #region 根据SQL获取单值object
  1124. /// <summary>
  1125. /// 执行一条SQL语句,返回查询结果(object)。
  1126. /// </summary>
  1127. /// <param name="SQLString">SQL命令</param>
  1128. /// <param name="constr">数据库连接串</param>
  1129. /// <returns>查询结果(object)</returns>
  1130. public static object GetSingle(string SQLString, string constr)
  1131. {
  1132. using (SqlConnection connection = new SqlConnection(constr))
  1133. {
  1134. SqlCommand cmd = new SqlCommand();
  1135. PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, null);
  1136. try
  1137. {
  1138. object obj = cmd.ExecuteScalar();
  1139. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  1140. {
  1141. return null;
  1142. }
  1143. else
  1144. {
  1145. return obj;
  1146. }
  1147. }
  1148. catch (Exception e)
  1149. {
  1150. throw e;
  1151. }
  1152. finally
  1153. {
  1154. CloseConnection(connection);
  1155. }
  1156. }
  1157. }
  1158. /// <summary>
  1159. /// 执行一条计算查询结果语句,返回查询结果(object)。
  1160. /// </summary>
  1161. /// <param name="SQLString">计算查询结果语句</param>
  1162. /// <returns>查询结果(object)</returns>
  1163. public static object GetSingle(string SQLString, params SqlParameter[] cmdParms)
  1164. {
  1165. using (SqlConnection connection = new SqlConnection(constr))
  1166. {
  1167. using (SqlCommand cmd = new SqlCommand())
  1168. {
  1169. try
  1170. {
  1171. PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, cmdParms);
  1172. object obj = cmd.ExecuteScalar();
  1173. cmd.Parameters.Clear();
  1174. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  1175. {
  1176. return null;
  1177. }
  1178. else
  1179. {
  1180. return obj;
  1181. }
  1182. }
  1183. catch (System.Data.SqlClient.SqlException e)
  1184. {
  1185. throw e;
  1186. }
  1187. finally
  1188. {
  1189. CloseConnection(connection);
  1190. }
  1191. }
  1192. }
  1193. }
  1194. /// <summary>
  1195. /// 执行一条计算查询结果语句,返回查询结果(object)。
  1196. /// </summary>
  1197. /// <param name="connection">SqlConnection对象</param>
  1198. /// <param name="trans">SqlTransaction事务</param>
  1199. /// <param name="SQLString">计算查询结果语句</param>
  1200. /// <returns>查询结果(object)</returns>
  1201. public static object GetSingle(SqlConnection connection, SqlTransaction trans, string SQLString, params SqlParameter[] cmdParms)
  1202. {
  1203. using (SqlCommand cmd = new SqlCommand())
  1204. {
  1205. try
  1206. {
  1207. PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, cmdParms);
  1208. object obj = cmd.ExecuteScalar();
  1209. cmd.Parameters.Clear();
  1210. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  1211. {
  1212. return null;
  1213. }
  1214. else
  1215. {
  1216. return obj;
  1217. }
  1218. }
  1219. catch (System.Data.SqlClient.SqlException e)
  1220. {
  1221. trans.Rollback();
  1222. throw e;
  1223. }
  1224. finally
  1225. {
  1226. CloseConnection(connection);
  1227. }
  1228. }
  1229. }
  1230. /// <summary>
  1231. /// 是否存在该记录
  1232. /// </summary>
  1233. /// <param name="strSql">语句</param>
  1234. /// <param name="cmdParms">参数</param>
  1235. /// <returns>结果</returns>
  1236. public static bool Exists(string strSql, params SqlParameter[] cmdParms)
  1237. {
  1238. object obj = GetSingle(strSql, cmdParms);
  1239. int cmdresult;
  1240. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  1241. {
  1242. cmdresult = 0;
  1243. }
  1244. else
  1245. {
  1246. cmdresult = int.Parse(obj.ToString());
  1247. }
  1248. if (cmdresult == 0)
  1249. {
  1250. return false;
  1251. }
  1252. else
  1253. {
  1254. return true;
  1255. }
  1256. }
  1257. #endregion
  1258. #region 根据SQL语句执行SQL指令 返回int
  1259. /// <summary>
  1260. /// 执行单纯的SQL语句
  1261. /// </summary>
  1262. /// <param name="SQLString">SQL语句</param>
  1263. /// <param name="constr">数据库连接</param>
  1264. /// <returns>结果(int)</returns>
  1265. public static int ExecuteCmd(string SQLString, string constr)
  1266. {
  1267. int result = 0;
  1268. using (SqlConnection conn = new SqlConnection(constr))
  1269. {
  1270. try
  1271. {
  1272. SqlCommand cmd = new SqlCommand();
  1273. PrepareCommand(cmd, conn, null, CommandType.Text, SQLString, null);
  1274. result = cmd.ExecuteNonQuery();
  1275. }
  1276. catch (Exception e)
  1277. {
  1278. throw e;
  1279. }
  1280. finally
  1281. {
  1282. CloseConnection(conn);
  1283. }
  1284. return result;
  1285. }
  1286. }
  1287. /// <summary>
  1288. /// 执行SQL指令带参数
  1289. /// </summary>
  1290. /// <param name="SQLString">SQL语句</param>
  1291. /// <param name="constr">数据库连接字符串</param>
  1292. /// <param name="para">参数</param>
  1293. /// <returns>结果(int)</returns>
  1294. public static int ExecuteCmd(string SQLString, string constr, params SqlParameter[] para)
  1295. {
  1296. int result = 0;
  1297. using (SqlConnection conn = new SqlConnection(constr))
  1298. {
  1299. SqlCommand cmd = new SqlCommand();
  1300. try
  1301. {
  1302. PrepareCommand(cmd, conn, null, CommandType.Text, SQLString, para);
  1303. result = cmd.ExecuteNonQuery();
  1304. cmd.Parameters.Clear();
  1305. }
  1306. catch (Exception e)
  1307. {
  1308. throw e;
  1309. }
  1310. finally
  1311. {
  1312. CloseConnection(conn);
  1313. }
  1314. return result;
  1315. }
  1316. }
  1317. #endregion
  1318. #region 执行Sql命令
  1319. /// <summary>
  1320. /// 执行Cmd
  1321. /// </summary>
  1322. /// <param name="connection">连接对象</param>
  1323. /// <param name="commandType">类型</param>
  1324. /// <param name="commandText">内容</param>
  1325. /// <param name="commandParameters">参数</param>
  1326. /// <returns>结果</returns>
  1327. public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
  1328. {
  1329. SqlCommand cmd = new SqlCommand();
  1330. PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);
  1331. int retval = 0;
  1332. try
  1333. {
  1334. retval = cmd.ExecuteNonQuery();
  1335. cmd.Parameters.Clear();
  1336. }
  1337. catch (Exception ee)
  1338. {
  1339. throw ee;
  1340. }
  1341. finally
  1342. {
  1343. CloseConnection(connection);
  1344. }
  1345. return retval;
  1346. }
  1347. /// <summary>
  1348. /// 执行cmd命令返回主键 ID
  1349. /// </summary>
  1350. /// <param name="connection"></param>
  1351. /// <param name="commandType"></param>
  1352. /// <param name="commandText"></param>
  1353. /// <param name="commandParameters"></param>
  1354. /// <returns></returns>
  1355. public static int ExecuteNonQueryWithIdentity(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
  1356. {
  1357. SqlCommand cmd = new SqlCommand();
  1358. PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);
  1359. int retval = 0;
  1360. try
  1361. {
  1362. cmd.ExecuteNonQuery();
  1363. retval = int.Parse(cmd.Parameters["@" + ParameterDirection.ReturnValue.ToString()].Value.ToString());
  1364. cmd.Parameters.Clear();
  1365. }
  1366. catch (Exception e)
  1367. {
  1368. throw e;
  1369. }
  1370. finally
  1371. {
  1372. CloseConnection(connection);
  1373. }
  1374. return retval;
  1375. }
  1376. /// <summary>
  1377. /// Execute a SqlCommand (that returns no resultset) against the specified SqlConnection
  1378. /// using the provided parameters.
  1379. /// </summary>
  1380. /// <remarks>
  1381. /// e.g.:
  1382. /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
  1383. /// </remarks>
  1384. /// <param name="connection">A valid SqlConnection</param>
  1385. /// <param name="commandType">The CommandType (stored procedure, text, etc.)</param>
  1386. /// <param name="commandText">The stored procedure name or T-SQL command</param>
  1387. /// <param name="commandParameters">An array of SqlParamters used to execute the command</param>
  1388. /// <returns>An int representing the number of rows affected by the command</returns>
  1389. public static int ExecuteNonQueryOutID(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
  1390. {
  1391. SqlCommand cmd = new SqlCommand();
  1392. PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);
  1393. int retval = 0;
  1394. try
  1395. {
  1396. cmd.ExecuteNonQuery();
  1397. retval = int.Parse(cmd.Parameters["@out_return_id"].Value.ToString());
  1398. cmd.Parameters.Clear();
  1399. }
  1400. catch (Exception e)
  1401. {
  1402. throw e;
  1403. }
  1404. finally
  1405. {
  1406. CloseConnection(connection);
  1407. }
  1408. return retval;
  1409. }
  1410. /// <summary>
  1411. /// 返回带返回参数的过程
  1412. /// </summary>
  1413. /// <param name="connection">数据库连接对象</param>
  1414. /// <param name="commandType">数据类型</param>
  1415. /// <param name="commandText">存储过程名或SQL语句</param>
  1416. /// <param name="commandParameters">参数</param>
  1417. /// <returns>参数</returns>
  1418. public static SqlParameter[] ExecuteNonQueryOutPara(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
  1419. {
  1420. SqlCommand cmd = new SqlCommand();
  1421. SqlParameter[] para = null;
  1422. PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);
  1423. try
  1424. {
  1425. cmd.ExecuteNonQuery();
  1426. if (commandParameters != null)
  1427. {
  1428. para = commandParameters;
  1429. for (int i = 0; i < commandParameters.Length; i++)
  1430. {
  1431. if (commandParameters[i].Direction == ParameterDirection.Output || commandParameters[i].Direction == ParameterDirection.ReturnValue)
  1432. {
  1433. para[i].ParameterName = commandParameters[i].ParameterName;
  1434. para[i].Value = commandParameters[i].Value;
  1435. }
  1436. }
  1437. }
  1438. cmd.Parameters.Clear();
  1439. }
  1440. catch (Exception e)
  1441. {
  1442. throw e;
  1443. }
  1444. finally
  1445. {
  1446. CloseConnection(connection);
  1447. }
  1448. return para;
  1449. }
  1450. /// <summary>
  1451. /// 事务处理,执行SQL语句,返回影响的记录数,只执行一个命令,不关闭连接,连接关闭在调用端执行
  1452. /// </summary>
  1453. /// <param name="connection">SqlConnection对象</param>
  1454. /// <param name="trans">SqlTransaction事件</param>
  1455. /// <param name="SQLString">SQL语句</param>
  1456. /// <returns>影响的记录数</returns>
  1457. public static int ExecuteSql(SqlConnection connection, SqlTransaction trans, string SQLString)
  1458. {
  1459. int rows = 0;
  1460. using (SqlCommand cmd = new SqlCommand())
  1461. {
  1462. PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, null);
  1463. try
  1464. {
  1465. rows = cmd.ExecuteNonQuery();
  1466. }
  1467. catch
  1468. {
  1469. trans.Rollback();
  1470. }
  1471. finally
  1472. {
  1473. CloseConnection(connection);
  1474. }
  1475. return rows;
  1476. }
  1477. }
  1478. /// <summary>
  1479. /// 事务处理,执行SQL语句,返回影响的记录数,连接关闭在调用端执行
  1480. /// </summary>
  1481. /// <param name="connection">SqlConnection对象</param>
  1482. /// <param name="trans">SqlTransaction事务</param>
  1483. /// <param name="commandType">Sql命令类型</param>
  1484. /// <param name="SQLString">Sql查询语句</param>
  1485. /// <param name="cmdParms">Sql命令参数数组</param>
  1486. /// <returns>影响的记录数</returns>
  1487. public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
  1488. {
  1489. if (transaction == null) throw new ArgumentNullException("transaction");
  1490. if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction");
  1491. // Create a command and prepare it for execution
  1492. SqlCommand cmd = new SqlCommand();
  1493. PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters);
  1494. // Finally, execute the command
  1495. int retval = 0;
  1496. try
  1497. {
  1498. retval = cmd.ExecuteNonQuery();
  1499. // Detach the SqlParameters from the command object, so they can be used again
  1500. cmd.Parameters.Clear();
  1501. }
  1502. catch (Exception e)
  1503. {
  1504. transaction.Rollback();
  1505. throw e;
  1506. }
  1507. finally
  1508. {
  1509. CloseConnection(transaction.Connection);
  1510. }
  1511. return retval;
  1512. }
  1513. /// <summary>
  1514. /// 执行多条SQL语句,实现数据库事务。
  1515. /// </summary>
  1516. /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
  1517. public static void ExecuteSqlTranWithIndentity(List<CommandInfo> SQLStringList, out int identity)
  1518. {
  1519. using (SqlConnection conn = new SqlConnection(constr))
  1520. {
  1521. conn.Open();
  1522. using (SqlTransaction trans = conn.BeginTransaction())
  1523. {
  1524. SqlCommand cmd = new SqlCommand();
  1525. try
  1526. {
  1527. identity = 0;
  1528. //循环
  1529. foreach (CommandInfo myDE in SQLStringList)
  1530. {
  1531. string cmdText = myDE.CommandText;
  1532. SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
  1533. foreach (SqlParameter q in cmdParms)
  1534. {
  1535. if (q.Direction == ParameterDirection.InputOutput)
  1536. {
  1537. q.Value = identity;
  1538. }
  1539. }
  1540. PrepareCommand(cmd, conn, trans, CommandType.Text, cmdText, cmdParms);
  1541. int val = cmd.ExecuteNonQuery();
  1542. foreach (SqlParameter q in cmdParms)
  1543. {
  1544. if (q.Direction == ParameterDirection.Output)
  1545. {
  1546. identity = Convert.ToInt32(q.Value);
  1547. }
  1548. }
  1549. cmd.Parameters.Clear();
  1550. }
  1551. trans.Commit();
  1552. }
  1553. catch
  1554. {
  1555. trans.Rollback();
  1556. throw;
  1557. }
  1558. finally
  1559. {
  1560. CloseConnection(conn);
  1561. }
  1562. }
  1563. }
  1564. }
  1565. /// <summary>
  1566. /// 执行多条SQL语句,实现数据库事务。
  1567. /// </summary>
  1568. /// <param name="SQLStringList">SQL命令集合</param>
  1569. public static int ExecuteSqlTran(List<CommandInfo> cmdList)
  1570. {
  1571. using (SqlConnection conn = new SqlConnection(constr))
  1572. {
  1573. conn.Open();
  1574. using (SqlTransaction trans = conn.BeginTransaction())
  1575. {
  1576. SqlCommand cmd = new SqlCommand();
  1577. try
  1578. {
  1579. int count = 0;
  1580. //循环
  1581. foreach (CommandInfo myDE in cmdList)
  1582. {
  1583. string cmdText = myDE.CommandText;
  1584. SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
  1585. PrepareCommand(cmd, conn, trans, CommandType.Text, cmdText, cmdParms);
  1586. int val = cmd.ExecuteNonQuery();
  1587. count += val;
  1588. cmd.Parameters.Clear();
  1589. }
  1590. trans.Commit();
  1591. return count;
  1592. }
  1593. catch
  1594. {
  1595. trans.Rollback();
  1596. throw;
  1597. }
  1598. finally
  1599. {
  1600. CloseConnection(conn);
  1601. }
  1602. }
  1603. }
  1604. }
  1605. /// <summary>
  1606. /// 执行多条SQL语句,实现数据库事务。
  1607. /// </summary>
  1608. /// <param name="SQLStringList">多条SQL语句</param>
  1609. public static int ExecuteSqlTran(List<String> SQLStringList)
  1610. {
  1611. using (SqlConnection conn = new SqlConnection(constr))
  1612. {
  1613. conn.Open();
  1614. SqlCommand cmd = new SqlCommand();
  1615. cmd.Connection = conn;
  1616. SqlTransaction tx = conn.BeginTransaction();
  1617. cmd.Transaction = tx;
  1618. try
  1619. {
  1620. int count = 0;
  1621. for (int n = 0; n < SQLStringList.Count; n++)
  1622. {
  1623. string strsql = SQLStringList[n];
  1624. if (strsql.Trim().Length > 1)
  1625. {
  1626. cmd.CommandText = strsql;
  1627. count += cmd.ExecuteNonQuery();
  1628. }
  1629. }
  1630. tx.Commit();
  1631. return count;
  1632. }
  1633. catch
  1634. {
  1635. tx.Rollback();
  1636. return 0;
  1637. }
  1638. finally
  1639. {
  1640. CloseConnection(conn);
  1641. }
  1642. }
  1643. }
  1644. /// <summary>
  1645. /// 执行SQL语句,返回影响的记录数
  1646. /// </summary>
  1647. /// <param name="SQLString">SQL语句</param>
  1648. /// <returns>影响的记录数</returns>
  1649. public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
  1650. {
  1651. using (SqlConnection connection = new SqlConnection(constr))
  1652. {
  1653. int rows = 0;
  1654. using (SqlCommand cmd = new SqlCommand())
  1655. {
  1656. try
  1657. {
  1658. PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, cmdParms);
  1659. rows = cmd.ExecuteNonQuery();
  1660. cmd.Parameters.Clear();
  1661. }
  1662. catch (System.Data.SqlClient.SqlException e)
  1663. {
  1664. throw e;
  1665. }
  1666. finally
  1667. {
  1668. CloseConnection(connection);
  1669. }
  1670. }
  1671. return rows;
  1672. }
  1673. }
  1674. /// <summary>
  1675. /// 执行SQL语句,返回影响行数
  1676. /// </summary>
  1677. /// <param name="commandType">操作类型</param>
  1678. /// <param name="commandText">SQL语句</param>
  1679. /// <param name="constr">数据库连接字符串</param>
  1680. /// <param name="para">参数</param>
  1681. /// <returns>影响的行数</returns>
  1682. public static int ExecuteQuery(CommandType commandType, string commandText, string constr, params SqlParameter[] para)
  1683. {
  1684. using (SqlConnection conn = new SqlConnection(constr))
  1685. {
  1686. return ExecuteNonQuery(conn, commandType, commandText, para);
  1687. }
  1688. }
  1689. /// <summary>
  1690. /// 执行SQL语句,返回影响行数并返回主键ID
  1691. /// </summary>
  1692. /// <param name="commandType">操作类型</param>
  1693. /// <param name="commandText">SQL语句</param>
  1694. /// <param name="constr">数据库连接</param>
  1695. /// <param name="id">抛出的主键ID</param>
  1696. /// <param name="para">参数</param>
  1697. /// <returns>影响的行数</returns>
  1698. public static int ExecuteQuery(CommandType commandType, string commandText, string constr, out int id, params SqlParameter[] para)
  1699. {
  1700. id = 0;
  1701. int result = -1;
  1702. using (SqlConnection conn = new SqlConnection(constr))
  1703. {
  1704. SqlCommand cmd = new SqlCommand();
  1705. PrepareCommand(cmd, conn, (SqlTransaction)null, commandType, commandText, para);
  1706. try
  1707. {
  1708. result = cmd.ExecuteNonQuery();
  1709. id = int.Parse(cmd.Parameters["@" + ParameterDirection.ReturnValue.ToString()].Value.ToString());
  1710. cmd.Parameters.Clear();
  1711. }
  1712. catch (Exception e)
  1713. {
  1714. throw e;
  1715. }
  1716. finally
  1717. {
  1718. CloseConnection(conn);
  1719. }
  1720. }
  1721. return result;
  1722. }
  1723. /// <summary>
  1724. /// 执行SQL语句,返回影响的记录数
  1725. /// </summary>
  1726. /// <param name="connection">SqlConnection对象</param>
  1727. /// <param name="trans">SqlTransaction对象</param>
  1728. /// <param name="SQLString">SQL语句</param>
  1729. /// <returns>影响的记录数</returns>
  1730. public static int ExecuteSql(SqlConnection connection, SqlTransaction trans, string SQLString, params SqlParameter[] cmdParms)
  1731. {
  1732. using (SqlCommand cmd = new SqlCommand())
  1733. {
  1734. int rows = 0;
  1735. try
  1736. {
  1737. PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, cmdParms);
  1738. rows = cmd.ExecuteNonQuery();
  1739. cmd.Parameters.Clear();
  1740. }
  1741. catch (System.Data.SqlClient.SqlException e)
  1742. {
  1743. trans.Rollback();
  1744. throw e;
  1745. }
  1746. finally
  1747. {
  1748. CloseConnection(connection);
  1749. }
  1750. return rows;
  1751. }
  1752. }
  1753. #endregion
  1754. #region 获取数据集,含分页
  1755. /// <summary>
  1756. /// 对应object数组到SqlParameter数组
  1757. /// </summary>
  1758. /// <param name="commandParameters">SqlParameter参数数组</param>
  1759. /// <param name="parameterValues">object参数数组</param>
  1760. private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
  1761. {
  1762. if ((commandParameters != null) && (parameterValues != null))
  1763. {
  1764. if (commandParameters.Length != parameterValues.Length)
  1765. {
  1766. throw new ArgumentException("Parameter count does not match Parameter Value count.");
  1767. }
  1768. int index = 0;
  1769. int length = commandParameters.Length;
  1770. while (index < length)
  1771. {
  1772. if (parameterValues[index] is IDbDataParameter)
  1773. {
  1774. IDbDataParameter parameter = (IDbDataParameter)parameterValues[index];
  1775. if (parameter.Value == null)
  1776. {
  1777. commandParameters[index].Value = DBNull.Value;
  1778. }
  1779. else
  1780. {
  1781. commandParameters[index].Value = parameter.Value;
  1782. }
  1783. }
  1784. else if (parameterValues[index] == null)
  1785. {
  1786. commandParameters[index].Value = DBNull.Value;
  1787. }
  1788. else
  1789. {
  1790. commandParameters[index].Value = parameterValues[index];
  1791. }
  1792. index++;
  1793. }
  1794. }
  1795. }
  1796. /// <summary>
  1797. /// 获取数据集 存储过程使用
  1798. /// </summary>
  1799. /// <param name="connectionString">数据库连接字符串</param>
  1800. /// <param name="commandType">SqlCommand命令类型</param>
  1801. /// <param name="commandText">命令内容</param>
  1802. /// <param name="commandParameters">命令用到参数集合</param>
  1803. /// <returns>数据集</returns>
  1804. public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params object[] commandParameters)
  1805. {
  1806. SqlCommand cmd = new SqlCommand();
  1807. SqlConnection conn = new SqlConnection(connectionString);
  1808. SqlParameter[] spParameterSet = SqlHelperParameterCache.GetSpParameterSet(connectionString, commandText);
  1809. AssignParameterValues(spParameterSet, commandParameters);
  1810. PrepareCommand(cmd, conn, null, commandType, commandText, spParameterSet);
  1811. using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
  1812. {
  1813. DataSet dataSet = new DataSet();
  1814. try
  1815. {
  1816. adapter.Fill(dataSet);
  1817. cmd.Parameters.Clear();
  1818. }
  1819. catch (Exception e)
  1820. {
  1821. throw e;
  1822. }
  1823. finally
  1824. {
  1825. CloseConnection(conn);
  1826. }
  1827. return dataSet;
  1828. }
  1829. }
  1830. /// <summary>
  1831. /// 执行查询语句,返回DataSet
  1832. /// </summary>
  1833. /// <param name="connection">SqlConnection对象</param>
  1834. /// <param name="SQLString">查询语句</param>
  1835. /// <returns>DataSet</returns>
  1836. public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
  1837. {
  1838. SqlConnection conn = new SqlConnection(connectionString);
  1839. SqlCommand cmd = new SqlCommand();
  1840. PrepareCommand(cmd, conn, (SqlTransaction)null, commandType, commandText, commandParameters);
  1841. using (SqlDataAdapter da = new SqlDataAdapter(cmd))
  1842. {
  1843. DataSet ds = new DataSet();
  1844. try
  1845. {
  1846. da.Fill(ds);
  1847. cmd.Parameters.Clear();
  1848. }
  1849. catch
  1850. {
  1851. throw;
  1852. }
  1853. finally
  1854. {
  1855. CloseConnection(conn);
  1856. }
  1857. return ds;
  1858. }
  1859. }
  1860. /// <summary>
  1861. /// 执行查询语句,返回DataSet
  1862. /// </summary>
  1863. /// <param name="SQLString">查询语句</param>
  1864. /// <returns>DataSet</returns>
  1865. public static DataSet Query(string SQLString)
  1866. {
  1867. using (SqlConnection connection = new SqlConnection(constr))
  1868. {
  1869. DataSet ds = new DataSet();
  1870. SqlCommand cmd = new SqlCommand();
  1871. PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, null);
  1872. try
  1873. {
  1874. SqlDataAdapter command = new SqlDataAdapter(cmd);
  1875. command.Fill(ds, "ds");
  1876. command.Dispose();
  1877. }
  1878. catch (System.Data.SqlClient.SqlException ex)
  1879. {
  1880. throw new Exception(ex.Message);
  1881. }
  1882. finally
  1883. {
  1884. CloseConnection(connection);
  1885. }
  1886. return ds;
  1887. }
  1888. }
  1889. /// <summary>
  1890. /// 执行查询语句,返回DataSet
  1891. /// </summary>
  1892. /// <param name="SQLString">查询语句</param>
  1893. /// <returns>DataSet</returns>
  1894. public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
  1895. {
  1896. using (SqlConnection connection = new SqlConnection(constr))
  1897. {
  1898. SqlCommand cmd = new SqlCommand();
  1899. PrepareCommand(cmd, connection, null, CommandType.Text, SQLString, cmdParms);
  1900. using (SqlDataAdapter da = new SqlDataAdapter(cmd))
  1901. {
  1902. DataSet ds = new DataSet();
  1903. try
  1904. {
  1905. da.Fill(ds, "ds");
  1906. cmd.Parameters.Clear();
  1907. }
  1908. catch (System.Data.SqlClient.SqlException ex)
  1909. {
  1910. throw new Exception(ex.Message);
  1911. }
  1912. finally
  1913. {
  1914. CloseConnection(connection);
  1915. }
  1916. return ds;
  1917. }
  1918. }
  1919. }
  1920. /// <summary>
  1921. /// 执行查询语句,返回DataSet
  1922. /// </summary>
  1923. /// <param name="connection">SqlConnection对象</param>
  1924. /// <param name="trans">SqlTransaction事务</param>
  1925. /// <param name="SQLString">查询语句</param>
  1926. /// <returns>DataSet</returns>
  1927. public static DataSet Query(SqlConnection connection, SqlTransaction trans, string SQLString, params SqlParameter[] cmdParms)
  1928. {
  1929. SqlCommand cmd = new SqlCommand();
  1930. PrepareCommand(cmd, connection, trans, CommandType.Text, SQLString, cmdParms);
  1931. using (SqlDataAdapter da = new SqlDataAdapter(cmd))
  1932. {
  1933. DataSet ds = new DataSet();
  1934. try
  1935. {
  1936. da.Fill(ds, "ds");
  1937. cmd.Parameters.Clear();
  1938. }
  1939. catch (System.Data.SqlClient.SqlException ex)
  1940. {
  1941. trans.Rollback();
  1942. throw new Exception(ex.Message);
  1943. }
  1944. finally
  1945. {
  1946. CloseConnection(connection);
  1947. }
  1948. return ds;
  1949. }
  1950. }
  1951. /// <summary>
  1952. /// Pagination 获取分页数据
  1953. /// </summary>
  1954. /// <param name="item">分页实体类,包含分页存储过程所用到的各个参数</param>
  1955. /// <param name="connectionString">数据库连接字符串</param>
  1956. /// <param name="ProName">存储过程名称</param>
  1957. /// <returns>某一页所有记录</returns>
  1958. public static DataSet GetPageContent(Pagination item, string connectionString, string ProName)
  1959. {
  1960. object[] commandParameters = new object[] { item.Tables, item.PrimaryKey, item.Sort, item.CurrentPage, item.PageSize, item.Fields, item.Filter, item.Group };
  1961. return ExecuteDataset(connectionString, CommandType.StoredProcedure, ProName, commandParameters);
  1962. }
  1963. /// <summary>
  1964. /// PaginationByRowNumber获取分页数据
  1965. /// </summary>
  1966. /// <param name="item">分页实体</param>
  1967. /// <param name="constr">数据库链接</param>
  1968. /// <param name="ProName">过程名称</param>
  1969. /// <returns>数据集</returns>
  1970. public static DataSet GetPageContent(PaginationByRowNumber item, string constr, string ProName)
  1971. {
  1972. object[] commandParameter = new object[] { item.Table, item.Sort, item.CurrentPage, item.PageSize, item.Fields, item.Filter };
  1973. return ExecuteDataset(constr, CommandType.StoredProcedure, ProName, commandParameter);
  1974. }
  1975. /// <summary>
  1976. /// 获取分页数据
  1977. /// </summary>
  1978. /// <param name="pt">分页实体类,包含分页存储过程所用到的各个参数</param>
  1979. /// <param name="ProName">存储过程名称</param>
  1980. /// <param name="constr">数据库连接字符串</param>
  1981. /// <returns>某一页所有记录</returns>
  1982. public static DataSet GetItems(Pagination pt, string ProName, string constr)
  1983. {
  1984. return GetPageContent(pt, constr, ProName);
  1985. }
  1986. /// <summary>
  1987. /// 获取数据集
  1988. /// </summary>
  1989. /// <param name="commandType">Sql命令类型</param>
  1990. /// <param name="commandText">Sql命令内容</param>
  1991. /// <param name="constr">数据库连接字符串</param>
  1992. /// <returns>数据集</returns>
  1993. public static DataSet SqlTextDataset(CommandType commandType, string commandText, string constr)
  1994. {
  1995. return ExecuteDataset(constr, commandType, commandText, null);
  1996. }
  1997. /// <summary>
  1998. /// 获取数据集
  1999. /// </summary>
  2000. /// <param name="commandType">数据类型</param>
  2001. /// <param name="commandText">SQL语句或过程</param>
  2002. /// <param name="constr">数据库连接</param>
  2003. /// <param name="cmdParms">参数</param>
  2004. /// <returns>DataSet</returns>
  2005. public static DataSet SqlTextDataset(CommandType commandType, string commandText, string constr, params SqlParameter[] cmdParms)
  2006. {
  2007. return ExecuteDataset(constr, commandType, commandText, cmdParms);
  2008. }
  2009. /// <summary>
  2010. /// 事务处理,执行一条计算查询结果语句,返回查询结果(object)。
  2011. /// </summary>
  2012. /// <param name="connection">SqlConnection对象</param>
  2013. /// <param name="trans">SqlTransaction事务</param>
  2014. /// <param name="SQLString">计算查询结果语句</param>
  2015. /// <returns>查询结果(object)</returns>
  2016. public static object GetSingle(SqlConnection connection, SqlTransaction trans, CommandType commandType, string SQLString, params SqlParameter[] cmdParms)
  2017. {
  2018. using (SqlCommand cmd = new SqlCommand())
  2019. {
  2020. try
  2021. {
  2022. PrepareCommand(cmd, connection, trans, commandType, SQLString, cmdParms);
  2023. object obj = cmd.ExecuteScalar();
  2024. cmd.Parameters.Clear();
  2025. if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
  2026. {
  2027. return null;
  2028. }
  2029. else
  2030. {
  2031. return obj;
  2032. }
  2033. }
  2034. catch (Exception e)
  2035. {
  2036. trans.Rollback();
  2037. throw e;
  2038. }
  2039. finally
  2040. {
  2041. connection.Close();
  2042. }
  2043. }
  2044. }
  2045. #endregion
  2046. #region 操作帮助方法
  2047. /// <summary>
  2048. /// SqlCommand参数初始化
  2049. /// </summary>
  2050. /// <param name="cmd">Sql命令</param>
  2051. /// <param name="conn">数据库连接对象</param>
  2052. /// <param name="trans">事务对象</param>
  2053. /// <param name="cmdType">Sql命令类型</param>
  2054. /// <param name="cmdText">Sql命令内容</param>
  2055. /// <param name="cmdParms">Sql命令参数集合</param>
  2056. private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
  2057. {
  2058. if (conn.State != ConnectionState.Open)
  2059. {
  2060. conn.Open();
  2061. }
  2062. cmd.Connection = conn;
  2063. cmd.CommandText = cmdText;
  2064. if (trans != null)
  2065. {
  2066. cmd.Transaction = trans;
  2067. }
  2068. cmd.CommandType = cmdType;
  2069. if (cmdParms != null)
  2070. {
  2071. foreach (SqlParameter parameter in cmdParms)
  2072. {
  2073. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
  2074. (parameter.Value == null))
  2075. {
  2076. parameter.Value = DBNull.Value;
  2077. }
  2078. cmd.Parameters.Add(parameter);
  2079. }
  2080. }
  2081. }
  2082. /// <summary>
  2083. /// 关闭数据库连接 释放资源
  2084. /// </summary>
  2085. /// <param name="connection">连接对象</param>
  2086. public static void CloseConnection(SqlConnection connection)
  2087. {
  2088. if (connection.State != ConnectionState.Closed)
  2089. {
  2090. connection.Dispose();
  2091. connection.Close();
  2092. }
  2093. }
  2094. #endregion
  2095. #region 建立一个参数 包括Dictionary和T
  2096. /// <summary>
  2097. /// OOP根据实体类和所属某个属性返回一个SQL参数
  2098. /// </summary>
  2099. /// <typeparam name="T">数据实体类</typeparam>
  2100. /// <param name="p">属性</param>
  2101. /// <param name="t">数据实体对象</param>
  2102. /// <returns>一个SQL参数,已经初始化</returns>
  2103. private static SqlParameter createParam(PropertyInfo p, object v)
  2104. {
  2105. SqlParameter sp = null;
  2106. var propertyType = Nullable.GetUnderlyingType(p.PropertyType) ?? p.PropertyType;//得到属性定义类型
  2107. string t_p = propertyType.ToString().ToLower();//转化为小写
  2108. t_p = t_p.Substring(t_p.IndexOf('.') + 1, t_p.Length - t_p.IndexOf('.') - 1);
  2109. // int->Int32 decimal->Decimal float->Single double->Double bool->Boolean datetime->DateTime string->String char->Char
  2110. switch (t_p)
  2111. {
  2112. case "byte":
  2113. sp = new SqlParameter("@" + p.Name, SqlDbType.TinyInt);
  2114. sp.Value = int.Parse(v.ToString());
  2115. break;
  2116. case "int16":
  2117. sp = new SqlParameter("@" + p.Name, SqlDbType.SmallInt);
  2118. sp.Value = int.Parse(v.ToString());
  2119. break;
  2120. case "int32":
  2121. sp = new SqlParameter("@" + p.Name, SqlDbType.Int);
  2122. sp.Value = int.Parse(v.ToString());
  2123. break;
  2124. case "decimal":
  2125. sp = new SqlParameter("@" + p.Name, SqlDbType.Decimal);
  2126. sp.Value = decimal.Parse(v.ToString());
  2127. break;
  2128. case "single":
  2129. sp = new SqlParameter("@" + p.Name, SqlDbType.Float);
  2130. sp.Value = float.Parse(v.ToString());
  2131. break;
  2132. case "double":
  2133. sp = new SqlParameter("@" + p.Name, SqlDbType.Decimal);
  2134. sp.Value = decimal.Parse(v.ToString());
  2135. break;
  2136. case "boolean":
  2137. sp = new SqlParameter("@" + p.Name, SqlDbType.Bit);
  2138. if (v.ToString().ToLower() == "true")
  2139. {
  2140. sp.Value = 1;
  2141. }
  2142. else if (v.ToString().ToLower() == "false")
  2143. {
  2144. sp.Value = 0;
  2145. }
  2146. break;
  2147. case "datetime":
  2148. sp = new SqlParameter("@" + p.Name, SqlDbType.DateTime);
  2149. sp.Value = (DateTime)v;
  2150. break;
  2151. case "string":
  2152. //程序测试时注意数据库表中字段是双字节和单字节可变类型情况
  2153. if (System.Text.RegularExpressions.Regex.IsMatch(v.ToString(), @"[^\x00-\xff]+"))
  2154. {
  2155. string name = p.Name.ToLower();
  2156. if (name.IndexOf("remark") >= 0 || name.IndexOf("content") >= 0 || name.IndexOf("description") >= 0)
  2157. {
  2158. sp = new SqlParameter("@" + p.Name, SqlDbType.NVarChar, 2000);
  2159. }
  2160. else
  2161. {
  2162. sp = new SqlParameter("@" + p.Name, SqlDbType.VarChar, 50);
  2163. }
  2164. }
  2165. else
  2166. {
  2167. sp = new SqlParameter("@" + p.Name, SqlDbType.VarChar, 50);
  2168. }
  2169. sp.Value = v.ToString();
  2170. break;
  2171. case "char":
  2172. sp = new SqlParameter("@" + p.Name, SqlDbType.Char, 1);
  2173. sp.Value = v.ToString();
  2174. break;
  2175. }
  2176. return sp;
  2177. }
  2178. /// <summary>
  2179. /// 利用Key-Value创建一个参数
  2180. /// </summary>
  2181. /// <param name="current">键值对</param>
  2182. /// <returns>SQL参数,已经初始化</returns>
  2183. public static SqlParameter createParam(string key, object obj)
  2184. {
  2185. SqlParameter sp = null;
  2186. string t_p = obj.GetType().ToString().ToLower();//转化为小写
  2187. t_p = t_p.Substring(t_p.IndexOf('.') + 1, t_p.Length - t_p.IndexOf('.') - 1);
  2188. // int->Int32 decimal->Decimal float->Single double->Double bool->Boolean datetime->DateTime string->String char->Char
  2189. switch (t_p)
  2190. {
  2191. case "byte":
  2192. sp = new SqlParameter("@" + key, SqlDbType.TinyInt);
  2193. sp.Value = int.Parse(obj.ToString());
  2194. break;
  2195. case "int16":
  2196. sp = new SqlParameter("@" + key, SqlDbType.SmallInt);
  2197. sp.Value = int.Parse(obj.ToString());
  2198. break;
  2199. case "int32":
  2200. sp = new SqlParameter("@" + key, SqlDbType.Int);
  2201. sp.Value = int.Parse(obj.ToString());
  2202. break;
  2203. case "decimal":
  2204. sp = new SqlParameter("@" + key, SqlDbType.Decimal);
  2205. sp.Value = decimal.Parse(obj.ToString());
  2206. break;
  2207. case "single":
  2208. sp = new SqlParameter("@" + key, SqlDbType.Float);
  2209. sp.Value = float.Parse(obj.ToString());
  2210. break;
  2211. case "double":
  2212. sp = new SqlParameter("@" + key, SqlDbType.Decimal);
  2213. sp.Value = decimal.Parse(obj.ToString());
  2214. break;
  2215. case "boolean":
  2216. sp = new SqlParameter("@" + key, SqlDbType.Bit);
  2217. if (obj.ToString().ToLower() == "true")
  2218. {
  2219. sp.Value = 1;
  2220. }
  2221. else if (obj.ToString().ToLower() == "false")
  2222. {
  2223. sp.Value = 0;
  2224. }
  2225. break;
  2226. case "datetime":
  2227. sp = new SqlParameter("@" + key, SqlDbType.DateTime);
  2228. sp.Value = (DateTime)obj;
  2229. break;
  2230. case "string":
  2231. if (System.Text.RegularExpressions.Regex.IsMatch(obj.ToString(), @"[^\x00-\xff]+"))
  2232. {
  2233. string name = key.ToLower();
  2234. if (name.IndexOf("remark") >= 0 || name.IndexOf("content") >= 0 || name.IndexOf("description") >= 0)
  2235. {
  2236. sp = new SqlParameter("@" + key, SqlDbType.NVarChar, 2000);
  2237. }
  2238. else
  2239. {
  2240. sp = new SqlParameter("@" + key, SqlDbType.VarChar, 50);
  2241. }
  2242. }
  2243. else
  2244. {
  2245. sp = new SqlParameter("@" + key, SqlDbType.VarChar, 50);
  2246. }
  2247. sp.Value = obj.ToString();
  2248. break;
  2249. case "char":
  2250. sp = new SqlParameter("@" + key, SqlDbType.Char, 1);
  2251. sp.Value = obj.ToString();
  2252. break;
  2253. }
  2254. return sp;
  2255. }
  2256. #endregion
  2257. }
  2258. /// <summary>
  2259. /// 构造SQL命令和对应参数
  2260. /// </summary>
  2261. public class CommandInfo
  2262. {
  2263. public string CommandText;
  2264. public System.Data.Common.DbParameter[] Parameters;
  2265. public CommandInfo(string sqlText, SqlParameter[] para)
  2266. {
  2267. this.CommandText = sqlText;
  2268. this.Parameters = para;
  2269. }
  2270. }
  2271. #region 分页类实体,借助存储过程实现
  2272. public class Pagination
  2273. {
  2274. public int CurrentPage
  2275. {
  2276. get;
  2277. set;
  2278. }
  2279. public string Fields
  2280. {
  2281. get;
  2282. set;
  2283. }
  2284. public string Filter
  2285. {
  2286. get;
  2287. set;
  2288. }
  2289. public string Group
  2290. {
  2291. get;
  2292. set;
  2293. }
  2294. public int PageSize
  2295. {
  2296. get;
  2297. set;
  2298. }
  2299. public string PrimaryKey
  2300. {
  2301. get;
  2302. set;
  2303. }
  2304. public string Sort
  2305. {
  2306. get;
  2307. set;
  2308. }
  2309. public string Tables
  2310. {
  2311. get;
  2312. set;
  2313. }
  2314. }
  2315. /// <summary>
  2316. /// RowNumber分页
  2317. /// </summary>
  2318. public class PaginationByRowNumber
  2319. {
  2320. /// <summary>
  2321. /// 表名
  2322. /// </summary>
  2323. public string Table { get; set; }
  2324. /// <summary>
  2325. /// 排序 需要指明顺序 asc/desc
  2326. /// </summary>
  2327. public string Sort { get; set; }
  2328. /// <summary>
  2329. /// 当前页
  2330. /// </summary>
  2331. public int CurrentPage { get; set; }
  2332. /// <summary>
  2333. /// 行数
  2334. /// </summary>
  2335. public int PageSize { get; set; }
  2336. /// <summary>
  2337. /// 字段
  2338. /// </summary>
  2339. public string Fields { get; set; }
  2340. /// <summary>
  2341. /// 条件
  2342. /// </summary>
  2343. public string Filter { get; set; }
  2344. }
  2345. #endregion
  2346. #region 使用存储过程时缓存参数
  2347. public sealed class SqlHelperParameterCache
  2348. {
  2349. private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable());
  2350. private SqlHelperParameterCache()
  2351. {
  2352. }
  2353. public static void CacheParameterSet(string connectionString, string commandText, params SqlParameter[] commandParameters)
  2354. {
  2355. if ((connectionString == null) || (connectionString.Length == 0))
  2356. {
  2357. throw new ArgumentNullException("connectionString");
  2358. }
  2359. if ((commandText == null) || (commandText.Length == 0))
  2360. {
  2361. throw new ArgumentNullException("commandText");
  2362. }
  2363. string str = connectionString + ":" + commandText;
  2364. paramCache[str] = commandParameters;
  2365. }
  2366. private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters)
  2367. {
  2368. SqlParameter[] parameterArray = new SqlParameter[originalParameters.Length];
  2369. int index = 0;
  2370. int length = originalParameters.Length;
  2371. while (index < length)
  2372. {
  2373. parameterArray[index] = (SqlParameter)((ICloneable)originalParameters[index]).Clone();
  2374. index++;
  2375. }
  2376. return parameterArray;
  2377. }
  2378. private static SqlParameter[] DiscoverSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter)
  2379. {
  2380. if (connection == null)
  2381. {
  2382. throw new ArgumentNullException("connection");
  2383. }
  2384. if ((spName == null) || (spName.Length == 0))
  2385. {
  2386. throw new ArgumentNullException("spName");
  2387. }
  2388. SqlCommand command = new SqlCommand(spName, connection);
  2389. command.CommandType = CommandType.StoredProcedure;
  2390. connection.Open();
  2391. SqlCommandBuilder.DeriveParameters(command);
  2392. connection.Close();
  2393. if (!includeReturnValueParameter)
  2394. {
  2395. command.Parameters.RemoveAt(0);
  2396. }
  2397. SqlParameter[] array = new SqlParameter[command.Parameters.Count];
  2398. command.Parameters.CopyTo(array, 0);
  2399. foreach (SqlParameter parameter in array)
  2400. {
  2401. parameter.Value = DBNull.Value;
  2402. }
  2403. return array;
  2404. }
  2405. public static SqlParameter[] GetCachedParameterSet(string connectionString, string commandText)
  2406. {
  2407. if ((connectionString == null) || (connectionString.Length == 0))
  2408. {
  2409. throw new ArgumentNullException("connectionString");
  2410. }
  2411. if ((commandText == null) || (commandText.Length == 0))
  2412. {
  2413. throw new ArgumentNullException("commandText");
  2414. }
  2415. string str = connectionString + ":" + commandText;
  2416. SqlParameter[] originalParameters = paramCache[str] as SqlParameter[];
  2417. if (originalParameters == null)
  2418. {
  2419. return null;
  2420. }
  2421. return CloneParameters(originalParameters);
  2422. }
  2423. internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName)
  2424. {
  2425. return GetSpParameterSet(connection, spName, false);
  2426. }
  2427. public static SqlParameter[] GetSpParameterSet(string connectionString, string spName)
  2428. {
  2429. return GetSpParameterSet(connectionString, spName, false);
  2430. }
  2431. internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter)
  2432. {
  2433. if (connection == null)
  2434. {
  2435. throw new ArgumentNullException("connection");
  2436. }
  2437. using (SqlConnection connection2 = (SqlConnection)((ICloneable)connection).Clone())
  2438. {
  2439. return GetSpParameterSetInternal(connection2, spName, includeReturnValueParameter);
  2440. }
  2441. }
  2442. public static SqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter)
  2443. {
  2444. if ((connectionString == null) || (connectionString.Length == 0))
  2445. {
  2446. throw new ArgumentNullException("connectionString");
  2447. }
  2448. if ((spName == null) || (spName.Length == 0))
  2449. {
  2450. throw new ArgumentNullException("spName");
  2451. }
  2452. using (SqlConnection connection = new SqlConnection(connectionString))
  2453. {
  2454. return GetSpParameterSetInternal(connection, spName, includeReturnValueParameter);
  2455. }
  2456. }
  2457. private static SqlParameter[] GetSpParameterSetInternal(SqlConnection connection, string spName, bool includeReturnValueParameter)
  2458. {
  2459. if (connection == null)
  2460. {
  2461. throw new ArgumentNullException("connection");
  2462. }
  2463. if ((spName == null) || (spName.Length == 0))
  2464. {
  2465. throw new ArgumentNullException("spName");
  2466. }
  2467. string str = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : "");
  2468. SqlParameter[] originalParameters = paramCache[str] as SqlParameter[];
  2469. if (originalParameters == null)
  2470. {
  2471. SqlParameter[] parameterArray2 = DiscoverSpParameterSet(connection, spName, includeReturnValueParameter);
  2472. paramCache[str] = parameterArray2;
  2473. originalParameters = parameterArray2;
  2474. }
  2475. return CloneParameters(originalParameters);
  2476. }
  2477. }
  2478. #endregion
  2479. /// <summary>
  2480. /// 创建SqlParameter
  2481. /// </summary>
  2482. public class CP
  2483. {
  2484. public class ColumnInfo
  2485. {
  2486. public string ColName { get; set; }
  2487. public SqlDbType ColType { get; set; }
  2488. public int ColLength { get; set; }
  2489. public bool IsPrimary { get; set; }
  2490. public string Description { get; set; }
  2491. }
  2492. /// <summary>
  2493. /// 读取用户表及每个表字段信息保存到字典对象,加入缓存
  2494. /// </summary>
  2495. /// <param name="specifyTable">指定表名,如果为空,则查询所有表</param>
  2496. /// <param name="connStr">数据库连接串</param>
  2497. /// <returns></returns>
  2498. public static List<ColumnInfo> TC(string specifyTable, string connStr)
  2499. {
  2500. if (string.IsNullOrEmpty(specifyTable))
  2501. {
  2502. return null;
  2503. }
  2504. var vl = HttpRuntime.Cache.Get("utable_" + specifyTable);
  2505. if (vl == null)
  2506. {
  2507. List<ColumnInfo> p = new List<ColumnInfo>();
  2508. using (SqlConnection conn = new SqlConnection(connStr))
  2509. {
  2510. StringBuilder sb = new StringBuilder(1000);
  2511. sb.Append("SELECT a.name,(case when (SELECT count(*) FROM sysobjects WHERE (name in (SELECT name FROM sysindexes WHERE (id = a.id) AND (indid in (SELECT indid FROM sysindexkeys WHERE (id = a.id) AND (colid in (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))))))) AND (xtype = 'PK'))>0 then '1' else '0' end) isprimary,b.name [type],COLUMNPROPERTY(a.id,a.name,'PRECISION') as [length],isnull(g.value,'') as [description] FROM syscolumns a ");
  2512. sb.Append("left join systypes b on a.xtype=b.xusertype inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'");
  2513. sb.Append("left join syscomments e on a.cdefault=e.id left join sys.extended_properties g on a.id=g.major_id AND a.colid = g.minor_id where d.name =@tname order by a.id,a.colorder");
  2514. conn.Open();
  2515. SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
  2516. cmd.Parameters.Add(new SqlParameter("@tname", SqlDbType.VarChar, 30));
  2517. cmd.Parameters[0].Value = specifyTable;
  2518. SqlDataAdapter sda = new SqlDataAdapter(cmd);
  2519. DataSet ds = new DataSet();
  2520. sda.Fill(ds);
  2521. DataTable dt = ds.Tables[0];
  2522. int count = dt.Rows.Count;
  2523. if (count > 0)
  2524. {
  2525. for (int i = 0; i < count; i++)
  2526. {
  2527. ColumnInfo item = new ColumnInfo() { ColName = dt.Rows[i]["name"].ToString(), ColLength = int.Parse(dt.Rows[i]["length"].ToString()), ColType = StringToSqlType(dt.Rows[i]["type"].ToString()), IsPrimary = (dt.Rows[i]["isprimary"].ToString() == "1" ? true : false), Description = dt.Rows[i]["description"].ToString() };
  2528. p.Add(item);
  2529. }
  2530. HttpRuntime.Cache.Insert("utable_" + specifyTable, p, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0));
  2531. }
  2532. }
  2533. return p;
  2534. }
  2535. else
  2536. {
  2537. return (List<ColumnInfo>)HttpRuntime.Cache["utable_" + specifyTable];
  2538. }
  2539. }
  2540. /// <summary>
  2541. /// 读取用户表及每个表字段信息保存到字典对象,加入缓存 只针对视图
  2542. /// </summary>
  2543. /// <param name="specifyTable">指定表名,如果为空,则查询所有表</param>
  2544. /// <param name="connStr">数据库连接串</param>
  2545. /// <returns></returns>
  2546. public static List<ColumnInfo> TCV(string specifyTable, string connStr)
  2547. {
  2548. if (string.IsNullOrEmpty(specifyTable))
  2549. {
  2550. return null;
  2551. }
  2552. if (HttpRuntime.Cache["utable_" + specifyTable] == null)
  2553. {
  2554. List<ColumnInfo> p = new List<ColumnInfo>();
  2555. using (SqlConnection conn = new SqlConnection(connStr))
  2556. {
  2557. StringBuilder sb = new StringBuilder(1000);
  2558. sb.Append("select c.name ,t.name as type ,COLUMNPROPERTY(c.id,c.name,'PRECISION') as length ");
  2559. sb.Append("from syscolumns c inner join systypes t on c.xusertype=t.xusertype ");
  2560. sb.Append("where objectproperty(c.id,'IsView')=1 and c.id=object_id(@tname) ");
  2561. conn.Open();
  2562. SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
  2563. cmd.Parameters.Add(new SqlParameter("@tname", SqlDbType.VarChar, 30));
  2564. cmd.Parameters[0].Value = specifyTable;
  2565. SqlDataAdapter sda = new SqlDataAdapter(cmd);
  2566. DataSet ds = new DataSet();
  2567. sda.Fill(ds);
  2568. DataTable dt = ds.Tables[0];
  2569. int count = dt.Rows.Count;
  2570. if (count > 0)
  2571. {
  2572. for (int i = 0; i < count; i++)
  2573. {
  2574. ColumnInfo item = new ColumnInfo() { ColName = dt.Rows[i]["name"].ToString(), ColLength = int.Parse(dt.Rows[i]["length"].ToString()), ColType = StringToSqlType(dt.Rows[i]["type"].ToString()), IsPrimary = false, Description = "" };
  2575. p.Add(item);
  2576. }
  2577. HttpRuntime.Cache.Insert("utable_" + specifyTable, p, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0));
  2578. }
  2579. }
  2580. return p;
  2581. }
  2582. else
  2583. {
  2584. return (List<ColumnInfo>)HttpRuntime.Cache["utable_" + specifyTable];
  2585. }
  2586. }
  2587. //SqlServer数据库类型转换方法
  2588. public static SqlDbType StringToSqlType(string String)
  2589. {
  2590. SqlDbType dbType = SqlDbType.Variant;//默认为Object
  2591. switch (String)
  2592. {
  2593. case "int":
  2594. dbType = SqlDbType.Int;
  2595. break;
  2596. case "varchar":
  2597. dbType = SqlDbType.VarChar;
  2598. break;
  2599. case "bit":
  2600. dbType = SqlDbType.Bit;
  2601. break;
  2602. case "datetime":
  2603. dbType = SqlDbType.DateTime;
  2604. break;
  2605. case "decimal":
  2606. dbType = SqlDbType.Decimal;
  2607. break;
  2608. case "float":
  2609. dbType = SqlDbType.Float;
  2610. break;
  2611. case "image":
  2612. dbType = SqlDbType.Image;
  2613. break;
  2614. case "money":
  2615. dbType = SqlDbType.Money;
  2616. break;
  2617. case "ntext":
  2618. dbType = SqlDbType.NText;
  2619. break;
  2620. case "nvarchar":
  2621. dbType = SqlDbType.NVarChar;
  2622. break;
  2623. case "smalldatetime":
  2624. dbType = SqlDbType.SmallDateTime;
  2625. break;
  2626. case "smallint":
  2627. dbType = SqlDbType.SmallInt;
  2628. break;
  2629. case "text":
  2630. dbType = SqlDbType.Text;
  2631. break;
  2632. case "bigint":
  2633. dbType = SqlDbType.BigInt;
  2634. break;
  2635. case "binary":
  2636. dbType = SqlDbType.Binary;
  2637. break;
  2638. case "char":
  2639. dbType = SqlDbType.Char;
  2640. break;
  2641. case "nchar":
  2642. dbType = SqlDbType.NChar;
  2643. break;
  2644. case "numeric":
  2645. dbType = SqlDbType.Decimal;
  2646. break;
  2647. case "real":
  2648. dbType = SqlDbType.Real;
  2649. break;
  2650. case "smallmoney":
  2651. dbType = SqlDbType.SmallMoney;
  2652. break;
  2653. case "sql_variant":
  2654. dbType = SqlDbType.Variant;
  2655. break;
  2656. case "timestamp":
  2657. dbType = SqlDbType.Timestamp;
  2658. break;
  2659. case "tinyint":
  2660. dbType = SqlDbType.TinyInt;
  2661. break;
  2662. case "uniqueidentifier":
  2663. dbType = SqlDbType.UniqueIdentifier;
  2664. break;
  2665. case "varbinary":
  2666. dbType = SqlDbType.VarBinary;
  2667. break;
  2668. case "xml":
  2669. dbType = SqlDbType.Xml;
  2670. break;
  2671. }
  2672. return dbType;
  2673. }
  2674. #region 建立一个参数
  2675. /// <summary>
  2676. /// 根据表列信息集合和表对应实体类所属某个属性返回一个SQL参数
  2677. /// </summary>
  2678. /// <typeparam name="item">表列信息集合</typeparam>
  2679. /// <param name="property">属性</param>
  2680. /// <param name="v">属性对应值</param>
  2681. /// <param name="pd">参数方向</param>
  2682. /// <returns>一个SQL参数,已经初始化</returns>
  2683. public static SqlParameter cPa(ColumnInfo item, object v, ParameterDirection pd)
  2684. {
  2685. if (item == null)
  2686. {
  2687. return null;
  2688. }
  2689. SqlParameter sp = null;
  2690. if (item != null)
  2691. {
  2692. sp = new SqlParameter("@" + item.ColName, item.ColType, item.ColLength);
  2693. sp.Direction = pd;
  2694. sp.Value = v;
  2695. }
  2696. return sp;
  2697. }
  2698. /// <summary>
  2699. /// 根据表列信息集合和表对应实体类所属某个属性返回一个SQL参数
  2700. /// </summary>
  2701. /// <typeparam name="item">表列信息集合</typeparam>
  2702. /// <param name="property">属性</param>
  2703. /// <param name="v">属性对应值</param>
  2704. /// <returns>一个SQL参数,已经初始化</returns>
  2705. public static SqlParameter cPa(ColumnInfo item, object v)
  2706. {
  2707. if (item == null)
  2708. {
  2709. return null;
  2710. }
  2711. SqlParameter sp = null;
  2712. if (item != null)
  2713. {
  2714. sp = new SqlParameter("@" + item.ColName, item.ColType, item.ColLength);
  2715. sp.Direction = ParameterDirection.Input;
  2716. sp.Value = v;
  2717. }
  2718. return sp;
  2719. }
  2720. #endregion
  2721. /// <summary>
  2722. /// Author:付裕
  2723. /// Date: 2014-09-19
  2724. /// Desc: DataTable与泛型转换类
  2725. /// </summary>
  2726. public class WorkCommon
  2727. {
  2728. /// <summary>
  2729. /// DataTable Convert To List<T>
  2730. /// </summary>
  2731. /// <typeparam name="T">实体</typeparam>
  2732. /// <param name="dt">数据集合</param>
  2733. /// <returns>泛型集合</returns>
  2734. public static List<T> ConvertTo<T>(DataTable dt) where T : new()
  2735. {
  2736. if (dt == null) return null;
  2737. if (dt.Rows.Count <= 0) return null;
  2738. List<T> list = new List<T>();
  2739. try
  2740. {
  2741. List<string> columnsName = new List<string>();
  2742. foreach (DataColumn dataColumn in dt.Columns)
  2743. {
  2744. columnsName.Add(dataColumn.ColumnName);//得到所有的表头
  2745. }
  2746. list = dt.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsName)); //转换
  2747. return list;
  2748. }
  2749. catch
  2750. {
  2751. return null;
  2752. }
  2753. }
  2754. /// <summary>
  2755. /// 转换函数
  2756. /// </summary>
  2757. /// <typeparam name="T"></typeparam>
  2758. /// <param name="row"></param>
  2759. /// <param name="columnsName"></param>
  2760. /// <returns></returns>
  2761. private static T getObject<T>(DataRow row, List<string> columnsName) where T : new()
  2762. {
  2763. T obj = new T();
  2764. try
  2765. {
  2766. string columnname = "";
  2767. string value = "";
  2768. PropertyInfo[] Properties = typeof(T).GetProperties();
  2769. foreach (PropertyInfo objProperty in Properties) //遍历T的属性
  2770. {
  2771. columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower()); //寻找可以匹配的表头名称
  2772. if (!string.IsNullOrEmpty(columnname))
  2773. {
  2774. value = row[columnname].ToString();
  2775. if (!string.IsNullOrEmpty(value))
  2776. {
  2777. if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null) //存在匹配的表头
  2778. {
  2779. value = row[columnname].ToString().Replace("$", "").Replace(",", ""); //从dataRow中提取数据
  2780. objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null); //赋值操作
  2781. }
  2782. else
  2783. {
  2784. value = row[columnname].ToString().Replace("%", ""); //存在匹配的表头
  2785. objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);//赋值操作
  2786. }
  2787. }
  2788. }
  2789. }
  2790. return obj;
  2791. }
  2792. catch
  2793. {
  2794. return obj;
  2795. }
  2796. }
  2797. /// <summary>
  2798. /// 将泛型集合类转换成DataTable
  2799. /// </summary>
  2800. /// <typeparam name="T">集合项类型</typeparam>
  2801. /// <param name="list">集合</param>
  2802. /// <param name="propertyName">需要返回的列的列名</param>
  2803. /// <returns>数据集(表)</returns>
  2804. public static DataTable ListToDataTable<T>(IList<T> list, params string[] propertyName)
  2805. {
  2806. List<string> propertyNameList = new List<string>();
  2807. if (propertyName != null)
  2808. propertyNameList.AddRange(propertyName);
  2809. DataTable result = new DataTable();
  2810. if (list != null && list.Count > 0)
  2811. {
  2812. PropertyInfo[] propertys = list[0].GetType().GetProperties();
  2813. foreach (PropertyInfo pi in propertys)
  2814. {
  2815. if (propertyNameList.Count == 0)
  2816. {
  2817. result.Columns.Add(pi.Name, pi.PropertyType);
  2818. }
  2819. else
  2820. {
  2821. if (propertyNameList.Contains(pi.Name))
  2822. result.Columns.Add(pi.Name, pi.PropertyType);
  2823. }
  2824. }
  2825. for (int i = 0; i < list.Count; i++)
  2826. {
  2827. ArrayList tempList = new ArrayList();
  2828. foreach (PropertyInfo pi in propertys)
  2829. {
  2830. if (propertyNameList.Count == 0)
  2831. {
  2832. object obj = pi.GetValue(list[i], null);
  2833. tempList.Add(obj);
  2834. }
  2835. else
  2836. {
  2837. if (propertyNameList.Contains(pi.Name))
  2838. {
  2839. object obj = pi.GetValue(list[i], null);
  2840. tempList.Add(obj);
  2841. }
  2842. }
  2843. }
  2844. object[] array = tempList.ToArray();
  2845. result.LoadDataRow(array, true);
  2846. }
  2847. }
  2848. return result;
  2849. }
  2850. }
  2851. }