Guest User

Untitled

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