簡體   English   中英

C#字符串未在Parameters.AddWithValue中識別為有效的DateTime

[英]C# string was not recognized as a valid DateTime in Parameters.AddWithValue

我正在C#.net上工作,我想插入12個塊的日期時間。 波紋管是我的代碼

cmd2.Parameters.AddWithValue("@Occurrence_Time", Convert.ToDateTime(Meter_data.Substring(161, 12)));
cmd2.Parameters.AddWithValue("@Recovery_Time", Convert.ToDateTime(Meter_data.Substring(173, 12)));

在運行程序時,出現以下錯誤

string was not recognized as a valid DateTime

使用快速監視 ,日期時間應類似於161025120830 ,而在插入日期時,日期時間應類似於2016-10-25 12:08:30

在上面的行中,日期以16開頭,但是在數據庫中應將其插入為2016

更新的代碼

正如建議un-lucky ,我已經做出了如下代碼更改,請參閱波紋管

try
{
    con.Open();
    cmd1.Parameters.AddWithValue("@Device_ID", device_Id);
    cmd1.Parameters.AddWithValue("@Energy_kWh", Convert.ToDecimal(Meter_data.Substring(18, 9)));
    cmd1.Parameters.AddWithValue("@Power_kW", Convert.ToDecimal(Meter_data.Substring(144, 7)));
    cmd1.Parameters.AddWithValue("@Voltage_Phase_1", Convert.ToDecimal(Meter_data.Substring(102, 6)));
    cmd1.Parameters.AddWithValue("@Voltage_Phase_2", Convert.ToDecimal(Meter_data.Substring(109, 6)));
    cmd1.Parameters.AddWithValue("@Voltage_Phase_3", Convert.ToDecimal(Meter_data.Substring(116, 6)));
    cmd1.Parameters.AddWithValue("@Current_Phase_1", Convert.ToDecimal(Meter_data.Substring(123, 6)));
    cmd1.Parameters.AddWithValue("@Current_Phase_2", Convert.ToDecimal(Meter_data.Substring(130, 6)));
    cmd1.Parameters.AddWithValue("@Current_Phase_3", Convert.ToDecimal(Meter_data.Substring(137, 6)));
    cmd1.Parameters.AddWithValue("@Device_Serial_Number", Meter_data.Substring(152, 8));

    //For Events


    string formatString = "yyMMddHHmmss";
    DateTime Occurrence_Time, Recovery_Time;
    string strOccurrence = Meter_data.Substring(161, 12);
    string strRecovery = Meter_data.Substring(173, 12);


    cmd2.Parameters.AddWithValue("@Device_ID", device_Id);
    cmd2.Parameters.AddWithValue("@Event_ID", event_Id);

    if (DateTime.TryParseExact(strOccurrence, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Occurrence_Time))
    {
        if (DateTime.TryParseExact(strRecovery, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Recovery_Time))
        {
            cmd2.Parameters.Add("@Occurrence_Time", SqlDbType.DateTime).Value = Occurrence_Time;
            cmd2.Parameters.Add("@Recovery_Time", SqlDbType.DateTime).Value = Recovery_Time;
        }
    }



    //cmd2.Parameters.AddWithValue("@Occurrence_Time", Convert.ToDateTime(Meter_data.Substring(161, 12)));
    //cmd2.Parameters.AddWithValue("@Recovery_Time", Convert.ToDateTime(Meter_data.Substring(173, 12)));

    int ADS_Device_Data_rows_executed = cmd1.ExecuteNonQuery();
    Console.WriteLine("Rows Executed: '{0}'", ADS_Device_Data_rows_executed);

    int Device_Events_rows_executed = cmd2.ExecuteNonQuery();
    Console.WriteLine("Rows Executed: '{0}'", Device_Events_rows_executed);
    con.Close();
    Console.WriteLine("Data Recieved correctly and Stored in Data Base : {0}", DateTime.Now);

}
catch (Exception ex)
{
    Console.WriteLine(" >> " + ex.ToString());
    Console.WriteLine("Data Recieved is Incorrect Data is not stored in DB : {0}", DateTime.Now);
}

在調試指針何時到達if (DateTime.TryParseExact(strOccurrence, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Occurrence_Time))

它沒有進入並給出異常Must declare the scalar variable "@Occurrence_Time".

此外,可能有多個“ 發生時間”和“ 恢復時間” ,但現在僅是一個事件時間

我搜索了許多有關此異常的文章,但找不到用於Parameters.AddWithValue任何准確解決方案

更新了代碼2

根據建議,我在代碼中做了以下更改

        string formatString = "yyyyMMddHHmmss";
        DateTime Occurrence_Time ,Recovery_Time;
        string strOccurrence = "20" + Meter_data.Substring(161, 12);
        string strRecovery = "20" + Meter_data.Substring(173, 12);

        if (DateTime.TryParseExact(strOccurrence, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Occurrence_Time))
            {
                if (DateTime.TryParseExact(strRecovery, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Recovery_Time))
                {
                    cmd2.Parameters.Add("@Occurrence_Time", SqlDbType.DateTime).Value = Occurrence_Time;
                    cmd2.Parameters.Add("@Recovery_Time", SqlDbType.DateTime).Value = Recovery_Time;
                }
            }

第一次運行時,我能夠查看正確的數據並將其成功插入,但是現在它顯示為空,請參見下面的圖片

在此處輸入圖片說明

現在我又遇到了同樣的異常

Must declare the scalar variable "@Occurrence_Time".

任何幫助將不勝感激

問題出在您的日期/時間解析,而不是插入。 因此,您只需要提供日期時間格式,如下所示:

string formatString = "yyMMddHHmmss";
DateTime dt;
if (DateTime.TryParseExact(text, formatString, CultureInfo.InvariantCulture, 
                           DateTimeStyles.None,
                           out dt))

所以convert函數的輸入是161025120830 ,我們可以說這將是yyMMddHHmmss格式。因此,執行此轉換的最佳選擇是DateTime.TryParseExact ,將其轉換並存儲在變量中,然后將其用於插入。 代碼將如下所示:

string formatString= "yyMMddHHmmss";
DateTime Occurrence_Time,Recovery_Time;
string strOccurrence = Meter_data.Substring(161, 12);
string strRecovery = Meter_data.Substring(173, 12);

if (DateTime.TryParseExact(strOccurrence,formatString, CultureInfo.InvariantCulture,DateTimeStyles.None,out Occurrence_Time))
{
    if (DateTime.TryParseExact(strRecovery,formatString, CultureInfo.InvariantCulture,DateTimeStyles.None,out Recovery_Time))
    {
      cmd2.Parameters.Add("@Occurrence_Time",SqlDbType.DateTime).Value=Occurrence_Time;
      cmd2.Parameters.Add("@Recovery_Time",SqlDbType.DateTime).Value=Recovery_Time;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM