Datei: NDODLL/SqlDumper.cs
Last Commit (7e08240)
1 | // |
2 | // Copyright (c) 2002-2023 Mirko Matytschak |
3 | // (www.netdataobjects.de) |
4 | // |
5 | // Author: Mirko Matytschak |
6 | // |
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated |
8 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation |
9 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the |
10 | // Software, and to permit persons to whom the Software is furnished to do so, subject to the following |
11 | // conditions: |
12 | |
13 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions |
14 | // of the Software. |
15 | // |
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
17 | // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
18 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF |
19 | // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. |
21 | |
22 | |
23 | using System.IO; |
24 | using System.Data; |
25 | using NDOInterfaces; |
26 | using Microsoft.Extensions.Logging; |
27 | |
28 | namespace NDO |
29 | { |
30 | ····/// <summary> |
31 | ····/// Zusammenfassung für SqlDumper. |
32 | ····/// </summary> |
33 | ····internal class SqlDumper |
34 | ····{ |
35 | ········ILogger logger; |
36 | ········IDbCommand insertCommand; |
37 | ········IDbCommand selectCommand; |
38 | ········IDbCommand updateCommand; |
39 | ········IDbCommand deleteCommand; |
40 | ········IProvider provider; |
41 | |
42 | ········public SqlDumper(ILoggerFactory loggerFactopry, IProvider provider, IDbCommand insertCommand, IDbCommand selectCommand, IDbCommand updateCommand, IDbCommand deleteCommand) |
43 | ········{ |
44 | ············this.logger = loggerFactopry.CreateLogger<SqlDumper>(); |
45 | ············this.provider = provider; |
46 | ············this.updateCommand = updateCommand; |
47 | ············this.insertCommand = insertCommand; |
48 | ············this.selectCommand = selectCommand; |
49 | ············this.deleteCommand = deleteCommand; |
50 | ········} |
51 | |
52 | ········internal void Dump(DataRow[] rows) |
53 | ········{ |
54 | ············if (logger == null) |
55 | ················return; |
56 | |
57 | ············bool hasSelect = false; |
58 | ············bool hasInsert = false; |
59 | ············bool hasDelete = false; |
60 | ············bool hasUpdate = false; |
61 | |
62 | ············if (rows == null || rows.Length == 0) |
63 | ············{ |
64 | ················hasSelect = true; |
65 | ············} |
66 | ············else |
67 | ············{ |
68 | ················for (int i = 0; i < rows.Length; i++) |
69 | ················{ |
70 | ····················DataRow row = rows[i]; |
71 | ····················if (row.RowState == System.Data.DataRowState.Added) |
72 | ························hasInsert = true; |
73 | ····················if (row.RowState == System.Data.DataRowState.Modified) |
74 | ························hasUpdate = true; |
75 | ····················if (row.RowState == System.Data.DataRowState.Deleted) |
76 | ························hasDelete = true; |
77 | ················} |
78 | ············} |
79 | |
80 | ············StringWriter sw = null; |
81 | |
82 | ············try |
83 | ············{ |
84 | ················sw = new StringWriter(); |
85 | ················if (hasSelect) |
86 | ················{ |
87 | ····················sw.WriteLine("Select Command:"); |
88 | ····················sw.WriteLine(this.selectCommand.CommandText); |
89 | ····················DumpParameters(selectCommand, sw); |
90 | ················} |
91 | |
92 | ················if (hasInsert) |
93 | ················{ |
94 | ····················sw.WriteLine("Insert Command:"); |
95 | ····················sw.WriteLine(this.insertCommand.CommandText); |
96 | ····················DumpParameters(insertCommand, sw);············ |
97 | ················} |
98 | ················if (hasDelete) |
99 | ················{ |
100 | ····················sw.WriteLine("Delete Command:"); |
101 | ····················sw.WriteLine(this.deleteCommand.CommandText); |
102 | ····················DumpParameters(deleteCommand, sw); |
103 | ····················sw.WriteLine(rows.Length.ToString() + " Zeilen zu löschen"); |
104 | ················} |
105 | ················if (hasUpdate) |
106 | ················{ |
107 | ····················if (updateCommand != null) |
108 | ····················{ |
109 | ························sw.WriteLine("Update Command:"); |
110 | ························sw.WriteLine(this.updateCommand.CommandText); |
111 | ························DumpParameters(updateCommand, sw); |
112 | ····················} |
113 | ····················else |
114 | ························sw.WriteLine("No Update Command"); |
115 | ················} |
116 | ············ |
117 | ················if (rows != null) |
118 | ················{ |
119 | ····················for (int i = 0; i < rows.Length; i++) |
120 | ····················{ |
121 | ························DataRow r = rows[i]; |
122 | ························sw.WriteLine("----"); |
123 | ························sw.WriteLine("Row: " + r.RowState.ToString()); |
124 | ························DataRowVersion drv = r.RowState == DataRowState.Deleted ? DataRowVersion.Original : DataRowVersion.Current; |
125 | ························foreach (DataColumn c in r.Table.Columns) |
126 | ························{ |
127 | ····························sw.WriteLine(c.ColumnName + " = " + r[c, drv].ToString()); |
128 | ························} |
129 | ····················} |
130 | ················ |
131 | ················} |
132 | ············} |
133 | ············finally |
134 | ············{ |
135 | ················if (sw != null) |
136 | ················{···················· |
137 | ····················sw.Close(); |
138 | ····················this.logger.LogDebug( sw.ToString() ); |
139 | ················} |
140 | ············} |
141 | ········} |
142 | |
143 | ········private void DumpParameters(IDbCommand cmd, TextWriter sw) |
144 | ········{ |
145 | ············int j = 1; |
146 | ············foreach(IDbDataParameter dp in cmd.Parameters) |
147 | ············{ |
148 | ················string parType = provider.GetDbTypeString(dp); |
149 | ················sw.Write($"Parameter {j}: {dp.ToString()}({parType}) Source Column: {dp.SourceColumn} "); |
150 | ················sw.Write($"Prec: {dp.Precision} Scale: {dp.Scale} Size: {dp.Size}"); |
151 | ················if (dp.Value != null) |
152 | ····················sw.WriteLine(" Value: " + dp.Value); |
153 | ················else |
154 | ····················sw.WriteLine(); |
155 | |
156 | ················j++; |
157 | ············} |
158 | ········} |
159 | ····} |
160 | } |
161 |
New Commit (0a71280)
1 | // |
2 | // Copyright (c) 2002-2023 Mirko Matytschak |
3 | // (www.netdataobjects.de) |
4 | // |
5 | // Author: Mirko Matytschak |
6 | // |
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated |
8 | // documentation files (the "Software"), to deal in the Software without restriction, including without limitation |
9 | // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the |
10 | // Software, and to permit persons to whom the Software is furnished to do so, subject to the following |
11 | // conditions: |
12 | |
13 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions |
14 | // of the Software. |
15 | // |
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
17 | // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
18 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF |
19 | // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. |
21 | |
22 | |
23 | using System.IO; |
24 | using System.Data; |
25 | using NDOInterfaces; |
26 | using Microsoft.Extensions.Logging; |
27 | |
28 | namespace NDO |
29 | { |
30 | ····/// <summary> |
31 | ····/// Zusammenfassung für SqlDumper. |
32 | ····/// </summary> |
33 | ····internal class SqlDumper |
34 | ····{ |
35 | ········ILogger logger; |
36 | ········IDbCommand insertCommand; |
37 | ········IDbCommand selectCommand; |
38 | ········IDbCommand updateCommand; |
39 | ········IDbCommand deleteCommand; |
40 | ········IProvider provider; |
41 | |
42 | ········public SqlDumper(ILoggerFactory loggerFactopry, IProvider provider, IDbCommand insertCommand, IDbCommand selectCommand, IDbCommand updateCommand, IDbCommand deleteCommand) |
43 | ········{ |
44 | ············this.logger = loggerFactopry.CreateLogger<SqlDumper>(); |
45 | ············this.provider = provider; |
46 | ············this.updateCommand = updateCommand; |
47 | ············this.insertCommand = insertCommand; |
48 | ············this.selectCommand = selectCommand; |
49 | ············this.deleteCommand = deleteCommand; |
50 | ········} |
51 | |
52 | ········internal void Dump(DataRow[] rows) |
53 | ········{ |
54 | ············if (logger == null) |
55 | ················return; |
56 | |
57 | ············bool hasSelect = false; |
58 | ············bool hasInsert = false; |
59 | ············bool hasDelete = false; |
60 | ············bool hasUpdate = false; |
61 | |
62 | ············if (rows == null || rows.Length == 0) |
63 | ············{ |
64 | ················hasSelect = true; |
65 | ············} |
66 | ············else |
67 | ············{ |
68 | ················for (int i = 0; i < rows.Length; i++) |
69 | ················{ |
70 | ····················DataRow row = rows[i]; |
71 | ····················if (row.RowState == System.Data.DataRowState.Added) |
72 | ························hasInsert = true; |
73 | ····················if (row.RowState == System.Data.DataRowState.Modified) |
74 | ························hasUpdate = true; |
75 | ····················if (row.RowState == System.Data.DataRowState.Deleted) |
76 | ························hasDelete = true; |
77 | ················} |
78 | ············} |
79 | |
80 | ············StringWriter sw = null; |
81 | |
82 | ············try |
83 | ············{ |
84 | ················sw = new StringWriter(); |
85 | ················if (hasSelect) |
86 | ················{ |
87 | ····················sw.WriteLine("Select Command:"); |
88 | ····················sw.WriteLine(this.selectCommand.CommandText); |
89 | ····················DumpParameters(selectCommand, sw); |
90 | ················} |
91 | |
92 | ················if (hasInsert) |
93 | ················{ |
94 | ····················sw.WriteLine("Insert Command:"); |
95 | ····················sw.WriteLine(this.insertCommand.CommandText); |
96 | ····················DumpParameters(insertCommand, sw);············ |
97 | ················} |
98 | ················if (hasDelete) |
99 | ················{ |
100 | ····················sw.WriteLine("Delete Command:"); |
101 | ····················sw.WriteLine(this.deleteCommand.CommandText); |
102 | ····················DumpParameters(deleteCommand, sw); |
103 | ····················sw.WriteLine(rows.Length.ToString() + " Zeilen zu löschen"); |
104 | ················} |
105 | ················if (hasUpdate) |
106 | ················{ |
107 | ····················if (updateCommand != null) |
108 | ····················{ |
109 | ························sw.WriteLine("Update Command:"); |
110 | ························sw.WriteLine(this.updateCommand.CommandText); |
111 | ························DumpParameters(updateCommand, sw); |
112 | ····················} |
113 | ····················else |
114 | ························sw.WriteLine("No Update Command"); |
115 | ················} |
116 | ············ |
117 | ················if (rows != null) |
118 | ················{ |
119 | ····················for (int i = 0; i < rows.Length; i++) |
120 | ····················{ |
121 | ························DataRow r = rows[i]; |
122 | ························sw.WriteLine("----"); |
123 | ························sw.WriteLine("Row: " + r.RowState.ToString()); |
124 | ························DataRowVersion drv = r.RowState == DataRowState.Deleted ? DataRowVersion.Original : DataRowVersion.Current; |
125 | ························foreach (DataColumn c in r.Table.Columns) |
126 | ························{ |
127 | ····························sw.WriteLine(c.ColumnName + " = " + r[c, drv].ToString()); |
128 | ························} |
129 | ····················} |
130 | ················ |
131 | ················} |
132 | ············} |
133 | ············finally |
134 | ············{ |
135 | ················if (sw != null) |
136 | ················{···················· |
137 | ····················sw.Close(); |
138 | ····················if (this.logger != null && this.logger.IsEnabled( LogLevel.Debug )) |
139 | ························this.logger.LogDebug( sw.ToString() ); |
140 | ················} |
141 | ············} |
142 | ········} |
143 | |
144 | ········private void DumpParameters(IDbCommand cmd, TextWriter sw) |
145 | ········{ |
146 | ············int j = 1; |
147 | ············foreach(IDbDataParameter dp in cmd.Parameters) |
148 | ············{ |
149 | ················string parType = provider.GetDbTypeString(dp); |
150 | ················sw.Write($"Parameter {j}: {dp.ToString()}({parType}) Source Column: {dp.SourceColumn} "); |
151 | ················sw.Write($"Prec: {dp.Precision} Scale: {dp.Scale} Size: {dp.Size}"); |
152 | ················if (dp.Value != null) |
153 | ····················sw.WriteLine(" Value: " + dp.Value); |
154 | ················else |
155 | ····················sw.WriteLine(); |
156 | |
157 | ················j++; |
158 | ············} |
159 | ········} |
160 | ····} |
161 | } |
162 |