#c# #console-application
Вопрос:
Динамическое чтение данных excel (из filezilla) и сохранение в версии mysql (6.0.11-альфа-сообщество)
Я использую хранимую процедуру (для сбора данных Excel.csv) и сохранения их в версии mysql (6.0.11-альфа-сообщество).
но пока я выполняю или сохраняю данные в mysql, я получаю эту ошибку:
На приведенном выше изображении 2021070701.csv и 2021070801.csv считываются и сохраняются в mysql нормально, потому что в файле excel (конкретной ячейке) нет нулевых данных.
когда он достигает выполнения этого файла 2021070201.csv, я получаю «Ошибку исключения формата».
Данные 2021070201.csv(excel) выглядят в следующем формате: (данные excel 2021070201.csv и выделенные синим цветом ячейки являются значениями с плавающей точкой, а ячейки содержат нулевые данные)
Это то, что я написал логику для чтения данных excel и сохранения в mysql
else if (mpType.Equals("Indices", StringComparison.InvariantCultureIgnoreCase))
{
MAE_Repo.InsertNseIndicesPrice("Usp_tbl_Intraday_NseIndicesPrice", 0, Convert.ToInt32(res[0]), res[1], Convert.ToSingle(res[2]),
Convert.ToSingle(res[3]), Convert.ToSingle(res[4]), Convert.ToSingle(res[5]), Convert.ToSingle(res[6]),
Convert.ToSingle(res[7]), Convert.ToSingle(res[8]), Convert.ToSingle(res[9]), Convert.ToSingle(res[10]),
Convert.ToDateTime(res[11]), res[12], timeStamp, filename);
}
И вот для чего я написал логику SP:
Public static void InsertNseIndicesPrice(String ProcName, int ipID, int ipIndextoken, string ipSymbol, float ipCLOSE,
float ipOPEN, float ipHigh,float ipLow, float ipVolume, float ipVALUE, float ipprev_close, float ipCHANGE, float ipPer_Change,
DateTime ipUpdtime, string ipFlag, DateTime ipCreatedOn, string ipFileName)
{
con.Open();
MySqlCommand cmdSel = new MySqlCommand(ProcName, con);
cmdSel.CommandType = System.Data.CommandType.StoredProcedure;
cmdSel.Parameters.AddWithValue("@IPID", 0);
cmdSel.Parameters.AddWithValue("@IPIndextoken", ipIndextoken);
cmdSel.Parameters.AddWithValue("@IPSymbol", ipSymbol);
cmdSel.Parameters.AddWithValue("@IPCLOSE", ipCLOSE);
cmdSel.Parameters.AddWithValue("@IPOPEN", ipOPEN);
cmdSel.Parameters.AddWithValue("@IPHigh", ipHigh);
cmdSel.Parameters.AddWithValue("@IPLow", ipLow);
cmdSel.Parameters.AddWithValue("@IPVolume", ipVolume);
cmdSel.Parameters.AddWithValue("@IPVALUE", ipVALUE);
cmdSel.Parameters.AddWithValue("@IPprev_close", ipprev_close);
cmdSel.Parameters.AddWithValue("@IPCHANGE", ipCHANGE);
cmdSel.Parameters.AddWithValue("@IPPer_Change", ipPer_Change);
cmdSel.Parameters.AddWithValue("@IPUpdtime", ipUpdtime);
cmdSel.Parameters.AddWithValue("@IPFlag", ipFlag);
cmdSel.Parameters.AddWithValue("@IPCreatedOn", ipCreatedOn);
cmdSel.Parameters.AddWithValue("@IPFileName", ipFileName);
cmdSel.Parameters.AddWithValue("@OPType", 1);
MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
DataSet ds = new DataSet();
da.Fill(ds);
con.Close();
}
И это моя хранимая процедура в mysql
DELIMITER $
USE `marketprice_nse`$
DROP PROCEDURE IF EXISTS `Usp_tbl_Intraday_NseIndicesPrice`$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Usp_tbl_Intraday_NseIndicesPrice`(IN IPID BIGINT, IN IPIndextoken INT, IN IPSymbol VARCHAR(20), IN IPCLOSE FLOAT,
IN IPOPEN FLOAT, IN IPHigh FLOAT,IN IPLow FLOAT, IN IPVolume FLOAT, IN IPVALUE FLOAT,IN IPprev_close FLOAT, IN IPCHANGE FLOAT, IN IPPer_Change FLOAT,
IN IPUpdtime DATETIME, IN IPFlag VARCHAR(1), IN IPCreatedOn DATETIME, IN IPFileName VARCHAR(30),IN OPType INT)
BEGIN
IF (OPType = 1)-- Insert
THEN
-- IF (SELECT 1 FROM tbl_intraday_nseindicesprice WHERE FileName = IPFileName) = 0
-- THEN
-- BEGIN
INSERT INTO tbl_Intraday_NseIndicesPrice (ID, Indextoken, Symbol, `CLOSE`, `OPEN`, High, Low, Volume, `VALUE`, prev_close, `CHANGE`,
Per_Change, Updtime, Flag, CreatedOn, FileName) VALUES (IPID, IPIndextoken, IPSymbol, IPCLOSE, IPOPEN, IPHigh, IPLow, IPVolume,
IPVALUE, IPprev_close, IPCHANGE, IPPer_Change, IPUpdtime, IPFlag, IPCreatedOn, IPFileName);
-- END;
-- END IF;
ELSEIF (OPType = 2)-- Check FileName availability
THEN
SELECT * FROM tbl_intraday_nseindicesprice WHERE FileName=IPFileName;
END IF;
END$
DELIMITER ;
Я пробовал разные способы, такие как
Single.Parse() Method
float.Parse() Method
Convert.ToSingle() Method
эти методы не решают исключение формата
Как я могу сохранить значение по умолчанию(0.0) в mysql без каких-либо исключений формата?
Комментарии:
1. Когда у вас пустая ячейка, значение равно
res[6]
нулю или пустой строке? Если он равен нулю, вы можете написатьConvert.ToSingle(res[6] ?? "0.0")
. Если это пустая строка, вы можете сделать что-то вродеConvert.ToSingle(string.IsNullOrEmpty(res[6]) ? "0.0" : res[6])
2. Да, это пустая строка и «Преобразовать. Тосингл(строка. IsNullOrEmpty(res[6]) ? «0.0» : res[6])» это один из вариантов .
Ответ №1:
Хорошо, основываясь на комментариях, это ответ:
Вместо того, чтобы писать Convert.ToSingle(res[6])
, вы можете писать Convert.ToSingle(res[6] ?? "0.0")
. Затем, если значение res[6] равно нулю, вместо этого будет использоваться строка «0.0», преобразованная в единицу.
Если вам нужно беспокоиться о различных языках, имеющих точку или запятую в качестве десятичного разделителя, вы можете просто использовать «0» по умолчанию (что также преобразуется в значение с плавающей точкой 0,0) или создать строку с локальным десятичным разделителем
string defaultFloatValue = (0.0F).toString();
и используйте его вместо литерала «0.0».