Как преобразовать нулевое значение в значение по умолчанию(с плавающей точкой) 0.0 и сохранить это значение по умолчанию в версии MySQL(6.0.11-альфа-сообщество)

#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 и выделенные синим цветом ячейки являются значениями с плавающей точкой, а ячейки содержат нулевые данные)

2021070201.csv данные excel и выделенные синим цветом ячейки являются значениями с плавающей точкой, а ячейки содержат нулевые данные

Это то, что я написал логику для чтения данных 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».