-
Notifications
You must be signed in to change notification settings - Fork 0
/
SqlTypeMeta.cs
258 lines (222 loc) · 7.04 KB
/
SqlTypeMeta.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
using System;
using System.Data;
using System.Globalization;
using System.Text;
namespace CopyDb
{
internal sealed class SqlTypeMeta
{
private SqlTypeMeta () {}
public delegate string LiteralFormatter (object value);
private static readonly LiteralFormatter[] _formatters =
{
//BigInt
new LiteralFormatter(BigIntegerFormatter),
//Binary
new LiteralFormatter(BinaryFormatter),
//Bit
new LiteralFormatter(BooleanFormatter),
//Char
new LiteralFormatter(AnsiStringFormatter),
//DateTime
new LiteralFormatter(DateTimeFormatter),
//Decimal
new LiteralFormatter(RealFormatter),
//Float
new LiteralFormatter(RealFormatter),
//Image
new LiteralFormatter(BinaryFormatter),
//Int
new LiteralFormatter(IntegerFormatter),
//Money
new LiteralFormatter(RealFormatter),
//NChar
new LiteralFormatter(UnicodeStringFormatter),
//NText
new LiteralFormatter(UnicodeStringFormatter),
//NVarChar
new LiteralFormatter(UnicodeStringFormatter),
//Real
new LiteralFormatter(RealFormatter),
//UniqueIdentifier
new LiteralFormatter(GuidFormatter),
//SmallDateTime
new LiteralFormatter(DateTimeFormatter),
//SmallInt
new LiteralFormatter(IntegerFormatter),
//SmallMoney
new LiteralFormatter(RealFormatter),
//Text
new LiteralFormatter(AnsiStringFormatter),
//Timestamp
new LiteralFormatter(BinaryFormatter),
//TinyInt
new LiteralFormatter(IntegerFormatter),
//VarBinary
new LiteralFormatter(BinaryFormatter),
//VarChar
new LiteralFormatter(AnsiStringFormatter),
//Variant
new LiteralFormatter(VariantFormatter),
};
#region Formatters
private static string AnsiStringFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatAnsiString(value.ToString());
}
private static string UnicodeStringFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatUnicodeString(value.ToString());
}
private static string BooleanFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatBoolean((bool) value);
}
private static string DateTimeFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatDateTime((DateTime) value);
}
private static string BinaryFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatBinary((byte[]) value);
}
private static string GuidFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatGuid((Guid) value);
}
private static string IntegerFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatInteger((IFormattable) value);
}
private static string BigIntegerFormatter (object value)
{
if (value == DBNull.Value) return "null";
if (value is long)
return FormatBigInteger((long) value);
if (value is ulong)
return FormatBigInteger((ulong) value);
return FormatBigInteger((IFormattable) value);
}
private static string RealFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatReal((IFormattable) value);
}
private static string VariantFormatter (object value)
{
if (value == DBNull.Value) return "null";
return FormatVariant(value);
}
#endregion
#region Format Functions
public static string FormatAnsiString (string value)
{
return "'" + value.Replace("'", "''") + "'";
}
public static string FormatUnicodeString (string value)
{
return "N'" + value.Replace("'", "''") + "'";
}
public static string FormatBoolean (bool value)
{
return (value)? "1": "0";
}
public static string FormatDateTime (DateTime value)
{
return "'" + value.ToString("yyyy-MM-ddTHH:mm:ss.fff", DateTimeFormatInfo.InvariantInfo) + "'";
}
public static string FormatBinary (byte[] value)
{
return "0x" + Hex.Encode(value);
}
public static string FormatGuid (Guid value)
{
return value.ToString("D");
}
public static string FormatInteger (byte value)
{
return value.ToString("G", NumberFormatInfo.InvariantInfo);
}
public static string FormatInteger (sbyte value)
{
return value.ToString("G", NumberFormatInfo.InvariantInfo);
}
public static string FormatInteger (int value)
{
return value.ToString("G", NumberFormatInfo.InvariantInfo);
}
public static string FormatInteger (uint value)
{
return value.ToString("G", NumberFormatInfo.InvariantInfo);
}
public static string FormatInteger (short value)
{
return value.ToString("G", NumberFormatInfo.InvariantInfo);
}
public static string FormatInteger (ushort value)
{
return value.ToString("G", NumberFormatInfo.InvariantInfo);
}
public static string FormatInteger (IFormattable value)
{
return value.ToString("G", NumberFormatInfo.InvariantInfo);
}
public static string FormatBigInteger (long value)
{
if (value >= -2147483648L && value <= 2147483647L)
return value.ToString("G", NumberFormatInfo.InvariantInfo);
return "cast(" + value.ToString("G", NumberFormatInfo.InvariantInfo) + " as bigint)";
}
public static string FormatBigInteger (ulong value)
{
if (value <= 2147483647UL)
return value.ToString("G", NumberFormatInfo.InvariantInfo);
return "cast(" + value.ToString("G", NumberFormatInfo.InvariantInfo) + " as bigint)";
}
public static string FormatBigInteger (IFormattable value)
{
return "cast(" + value.ToString("G", NumberFormatInfo.InvariantInfo) + " as bigint)";
}
public static string FormatReal (float value)
{
return value.ToString("r", NumberFormatInfo.InvariantInfo);
}
public static string FormatReal (double value)
{
return value.ToString("r", NumberFormatInfo.InvariantInfo);
}
public static string FormatReal (decimal value)
{
return value.ToString("r", NumberFormatInfo.InvariantInfo);
}
public static string FormatReal (IFormattable value)
{
return value.ToString("r", NumberFormatInfo.InvariantInfo);
}
public static string FormatVariant (object value)
{
if (value is string) return FormatUnicodeString((string) value);
if (value is bool) return FormatBoolean((bool) value);
if (value is DateTime) return FormatDateTime((DateTime) value);
if (value is byte[]) return FormatBinary((byte[]) value);
if (value is Guid) return FormatGuid((Guid) value);
if (value is byte || value is short || value is int || value is long || value is sbyte || value is ushort || value is uint || value is ulong)
return FormatInteger((IFormattable) value);
if (value is float || value is double || value is decimal)
return FormatReal((IFormattable) value);
return "(unsupported type: " + value.GetType().ToString() + "=" + value.ToString() + ")";
}
#endregion
public static string Format (object value, SqlDbType type)
{
return _formatters[ (int) type ] (value);
}
}
}