Guest User

Untitled

a guest
Feb 13th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.52 KB | None | 0 0
  1. using System;
  2.  
  3. namespace RickRoll
  4. {
  5. public class Db
  6. {
  7. public string DataSource { get; }
  8. public string Database { get; }
  9. public string Username { get; }
  10. public string Password { get; }
  11. public string ConnectionString { get; private set; }
  12. public string ExtendedProperties { get; }
  13.  
  14. private WrapColumn wrapcol;
  15. private WrapObject wrapobj;
  16.  
  17. public DataProvider Provider { get; set; }
  18. public DataFileType FileType { get; private set; }
  19. public DataEngine Engine { get; private set; }
  20. public WrapColumn WrapCol { get => wrapcol; private set => wrapcol = value; }
  21. public WrapObject WrapObj { get => wrapobj; private set => wrapobj = value; }
  22.  
  23. public Db()
  24. {
  25. // only used for public enum access
  26. }
  27.  
  28. // For file databases without password set
  29. public Db(string filepath)
  30. {
  31. FileType = GetDbFileType (filepath);
  32. Engine = GetDbEngine (FileType);
  33. Provider = GetDbProvider (FileType);
  34. DataSource = filepath;
  35. Database = Path.GetFileName (filepath);
  36. Username = null;
  37. Password = null;
  38. ConnectionString = GetConnectionString (Provider);
  39. GetWrapCol (Engine);
  40. GetWrapObj (Engine);
  41. }
  42.  
  43. // For file databases with password set
  44. public Db(string filepath, string password)
  45. {
  46. ... (same as first constructor)
  47. }
  48.  
  49. // For server connections using windows auth
  50. public Db(string path, string server , string database)
  51. {
  52. ... (same as first constructor)
  53. }
  54.  
  55. // For all connection types
  56. public Db(string path, string server, string database , string username , string password)
  57. {
  58. ... (same as first constructor)
  59. }
  60.  
  61. public Db(int filetype_value, string server, string database)
  62. {
  63. ... (same as first constructor)
  64. }
  65.  
  66. public Db(int filetype_value, string server, string database, string username , string password)
  67. {
  68. ... (same as first constructor)
  69. }
  70.  
  71. /// <summary>
  72. /// This changes the database connection string to use a different Provider.
  73. /// </summary>
  74. /// <param name="p"></param>
  75. public void ReSetConnectionString(DataProvider p)
  76. {
  77. Provider = p;
  78. ConnectionString = GetConnectionString ( Provider );
  79. }
  80.  
  81. private DataFileType GetDbFileType(string path)
  82. {
  83. DataFileType ft;
  84. string ext;
  85. if (path.Contains ("."))
  86. {
  87. string fpath = path.Replace ("|DataDirectory|" , AppDomain.CurrentDomain.BaseDirectory);
  88. ext = Path.GetExtension (fpath).Replace ("." , "").ToUpper ( );
  89.  
  90. if (Enum.TryParse<DataFileType> (ext , out ft) == true) return ft;
  91. }
  92. else
  93. {
  94. ft = (DataFileType) Enum.Parse (typeof (DataFileType) , path.ToUpper()); /// throw exception if extention is not in DataFileType enum or is null
  95. }
  96. return ft;
  97. }
  98.  
  99. private string GetDataSource(DataEngine e, string path, string server)
  100. {
  101. if (DataSourceIsFile (e)) return path;
  102. return server;
  103. }
  104.  
  105. private DataFileType GetDbFileType(int enumvalue)
  106. {
  107. DataFileType ft = (DataFileType) Enum.Parse (typeof (DataFileType) , enumvalue.ToString ( )); // throws and exception if int isn't in the DataFileType enum.
  108. return ft;
  109. }
  110.  
  111. public enum DataEngine
  112. {
  113. None,
  114. ACCESS = 1, // 0 = not applicable or not determined
  115. MSSQL,
  116. EXCEL,
  117. ORACLE,
  118. MYSQL,
  119. TEXT
  120. }
  121.  
  122. // <summary>
  123. /// These are the int enum values that get stored in the database for each type of data file
  124. /// </summary>
  125. public enum DataFileType
  126. {
  127. None,
  128. MDB = 1, // 0 = not a configured data file
  129. ACCDB,
  130. MDF, // Primary Data FIle
  131. NDF, // File Group (secondary data files)
  132. XLS, // Excel 97-2003 worksheet
  133. XLSX, // Excel 2007 workbook
  134. XLSXM, // Macro enabled workbook
  135. XLTM, // Binary worksheet (BIFF12)
  136. XLW, // Excel works space, previously known as workbook
  137. CSV, // Comma separated values
  138. TAB, // Tab separated values
  139. TSV, // Tab separated values
  140. TXT // Delimited Text file
  141. }
  142.  
  143. /// <summary>
  144. /// These are the int values that get stored in the database for each db connection
  145. /// </summary>
  146. public enum DataProvider
  147. {
  148. None,
  149. Microsoft_ACE_OLEDB_12_0 = 1, // Microsoft.ACE.OLEDB.12.0 - MS OLEDB DataProvider for MDB or ACCDB or EXCEL
  150. Microsoft_ACE_OLEDB, // Microsoft.ACE.OLEDB VersionIndependentProgID
  151. Microsoft_Jet_OLEDB_4_0, // MS Access - Does not work with ACCDB or any SQL Server version
  152. Microsoft_Jet_OLEDB, // Version Independent ProgID
  153. SQLNCLI11, // SQL Server Native Client for OleDb
  154. SQLNCLI, // Version Independent ProgID
  155. SQLOLEDB_1, // SQL Server OleDb - Does not work with SQL Server Express
  156. SQLOLEDB, // VersionIndependentProgID
  157. SQL__Server__Native__Client__11_0, // SQL Server Native Client using ODbC
  158. SQL__Server__Native__Client, // Version Independent ProgID
  159. MSDASQL_1, // Microsoft OleDb Data Access Components using ODbC
  160. MSDASQL // Version Independent ProgID
  161. }
  162.  
  163. private DataEngine GetDbEngine(int enumvalue)
  164. {
  165. DataEngine result = (DataEngine) Enum.Parse (typeof (DataEngine) , enumvalue.ToString ( )); // throws and exception if int isn't in the DataEngine enum.
  166. return result;
  167. }
  168.  
  169. private DataEngine GetDbEngine(DataFileType ft)
  170. {
  171. switch (ft)
  172. {
  173. case DataFileType.MDB:
  174. return DataEngine.ACCESS;
  175. case DataFileType.ACCDB:
  176. return DataEngine.ACCESS;
  177. case DataFileType.MDF:
  178. return DataEngine.MSSQL;
  179. case DataFileType.NDF:
  180. return DataEngine.MSSQL;
  181. case DataFileType.XLS:
  182. return DataEngine.EXCEL;
  183. case DataFileType.XLSX:
  184. return DataEngine.EXCEL;
  185. case DataFileType.CSV:
  186. return DataEngine.TEXT;
  187. case DataFileType.TAB:
  188. return DataEngine.TEXT;
  189. case DataFileType.TSV:
  190. return DataEngine.TEXT;
  191. case DataFileType.TXT:
  192. return DataEngine.TEXT;
  193. default:
  194. throw new ArgumentException ($"* * * DataFileType is not a supported data file format. Database DataEngine could not be determined.");
  195. }
  196. }
  197.  
  198. private DataProvider GetDbProvider(DataFileType ft)
  199. {
  200. switch (ft)
  201. {
  202. case DataFileType.MDB:
  203. case DataFileType.ACCDB:
  204. return DataProvider.Microsoft_ACE_OLEDB_12_0;
  205. case DataFileType.MDF:
  206. return DataProvider.SQLNCLI11; // SQLOLEDB_1 and SQLOLEDB did not work with SQL Server Express
  207. case DataFileType.NDF:
  208. return DataProvider.SQLNCLI11;
  209. case DataFileType.XLS:
  210. case DataFileType.XLSX:
  211. case DataFileType.CSV:
  212. case DataFileType.TAB:
  213. case DataFileType.TSV:
  214. case DataFileType.TXT:
  215. return DataProvider.Microsoft_ACE_OLEDB_12_0;
  216. default:
  217. throw new ArgumentException ($"* * * DataFileType is not a supported data file format. Database DataProvider could not be determined.");
  218. }
  219. }
  220.  
  221. private void GetWrapCol(DataEngine e)
  222. {
  223. switch (e)
  224. {
  225. case DataEngine.ACCESS:
  226. WrapCol = new WrapColumn { left = "`" , middle = "`,`" , right = "`" };
  227. break;
  228. case DataEngine.MSSQL:
  229. WrapCol = new WrapColumn { left = "[" , middle = "],[" , right = "]" };
  230. break;
  231. case DataEngine.EXCEL:
  232. WrapCol = new WrapColumn { left = "`" , middle = "`,`" , right = "`" };
  233. break;
  234. case DataEngine.ORACLE:
  235. WrapCol = new WrapColumn { left = @"""" , middle = @""",""" , right = @"""" };
  236. break;
  237. case DataEngine.MYSQL:
  238. WrapCol = new WrapColumn { left = "`" , middle = "`,`" , right = "`" }; // might be brackets for sysnames and ` for columns
  239. break;
  240. case DataEngine.TEXT:
  241. WrapCol = new WrapColumn { left = @"""" , middle = @""",""" , right = @"""" }; // not sure how to handle this yet
  242. break;
  243. default:
  244. throw new ArgumentException ($"* * * DataEngine was not valid. Could not determine a COLUMN escape character.");
  245. }
  246. }
  247.  
  248. private void GetWrapObj(DataEngine e)
  249. {
  250. switch (e)
  251. {
  252. case DataEngine.ACCESS:
  253. WrapObj = new WrapObject { left = "`" , middle = "`,`" , right = "`" };
  254. break;
  255. case DataEngine.MSSQL:
  256. WrapObj = new WrapObject { left = "[" , middle = "],[" , right = "]" };
  257. break;
  258. case DataEngine.EXCEL:
  259. WrapObj = new WrapObject { left = "`" , middle = "`,`" , right = "`" };
  260. break;
  261. case DataEngine.ORACLE:
  262. WrapObj = new WrapObject { left = @"""" , middle = @""",""" , right = @"""" };
  263. break;
  264. case DataEngine.MYSQL:
  265. WrapObj = new WrapObject { left = "[" , middle = "],[" , right = "]" }; // might be brackets for sysnames and ` for columns
  266. break;
  267. case DataEngine.TEXT:
  268. WrapObj = new WrapObject { left = @"""" , middle = @""",""" , right = @"""" }; // not sure how to handle this yet
  269. break;
  270. default:
  271. throw new ArgumentException ($"* * * DataEngine was not valid. Could not determine a OBJECT escape character.");
  272. }
  273. }
  274.  
  275. private bool DataSourceIsFile(DataEngine e)
  276. {
  277. switch (e)
  278. {
  279. case DataEngine.ACCESS:
  280. return true;
  281. case DataEngine.MSSQL:
  282. return false;
  283. case DataEngine.EXCEL:
  284. return true;
  285. case DataEngine.ORACLE:
  286. return false;
  287. case DataEngine.MYSQL:
  288. return false;
  289. case DataEngine.TEXT:
  290. return true;
  291. default:
  292. throw new ArgumentException ($"* * * DataEngine was not valid. Could not determine if this is a file or server DataSource.");
  293. }
  294. }
  295.  
  296.  
  297.  
  298. //https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-string-syntax?view=netframework-4.7.1
  299. private string GetConnectionString(DataProvider Provider)
  300. {
  301. string ProgId = Provider.ToString ( ).Replace ("_" , ".");
  302. string result = "";
  303. switch (Provider)
  304. {
  305. case DataProvider.Microsoft_ACE_OLEDB_12_0: // Microsoft MS OLEDB for MDB or ACCDB or EXCEL
  306. case DataProvider.Microsoft_ACE_OLEDB: // VersionIndependentProgID
  307. return $@"Provider={ProgId};Data Source={DataSource};Persist Security Info=False;Jet OLEDB:Database Password={Password.EmptyIfNull ( )};";
  308.  
  309. case DataProvider.Microsoft_Jet_OLEDB_4_0: // MS Access Jet OLEDB - Does not work with ACCDB or any SQL Server version
  310. case DataProvider.Microsoft_Jet_OLEDB: // VersionIndependentProgID
  311. // Jet db with user-lvel security requires a Workgroup information file designation:
  312. // Jet OLEDB:System Database=|DataDirectory|System.mdw;" <--- that could be stored in the Server field
  313. // Jet user-level security uses the User ID and Password setting. A new constructer that includes the Username field will need to be added to support this
  314. if (Engine == DataEngine.ACCESS && Password.NullIfEmpty() == null)
  315. return $@"Provider={ProgId};Data Source={DataSource};User ID=Admin;Password=;";
  316. else
  317. return $@"Provider={ProgId};Data Source={DataSource};Persist Security Info=False;Jet OLEDB:Database Password={Password.EmptyIfNull ( )};";
  318.  
  319.  
  320. case DataProvider.SQLNCLI11: // SQL Server OleDb Native Client
  321. case DataProvider.SQLNCLI: // VersionIndependentProgID
  322. result = $@"Provider={ProgId};Server={DataSource};Database={Database};";
  323. if (Password != null) result += $"Uid={Username.EmptyIfNull ( )};Pwd={Password.EmptyIfNull ( )};";
  324. if (Password == null) result += "Integrated Security=SSPI;";
  325. return result;
  326.  
  327. case DataProvider.SQLOLEDB_1: // Microsoft OLE DB DataProvider for SQL Server (I've seen this work for ACCESS also) - DID NOT work for SQL Server 2016 Express, but DID work for SQL Server 2016 Developer Edition
  328. case DataProvider.SQLOLEDB: // VersionIndependentProgID
  329. result = $@"Provider={ProgId};Data Source={DataSource};Initial Catalog={Database};";
  330. if (Password != null) result += $"User Id={Username.EmptyIfNull()};Password={Password.EmptyIfNull ( )};";
  331. if (Password == null) result += "Integrated Security=SSPI;";
  332. return result;
  333.  
  334. case DataProvider.MSDASQL_1: // Microsoft Data Access OleDb using ODbC
  335. case DataProvider.MSDASQL: // VersionIndependentProgID
  336. if (Engine == DataEngine.ACCESS)
  337. return $@"Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};DbQ={DataSource}";
  338. if (Engine == DataEngine.EXCEL)
  339. return $@"Driver={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DbQ={DataSource}";
  340. if (Engine == DataEngine.MSSQL)
  341. if (string.IsNullOrEmpty (Username))
  342. return $@"[DataProvider = MSDASQL;] DRIVER={{SQL Server}}; SERVER={DataSource}; DATABASE={Database};UID=;Integrated Security=SSPI";
  343. else
  344. return $@"[DataProvider = MSDASQL;] DRIVER={{SQL Server}}; SERVER={DataSource}; DATABASE={Database};UID={Username};PWD={Password}";
  345. else
  346. throw new ArgumentException ($" * * * The MSDASQL Provider has only been set up for MS Access or Excel or MSSQL connections. Could not create Connection String");
  347.  
  348.  
  349. case DataProvider.SQL__Server__Native__Client__11_0: // SQl Server OleDb using ODbC
  350. if (Engine == DataEngine.MSSQL && (Username.NullIfEmpty ( ) != null))
  351. return $@"Driver={{{ProgId}}};Server={DataSource};Database={Database};Uid={Username};Pwd={Password};";
  352. else
  353. return $@"Driver={{{ProgId}}};Server={DataSource};Database={Database};Trusted_Connection=yes;";
  354.  
  355. default:
  356. throw new ArgumentException ($" * * * DataProvider is not valid. Could not create Connection String");
  357. }
  358. }
  359.  
  360. public string Columns(string value)
  361. {
  362. string[ ] c = value.Split (','); // if col names have "," in them, maybe replace it with another char and modify this method to replace it back.
  363. return $"{WrapCol.left}{string.Join(WrapCol.middle , c)}{WrapCol.right}";
  364. }
  365.  
  366.  
  367.  
  368. }
  369.  
  370.  
  371. public static class StringExt
  372. {
  373. public static string NullIfEmpty(this string value)
  374. {
  375. return string.IsNullOrEmpty (value) ? null : value;
  376. }
  377.  
  378. public static string EmptyIfNull(this string value)
  379. {
  380. if (string.IsNullOrEmpty (value))
  381. return string.Empty;
  382. else
  383. return value;
  384. }
  385.  
  386. }
  387. }
Add Comment
Please, Sign In to add comment