PageRenderTime 39ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Skywave Class Library/Skywave Core/Data/DbCommandHelper.cs

#
C# | 339 lines | 327 code | 9 blank | 3 comment | 16 complexity | d73738b7a23f464825c45366b79f0d00 MD5 | raw file
Possible License(s): LGPL-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data.Common;
  6. namespace Skywave.Data
  7. {
  8. public enum DbCommandHelperAdditionalCommands
  9. {
  10. None,
  11. Count,
  12. Sum,
  13. Average
  14. }
  15. public abstract class DbCommandHelper
  16. {
  17. public abstract string FixCommandString(string sqlQ);
  18. public virtual void FixCommand(DbCommand dbCommand1)
  19. {
  20. string sqlQ = dbCommand1.CommandText;
  21. sqlQ = FixCommandString(sqlQ);
  22. dbCommand1.CommandText = sqlQ;
  23. }
  24. public SqlCommandString GetSqlCommandString(System.Data.Linq.DataContext dc1, System.Linq.IQueryable qInput1, DbCommandHelperAdditionalCommands additionalCommand, object additionalCommandArgs)
  25. {
  26. return GetSqlCommandString(dc1, qInput1, additionalCommand, additionalCommandArgs, true);
  27. }
  28. public SqlCommandString GetSqlCommandString(System.Data.Linq.DataContext dc1, System.Linq.IQueryable qInput1, DbCommandHelperAdditionalCommands additionalCommand, object additionalCommandArgs, bool fixCommandString)
  29. {
  30. DbCommand dbCommand1 = GetDbCommand(dc1, qInput1, additionalCommand, additionalCommandArgs, fixCommandString);
  31. SqlCommandString r = new SqlCommandString();
  32. r.Params = new List<string>();
  33. r.CommandString = dbCommand1.CommandText;
  34. string paramType, paramValue;
  35. foreach (DbParameter fe1 in dbCommand1.Parameters)
  36. {
  37. int fe1_Size = (fe1.Size <= 0) ? 1 : fe1.Size;
  38. switch (fe1.DbType)
  39. {
  40. case System.Data.DbType.AnsiString:
  41. paramType = string.Format("VARCHAR({0})", fe1_Size);
  42. paramValue = string.Format("'{0}'", fe1.Value);
  43. break;
  44. case System.Data.DbType.AnsiStringFixedLength:
  45. paramType = string.Format("CHAR({0})", fe1_Size);
  46. paramValue = string.Format("'{0}'", fe1.Value);
  47. break;
  48. case System.Data.DbType.Binary:
  49. paramType = string.Format("BINARY", fe1_Size);
  50. paramValue = string.Format("{0}", fe1.Value);
  51. break;
  52. case System.Data.DbType.Boolean:
  53. paramType = string.Format("BIT", fe1_Size);
  54. if (fe1.Value is bool)
  55. paramValue = ((bool)fe1.Value) ? "1" : "0";
  56. else
  57. paramValue = string.Format("{0}", fe1.Value);
  58. break;
  59. case System.Data.DbType.Byte:
  60. paramType = string.Format("TINYINT", fe1_Size);
  61. paramValue = string.Format("{0}", fe1.Value);
  62. break;
  63. case System.Data.DbType.Time:
  64. case System.Data.DbType.Date:
  65. case System.Data.DbType.DateTime:
  66. case System.Data.DbType.DateTime2:
  67. case System.Data.DbType.DateTimeOffset:
  68. paramType = "DATETIME";
  69. if (fe1.Value is DateTime)
  70. paramValue = string.Format("'{0}'", ((DateTime)fe1.Value).ToString("yyyy-MM-ddTHH:mm:ss.fff"));
  71. else
  72. paramValue = string.Format("{0}", fe1.Value);
  73. break;
  74. case System.Data.DbType.Decimal:
  75. paramType = string.Format("DECIMAL", fe1_Size);
  76. paramValue = string.Format("{0}", fe1.Value);
  77. break;
  78. case System.Data.DbType.Double:
  79. paramType = string.Format("FLOAT", fe1_Size);
  80. paramValue = string.Format("{0}", fe1.Value);
  81. break;
  82. case System.Data.DbType.Int16:
  83. paramType = string.Format("SMALLINT", fe1_Size);
  84. paramValue = string.Format("{0}", fe1.Value);
  85. break;
  86. case System.Data.DbType.Int32:
  87. paramType = string.Format("INT", fe1_Size);
  88. paramValue = string.Format("{0}", fe1.Value);
  89. break;
  90. case System.Data.DbType.Int64:
  91. paramType = string.Format("BIGINT", fe1_Size);
  92. paramValue = string.Format("{0}", fe1.Value);
  93. break;
  94. case System.Data.DbType.SByte:
  95. paramType = string.Format("TINYINT", fe1_Size);
  96. paramValue = string.Format("{0}", fe1.Value);
  97. break;
  98. case System.Data.DbType.Single:
  99. paramType = string.Format("REAL", fe1_Size);
  100. paramValue = string.Format("{0}", fe1.Value);
  101. break;
  102. case System.Data.DbType.String:
  103. paramType = string.Format("NVARCHAR({0})", fe1_Size);
  104. paramValue = string.Format("N'{0}'", fe1.Value);
  105. break;
  106. case System.Data.DbType.StringFixedLength:
  107. paramType = string.Format("NCHAR({0})", fe1_Size);
  108. paramValue = string.Format("N'{0}'", fe1.Value);
  109. break;
  110. case System.Data.DbType.UInt16:
  111. paramType = string.Format("INT", fe1_Size);
  112. paramValue = string.Format("{0}", fe1.Value);
  113. break;
  114. case System.Data.DbType.UInt32:
  115. paramType = string.Format("BIGINT", fe1_Size);
  116. paramValue = string.Format("{0}", fe1.Value);
  117. break;
  118. case System.Data.DbType.UInt64:
  119. paramType = string.Format("NUMERIC(8,0)", fe1_Size);
  120. paramValue = string.Format("{0}", fe1.Value);
  121. break;
  122. case System.Data.DbType.VarNumeric:
  123. paramType = string.Format("NUMERIC", fe1_Size);
  124. paramValue = string.Format("{0}", fe1.Value);
  125. break;
  126. case System.Data.DbType.Xml:
  127. case System.Data.DbType.Object:
  128. case System.Data.DbType.Guid:
  129. case System.Data.DbType.Currency:
  130. default:
  131. paramType = "";
  132. paramValue = "";
  133. break;
  134. }
  135. //
  136. if (fe1.Value == null)
  137. paramValue = "NULL";
  138. //
  139. if (!string.IsNullOrEmpty(paramType))
  140. r.Params.Add(string.Format("{0} {1} = {2}", fe1.ParameterName, paramType, paramValue));
  141. }
  142. return r;
  143. }
  144. public DbCommand GetDbCommand(System.Data.Linq.DataContext dc1, System.Linq.IQueryable qInput1, DbCommandHelperAdditionalCommands additionalCommand, object additionalCommandArgs)
  145. {
  146. return GetDbCommand(dc1, qInput1, additionalCommand, additionalCommandArgs, true);
  147. }
  148. public DbCommand GetDbCommand(System.Data.Linq.DataContext dc1, System.Linq.IQueryable qInput1, DbCommandHelperAdditionalCommands additionalCommand, object additionalCommandArgs, bool fixCommandString)
  149. {
  150. DbCommand dbCommand1 = dc1.GetCommand(qInput1);
  151. if (fixCommandString)
  152. FixCommand(dbCommand1);
  153. string str1;
  154. string sqlQ = dbCommand1.CommandText;
  155. switch (additionalCommand)
  156. {
  157. case DbCommandHelperAdditionalCommands.Count:
  158. str1 = "*";
  159. if (additionalCommandArgs is string && !string.IsNullOrEmpty((string)additionalCommandArgs))
  160. str1 = (string)additionalCommandArgs;
  161. sqlQ = string.Format("SELECT COUNT({0}) FROM ({1}) AS maT1", str1, sqlQ);
  162. break;
  163. case DbCommandHelperAdditionalCommands.Sum:
  164. str1 = "value";
  165. if (additionalCommandArgs is string && !string.IsNullOrEmpty((string)additionalCommandArgs))
  166. str1 = (string)additionalCommandArgs;
  167. sqlQ = string.Format("SELECT SUM({0}) FROM ({1}) AS maT1", str1, sqlQ);
  168. break;
  169. case DbCommandHelperAdditionalCommands.Average:
  170. break;
  171. case DbCommandHelperAdditionalCommands.None:
  172. default:
  173. break;
  174. }
  175. dbCommand1.CommandText = sqlQ;
  176. return dbCommand1;
  177. }
  178. public void ChangeParametersNames(System.Data.Common.DbCommand toChange, DbCommand usedParametersContainer)
  179. { ChangeParametersNames(toChange, new List<DbCommand>() { usedParametersContainer }); }
  180. public void ChangeParametersNames(System.Data.Common.DbCommand toChange, List<DbCommand> usedParametersContainers)
  181. {
  182. List<string> usedParameterNames = new List<string>();
  183. foreach (DbCommand fe1 in usedParametersContainers)
  184. {
  185. usedParameterNames = usedParameterNames.Union((from x1 in fe1.Parameters.Cast<DbParameter>()
  186. select x1.ParameterName)).ToList();
  187. }
  188. ChangeParametersNames(toChange, usedParameterNames);
  189. }
  190. public void ChangeParametersNames(System.Data.Common.DbCommand toChange, List<string> usedParameterNames)
  191. {
  192. int i = 1;
  193. string oldParam;
  194. string newParam;
  195. Dictionary<string, string> replacements = new Dictionary<string, string>();
  196. int j = 1;
  197. foreach (System.Data.Common.DbParameter fe1 in toChange.Parameters)
  198. {
  199. oldParam = fe1.ParameterName;
  200. newParam = oldParam;
  201. while (usedParameterNames.Contains(newParam))
  202. {
  203. newParam = string.Format("@p{0}", i);
  204. i++;
  205. }
  206. usedParameterNames.Add(newParam);
  207. fe1.ParameterName = newParam;
  208. toChange.CommandText = toChange.CommandText.Replace(oldParam, string.Format("$maP{0}$", j));
  209. replacements.Add(string.Format("$maP{0}$", j), newParam);
  210. j++;
  211. }
  212. foreach (string fe1 in replacements.Keys)
  213. {
  214. toChange.CommandText = toChange.CommandText.Replace(fe1, replacements[fe1]);
  215. }
  216. }
  217. public object[] GetParametersArray(DbCommand paramContainer)
  218. {
  219. return GetParametersArray(new List<DbCommand>() { paramContainer });
  220. }
  221. public object[] GetParametersArray(List<DbCommand> paramContainers)
  222. {
  223. System.Collections.ArrayList r = new System.Collections.ArrayList();
  224. foreach (DbCommand fe1 in paramContainers)
  225. {
  226. r.AddRange((from x1 in fe1.Parameters.Cast<DbParameter>()
  227. select x1.Value).ToList());
  228. }
  229. return r.ToArray();
  230. }
  231. public static string GetSqlEmbededWithParams(DbCommand dbc1)
  232. {
  233. string r = "";
  234. //SQL Parameteres
  235. string sqlTextParams = "";
  236. foreach (DbParameter fe1 in dbc1.Parameters)
  237. {
  238. int fe1_Size = (fe1.Size <= 0) ? 1 : fe1.Size;
  239. string strType = "";
  240. string strValue = "";
  241. switch (fe1.DbType)
  242. {
  243. case System.Data.DbType.AnsiString:
  244. strType = string.Format("varchar({0})", fe1_Size);
  245. strValue = string.Format("'{0}'", fe1.Value);
  246. break;
  247. case System.Data.DbType.AnsiStringFixedLength:
  248. strType = string.Format("char({0})", fe1_Size);
  249. strValue = string.Format("'{0}'", fe1.Value);
  250. break;
  251. case System.Data.DbType.Binary:
  252. break;
  253. case System.Data.DbType.Boolean:
  254. strType = "bit";
  255. strValue = (((bool)fe1.Value) ? 1 : 0).ToString();
  256. break;
  257. case System.Data.DbType.Byte:
  258. break;
  259. case System.Data.DbType.Currency:
  260. break;
  261. case System.Data.DbType.Date:
  262. strType = "date";
  263. strValue = string.Format("'{0}'", ((DateTime)fe1.Value).ToString("yyyy-MM-dd"));
  264. break;
  265. case System.Data.DbType.DateTime:
  266. case System.Data.DbType.DateTime2:
  267. strType = "datetime";
  268. strValue = string.Format("'{0}'", ((DateTime)fe1.Value).ToString("yyyy-MM-ddTHH:mm:ss.fff"));
  269. break;
  270. case System.Data.DbType.DateTimeOffset:
  271. break;
  272. case System.Data.DbType.Decimal:
  273. break;
  274. case System.Data.DbType.Double:
  275. strType = "float";
  276. strValue = fe1.Value.ToString();
  277. break;
  278. case System.Data.DbType.Guid:
  279. break;
  280. case System.Data.DbType.Int16:
  281. break;
  282. case System.Data.DbType.Int32:
  283. strType = "int";
  284. strValue = fe1.Value.ToString();
  285. break;
  286. case System.Data.DbType.Int64:
  287. break;
  288. case System.Data.DbType.Object:
  289. break;
  290. case System.Data.DbType.SByte:
  291. break;
  292. case System.Data.DbType.Single:
  293. break;
  294. case System.Data.DbType.String:
  295. strType = string.Format("nvarchar({0})", fe1_Size);
  296. strValue = string.Format("N'{0}'", fe1.Value);
  297. break;
  298. case System.Data.DbType.StringFixedLength:
  299. strType = string.Format("nchar({0})", fe1_Size);
  300. strValue = string.Format("N'{0}'", fe1.Value);
  301. break;
  302. case System.Data.DbType.Time:
  303. strType = "time";
  304. strValue = string.Format("'{0}'", ((DateTime)fe1.Value).ToString("HH:mm:ss.fff"));
  305. break;
  306. case System.Data.DbType.UInt16:
  307. break;
  308. case System.Data.DbType.UInt32:
  309. break;
  310. case System.Data.DbType.UInt64:
  311. break;
  312. case System.Data.DbType.VarNumeric:
  313. break;
  314. case System.Data.DbType.Xml:
  315. break;
  316. default:
  317. break;
  318. }
  319. if (string.IsNullOrEmpty(strValue))
  320. strValue = "NULL";
  321. if (!string.IsNullOrEmpty(strType))
  322. sqlTextParams += string.Format(",{0} {1}={2}\n\t", fe1.ParameterName, strType, strValue);
  323. }
  324. sqlTextParams = sqlTextParams.Trim(new char[] { ',', '\t' });
  325. sqlTextParams = string.Format("DECLARE \n\t{0};", sqlTextParams);
  326. r = sqlTextParams + "\n" + dbc1.CommandText;
  327. return r;
  328. }
  329. }
  330. }