@@ -38,7 +38,8 @@ public partial class MySqlConnectorDriver(Options options, Dictionary<string, Ta
38
38
{ "time" , null } ,
39
39
{ "tinytext" , null } ,
40
40
{ "varchar" , null } ,
41
- { "var_string" , null }
41
+ { "var_string" , null } ,
42
+ { "json" , null }
42
43
} , ordinal => $ "reader.GetString({ ordinal } )") ,
43
44
new ( "DateTime" ,
44
45
new Dictionary < string , string ? > { { "date" , null } , { "datetime" , null } , { "timestamp" , null } } , ordinal => $ "reader.GetDateTime({ ordinal } )") ,
@@ -54,25 +55,30 @@ public partial class MySqlConnectorDriver(Options options, Dictionary<string, Ta
54
55
new ( "double" ,
55
56
new Dictionary < string , string ? > { { "double" , null } , { "float" , null } } , ordinal => $ "reader.GetDouble({ ordinal } )") ,
56
57
new ( "object" ,
57
- new Dictionary < string , string ? > { { "json" , null } } , ordinal => $ "reader.GetString ({ ordinal } )")
58
+ new Dictionary < string , string ? > { } , ordinal => $ "reader.GetValue ({ ordinal } )")
58
59
] ;
59
60
60
61
public override UsingDirectiveSyntax [ ] GetUsingDirectives ( )
61
62
{
62
63
return base . GetUsingDirectives ( )
63
- . Append ( UsingDirective ( ParseName ( "MySqlConnector" ) ) )
64
- . Append ( UsingDirective ( ParseName ( "System.Globalization" ) ) )
65
- . Append ( UsingDirective ( ParseName ( "System.IO" ) ) )
66
- . Append ( UsingDirective ( ParseName ( "CsvHelper" ) ) )
67
- . Append ( UsingDirective ( ParseName ( "CsvHelper.Configuration" ) ) )
64
+ . Concat (
65
+ [
66
+ UsingDirective ( ParseName ( "MySqlConnector" ) ) ,
67
+ UsingDirective ( ParseName ( "System.Globalization" ) ) ,
68
+ UsingDirective ( ParseName ( "System.IO" ) ) ,
69
+ UsingDirective ( ParseName ( "CsvHelper" ) ) ,
70
+ UsingDirective ( ParseName ( "CsvHelper.Configuration" ) ) ,
71
+ UsingDirective ( ParseName ( "CsvHelper.TypeConversion" ) ) ,
72
+ UsingDirective ( ParseName ( "System.Text" ) )
73
+ ] )
68
74
. ToArray ( ) ;
69
75
}
70
76
71
77
public override ConnectionGenCommands EstablishConnection ( Query query )
72
78
{
73
79
return new ConnectionGenCommands (
74
80
$ "var { Variable . Connection . AsVarName ( ) } = new MySqlConnection({ GetConnectionStringField ( ) } )",
75
- $ "{ Variable . Connection . AsVarName ( ) } .Open ()"
81
+ $ "await { Variable . Connection . AsVarName ( ) } .OpenAsync ()"
76
82
) ;
77
83
}
78
84
@@ -137,26 +143,39 @@ public string GetCopyFromImpl(Query query, string queryTextConstant)
137
143
const string tempCsvFilename = "input.csv" ;
138
144
const string csvDelimiter = "," ;
139
145
146
+ var csvWriterVar = Variable . CsvWriter . AsVarName ( ) ;
147
+ var loaderVar = Variable . Loader . AsVarName ( ) ;
148
+ var connectionVar = Variable . Connection . AsVarName ( ) ;
149
+
150
+ var loaderColumns = query . Params . Select ( p => $ "\" { p . Column . Name } \" ") . JoinByComma ( ) ;
140
151
var ( establishConnection , connectionOpen ) = EstablishConnection ( query ) ;
141
152
return $$ """
153
+ const string supportedDateTimeFormat = "yyyy-MM-dd H:mm:ss";
142
154
var {{ Variable . Config . AsVarName ( ) }} = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = "{{ csvDelimiter }} " };
143
- using (var {{ Variable . Writer . AsVarName ( ) }} = new StreamWriter("{{ tempCsvFilename }} "))
144
- using (var {{ Variable . CsvWriter . AsVarName ( ) }} = new CsvWriter({{ Variable . Writer . AsVarName ( ) }} , {{ Variable . Config . AsVarName ( ) }} ))
145
- await {{ Variable . CsvWriter . AsVarName ( ) }} .WriteRecordsAsync({{ Variable . Args . AsVarName ( ) }} );
155
+ using (var {{ Variable . Writer . AsVarName ( ) }} = new StreamWriter("{{ tempCsvFilename }} ", false, new UTF8Encoding(false)))
156
+ using (var {{ csvWriterVar }} = new CsvWriter({{ Variable . Writer . AsVarName ( ) }} , {{ Variable . Config . AsVarName ( ) }} ))
157
+ {
158
+ var options = new TypeConverterOptions { Formats = new[] { supportedDateTimeFormat } };
159
+ {{ csvWriterVar }} .Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
160
+ {{ csvWriterVar }} .Context.TypeConverterOptionsCache.AddOptions<DateTime?>(options);
161
+ await {{ csvWriterVar }} .WriteRecordsAsync({{ Variable . Args . AsVarName ( ) }} );
162
+ }
146
163
147
164
using ({{ establishConnection }} )
148
165
{
149
166
{{ connectionOpen . AppendSemicolonUnlessEmpty ( ) }}
150
- var {{ Variable . Loader . AsVarName ( ) }} = new MySqlBulkLoader({{ Variable . Connection . AsVarName ( ) }} )
167
+ var {{ loaderVar }} = new MySqlBulkLoader({{ connectionVar }} )
151
168
{
152
169
Local = true,
153
170
TableName = "{{ query . InsertIntoTable . Name }} ",
154
171
FieldTerminator = "{{ csvDelimiter }} ",
155
172
FileName = "{{ tempCsvFilename }} ",
173
+ FieldQuotationCharacter = '"',
156
174
NumberOfLinesToSkip = 1
157
175
};
158
- await {{ Variable . Loader . AsVarName ( ) }} .LoadAsync();
159
- await {{ Variable . Connection . AsVarName ( ) }} .CloseAsync();
176
+ {{ loaderVar }} .Columns.AddRange(new List<string> { {{ loaderColumns }} });
177
+ await {{ loaderVar }} .LoadAsync();
178
+ await {{ connectionVar }} .CloseAsync();
160
179
}
161
180
""" ;
162
181
}
0 commit comments