0
|
1 using System;
|
|
2 using System.Data;
|
|
3 using System.Diagnostics;
|
|
4 using System.Globalization;
|
|
5 using System.Text.RegularExpressions;
|
|
6
|
|
7 namespace BLToolkit.Data.DataProvider
|
|
8 {
|
|
9 public static class OracleHelper
|
|
10 {
|
|
11 #region Text
|
|
12
|
|
13 /// <summary>
|
|
14 /// If value is null or empty, return NULL or the value converted for Oracle SQL query
|
|
15 /// </summary>
|
|
16 /// <param name="value">Text</param>
|
|
17 /// <returns>Text converted for oracle query</returns>
|
|
18 public static string SqlConvertString(string value)
|
|
19 {
|
|
20 if (!string.IsNullOrEmpty(value))
|
|
21 {
|
|
22 value = value.Replace("'", "''");
|
|
23 value = value.Replace("&", "' || '&' || '");
|
|
24
|
|
25 return "'" + value + "'";
|
|
26 }
|
|
27
|
|
28 return string.IsNullOrWhiteSpace(value) ? "NULL" : value;
|
|
29 }
|
|
30
|
|
31 #endregion
|
|
32
|
|
33 #region Date & Time
|
|
34
|
|
35 /// <summary>
|
|
36 /// Convert DateTime to TO_DATE('value','YYYYMMDD')
|
|
37 /// </summary>
|
|
38 /// <param name="value">Date</param>
|
|
39 /// <returns>Date converted for oracle query</returns>
|
|
40 public static string SqlConvertDate(DateTime value)
|
|
41 {
|
|
42 return string.Format("TO_DATE('{0}','YYYYMMDD')", value.ToString("yyyyMMdd"));
|
|
43 }
|
|
44
|
|
45 /// <summary>
|
|
46 /// Convert DateTime to TO_DATE('value','YYYYMMDDHH24MISS')
|
|
47 /// </summary>
|
|
48 /// <param name="value">DateTime</param>
|
|
49 /// <returns>DateTime converted for oracle query</returns>
|
|
50 public static string SqlConvertDateTime(DateTime value)
|
|
51 {
|
|
52 return string.Format("TO_DATE('{0}','YYYYMMDDHH24MISS')", value.ToString("yyyyMMddHHmmss"));
|
|
53 }
|
|
54
|
|
55 /// <summary>
|
|
56 /// Convert DateTime to TO_TIMESTAMP('value','YYYYMMDDHH24MISSFF3')
|
|
57 /// </summary>
|
|
58 /// <param name="value">DateTime</param>
|
|
59 /// <returns>DateTime converted for oracle query</returns>
|
|
60 public static string SqlConvertTimeStamp(DateTime value)
|
|
61 {
|
|
62 return string.Format("TO_TIMESTAMP('{0}','YYYYMMDDHH24MISSFF3')", value.ToString("yyyyMMddHHmmssfff"));
|
|
63 }
|
|
64
|
|
65 /// <summary>
|
|
66 /// Convert DateTime to TO_CHAR(TO_DATE('value','YYYYMMDD')))
|
|
67 /// </summary>
|
|
68 /// <param name="value">DateTime</param>
|
|
69 /// <returns>DateTime converted for oracle query</returns>
|
|
70 public static string SqlConvertDateToChar(DateTime value)
|
|
71 {
|
|
72 return string.Format("TO_CHAR(TO_DATE('{0}','YYYYMMDD'))", value.ToString("yyyyMMdd"));
|
|
73 }
|
|
74
|
|
75 #endregion
|
|
76
|
|
77 #region Connection string
|
|
78
|
|
79 /// <summary>
|
|
80 /// Generate the minimum connection string. The connection string looks like
|
|
81 /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;
|
|
82 /// </summary>
|
|
83 /// <param name="userName">Username</param>
|
|
84 /// <param name="password">Password</param>
|
|
85 /// <param name="server">Server name</param>
|
|
86 /// <param name="sid">Database SID</param>
|
|
87 /// <param name="port">Port of the server. Default value is 1521</param>
|
|
88 /// <returns>Default connection string</returns>
|
|
89 public static string GetFullConnectionString(string userName, string password, string server, string sid, int port = 1521)
|
|
90 {
|
|
91 return
|
|
92 string.Format(
|
|
93 "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};",
|
|
94 server, port, sid, userName, password);
|
|
95 }
|
|
96
|
|
97 /// <summary>
|
|
98 /// Generate the minimum connection string. The connection string looks like
|
|
99 /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Pooling=False;
|
|
100 /// </summary>
|
|
101 /// <param name="userName">Username</param>
|
|
102 /// <param name="password">Password</param>
|
|
103 /// <param name="server">Server name</param>
|
|
104 /// <param name="sid">Database SID</param>
|
|
105 /// <param name="port">Port of the server. Default value is 1521</param>
|
|
106 /// <returns>Default connection string</returns>
|
|
107 public static string GetFullConnectionStringWithoutPooling(string userName, string password, string server, string sid, int port = 1521)
|
|
108 {
|
|
109 return
|
|
110 string.Format(
|
|
111 "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};Pooling=False;",
|
|
112 server, port, sid, userName, password);
|
|
113 }
|
|
114
|
|
115 /// <summary>
|
|
116 /// Generate the minimum connection string. The connection string looks like
|
|
117 /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Connection Timeout=timeout;
|
|
118 /// </summary>
|
|
119 /// <param name="userName">Username</param>
|
|
120 /// <param name="password">Password</param>
|
|
121 /// <param name="server">Server name</param>
|
|
122 /// <param name="sid">Database SID</param>
|
|
123 /// <param name="port">Port of the server. Default value is 1521</param>
|
|
124 /// <returns>Default connection string</returns>
|
|
125 public static string GetFullConnectionString(string userName, string password, string server, string sid,
|
|
126 TimeSpan timeOut, int port = 1521)
|
|
127 {
|
|
128 return
|
|
129 string.Format(
|
|
130 "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};Connection Timeout={5};",
|
|
131 server, port, sid, userName, password, (int)timeOut.TotalSeconds);
|
|
132 }
|
|
133
|
|
134 /// <summary>
|
|
135 /// Generate the minimum connection string. The connection string looks like
|
|
136 /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Connection Timeout=timeout;Pooling=False;
|
|
137 /// </summary>
|
|
138 /// <param name="userName">Username</param>
|
|
139 /// <param name="password">Password</param>
|
|
140 /// <param name="server">Server name</param>
|
|
141 /// <param name="sid">Database SID</param>
|
|
142 /// <param name="port">Port of the server. Default value is 1521</param>
|
|
143 /// <returns>Default connection string</returns>
|
|
144 public static string GetFullConnectionStringWithoutPooling(string userName, string password, string server, string sid,
|
|
145 TimeSpan timeOut, int port = 1521)
|
|
146 {
|
|
147 return
|
|
148 string.Format(
|
|
149 "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};Connection Timeout={5};Pooling=False;",
|
|
150 server, port, sid, userName, password, (int)timeOut.TotalSeconds);
|
|
151 }
|
|
152
|
|
153 /// <summary>
|
|
154 /// Generate the minimum connection string. The connection string looks like
|
|
155 /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Connection Timeout=timeout;
|
|
156 /// </summary>
|
|
157 /// <param name="userName">Username</param>
|
|
158 /// <param name="password">Password</param>
|
|
159 /// <param name="server">Server name</param>
|
|
160 /// <param name="sid">Database SID</param>
|
|
161 /// <param name="port">Port of the server. Default value is 1521</param>
|
|
162 /// <returns>Default connection string</returns>
|
|
163 public static string GetFullConnectionString(string userName, string password, string server, string sid, int timeOutInSecond, int port = 1521)
|
|
164 {
|
|
165 return GetFullConnectionString(userName, password, server, sid, TimeSpan.FromSeconds(timeOutInSecond), port);
|
|
166 }
|
|
167
|
|
168 #endregion
|
|
169
|
|
170 public static string Interpret(IDbCommand poCommand)
|
|
171 {
|
|
172 if (poCommand.Parameters.Count == 0)
|
|
173 return poCommand.CommandText;
|
|
174
|
|
175 var oRegex = new Regex(@"(?<string>'[^']+')|(?<Parameters>:[a-zA-Z0-9_]+)");
|
|
176 MatchCollection oMatchCollection = oRegex.Matches(poCommand.CommandText);
|
|
177
|
|
178 string strQuery = poCommand.CommandText + " ";
|
|
179 int matchCount = 0;
|
|
180
|
|
181 for (int i = 0; i < oMatchCollection.Count; i++)
|
|
182 {
|
|
183 if (oMatchCollection[i].Groups["string"].Success)
|
|
184 continue;
|
|
185
|
|
186 string strParameter = oMatchCollection[i].Groups["Parameters"].Captures[0].Value;
|
|
187
|
|
188 var param = (IDbDataParameter)poCommand.Parameters[matchCount];
|
|
189 if (param.Value is DateTime)
|
|
190 {
|
|
191 var dt = (DateTime)param.Value;
|
|
192
|
|
193 strQuery = strQuery.Replace(strParameter + " ",
|
|
194 dt.Date == dt
|
|
195 ? SqlConvertDate(dt) + " "
|
|
196 : SqlConvertDateTime(dt) + " ");
|
|
197 }
|
|
198 else if (param.Value is string)
|
|
199 strQuery = strQuery.Replace(strParameter, SqlConvertString(param.Value.ToString()) + " ");
|
|
200 else if (param.Value is Int16)
|
|
201 strQuery = strQuery.Replace(strParameter, ((Int16)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
|
|
202 else if (param.Value is Int32)
|
|
203 strQuery = strQuery.Replace(strParameter, ((Int32)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
|
|
204 else if (param.Value is Int64)
|
|
205 strQuery = strQuery.Replace(strParameter, ((Int64)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
|
|
206 else if (param.Value is decimal)
|
|
207 strQuery = strQuery.Replace(strParameter, ((decimal)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
|
|
208 else if (param.Value is float)
|
|
209 strQuery = strQuery.Replace(strParameter, ((float)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
|
|
210 else if (param.Value is double)
|
|
211 strQuery = strQuery.Replace(strParameter, ((double)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
|
|
212 else if (param.Value is TimeSpan)
|
|
213 strQuery = strQuery.Replace(strParameter, "'" + ((TimeSpan)param.Value).ToString() + "' ");
|
|
214 else
|
|
215 throw new NotImplementedException(param.Value.GetType() + " is not implemented yet.");
|
|
216
|
|
217 matchCount++;
|
|
218 }
|
|
219
|
|
220 if (matchCount != poCommand.Parameters.Count)
|
|
221 {
|
|
222 // ReSharper disable InvocationIsSkipped
|
|
223 Debug.WriteLine(
|
|
224 "Number of parameters in query is not equals to number of parameters set in the command object " +
|
|
225 poCommand.CommandText);
|
|
226 // ReSharper restore InvocationIsSkipped
|
|
227 var msg =
|
|
228 "Number of parameters in query is not equals to number of parameters set in the command object : " + poCommand.CommandText + "\r\n" +
|
|
229 "Query params :\r\n";
|
|
230
|
|
231 foreach (Match match in oMatchCollection)
|
|
232 {
|
|
233 msg += "\t" + match.Value + "\r\n";
|
|
234 }
|
|
235
|
|
236 msg += "\nCommand params :\r\n";
|
|
237
|
|
238 foreach (IDataParameter param in poCommand.Parameters)
|
|
239 {
|
|
240 msg += "\t" + param.ParameterName + " = " + Convert.ToString(param) + "\r\n";
|
|
241 }
|
|
242
|
|
243 throw new Exception(msg);
|
|
244 }
|
|
245
|
|
246 return strQuery;
|
|
247 }
|
|
248
|
|
249 }
|
|
250 } |