Мне нужно загрузить CSV файл из сетевого местоположения и импортировать его в таблицу MySQL. Самый простой способ - скопировать его в местоположение MySQL и использовать LOAD DATA. Я сделал это вручную, используя эту команду:
LOAD DATA INFILE 'Transactions.CSV'
INTO TABLE tmpImport
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS
(AccountDesignator,@PostedDate,SerialNum,Description,Amount,CrDr)
SET PostedDate = STR_TO_DATE(@PostedDate, '%m/%d/%Y');
Мне пришлось добавить @PostedDate, потому что без него MySQL жаловался, что дата не в правильном формате.
Так как это будет обычным делом, я попытался включить его в хранимую процедуру, которая может быть вызвана моим процессом, но использование LOAD DATA в хранимой процедуре не допускается.
Поэтому я решил, что просто отправлю необработанную команду из моего процесса с помощью MySQL Net/Connector:
using (MySqlCommand cmd = new MySqlCommand(sql, new MySqlConnection("server=theServer; uid=theUid; pwd=thePwd; database=theDatabase; SslMode=none;")))
{
cmd.Connection.Open();
rows = cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
Но когда я пытаюсь запустить это, я получаю эту ошибку:
MySqlException: параметр "@PostedDate" должен быть определен.
Есть ли способ обойти это? Или мне придётся прибегнуть к чтению в CSV файле и вводу записей отдельно?
У вас есть два варианта.
1) отформатируйте дату в.csv перед загрузкой файла.
2) измените эту колонку на varchar. Загрузите файл, а затем используйте STR_TO_DATE, чтобы изменить желаемый формат даты. Затем измените тип столбца на DATE, если он должен быть определен как один. Обычно у меня нет проблем с полями даты как VARCHAR.
Оба варианта лучше, чем вы думали, что вам, возможно, придется сделать в конце