Преобразование строки в TimeSpan и сохранение ее в базе данных MS Access - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь преобразовать строку в TimeSpan и сохранить ее в своей базе данных MS Access.Но я не могу преобразовать его должным образом.

Если вы можете проверить мой код ниже, я был бы признателен.Спасибо!

        OleDbCommand command = new OleDbCommand();
        command.Connection = connection;

        CultureInfo culture;
        culture = CultureInfo.CurrentCulture;

        string pNum = patientNum.Text;
        string pFname = Firstname.Text;
        string pLname = Lastname.Text;
        string cpNum = contactNum.Text;

        DateTime aDate = DateTime.ParseExact(appDate.Text, "MM/dd/yyyy", culture);
        TimeSpan aTime = TimeSpan.ParseExact(appTime.Text, "hh:mm tt", culture);

        string aTreat = treat.Text;
        string aCost = treatCost.Text;
        string aRemark = appRemarks.Text;


        OleDbCommand con = new OleDbCommand("Insert into appointments1(patientNo,firstName,lastName,contactNo,date,time,treatment,cost,remarks)" + "Values (@patientNo,@firstName,@lastName,@contactNo,@date,@time,@treatment,@cost,@remarks)");
        con.Connection = connection;
        connection.Open();

        con.Parameters.Add("@patientNo", OleDbType.Integer).Value = pNum;
        con.Parameters.Add("@firstName", OleDbType.VarChar).Value = pFname;
        con.Parameters.Add("@lastName", OleDbType.VarChar).Value = pFname;
        con.Parameters.Add("@conatctNum", OleDbType.VarChar).Value = cpNum;
        con.Parameters.Add("@date", OleDbType.Date).Value = aDate;
        con.Parameters.Add("@time", OleDbType.DBTime).Value = aTime;
        con.Parameters.Add("@treatment", OleDbType.VarChar).Value = aTreat;
        con.Parameters.Add("@cost", OleDbType.Currency).Value = aCost;
        con.Parameters.Add("@remarks", OleDbType.VarChar).Value = aRemark;

        try
        {
            con.ExecuteNonQuery();
            MessageBox.Show("Appointment Added!");
            raiseUpdate();
            connection.Close();
            this.Dispose();
        }

        catch (OleDbException ex)
        {
            MessageBox.Show(ex.Message);
        }

Ответы [ 4 ]

0 голосов
/ 05 апреля 2019

спасибо всем за ваши ответы, и я смог понять это.

  1. У Access действительно нет «Особого времени» (?), Я не уверен, что это один из вас, но я изменил время на «Дата».

        con.Parameters.Add("@date", OleDbType.Date).Value = aDate;
        con.Parameters.Add("@time", OleDbType.Date).Value = aTime;
    
  2. Работает нормально, даже если я сохраняю значение в виде строки

        string aDate = appDate.Text;
        string aTime = appTime.Text;
    
  3. Я узнал, что «дата» и «время» - зарезервированные слова. Не уверен, что C # чувствителен к регистру, но лучше, чем потом сожалеть. Поэтому мне пришлось добавить квадратные скобки, чтобы обернуть название моего столбца. См. Информацию здесь .

        OleDbCommand con = new OleDbCommand("INSERT INTO [appointments1]([patientNo], [firstName], [lastName], [contactNo], [date], [time], [treatment], [cost], [remarks])" +
            "VALUES(@patientNo, @firstName, @lastName, @contactNo, @date, @time, @treatment, @cost, @remarks)");
    

Теперь мой код работает нормально. Спасибо !!

0 голосов
/ 04 апреля 2019

попробуйте

 DateTime dateTime = DateTime.ParseExact(appTime.Text, "hh:mm tt", CultureInfo.InvariantCulture);

        TimeSpan span = dateTime.TimeOfDay;
0 голосов
/ 04 апреля 2019

Вы не можете разобрать временной интервал таким образом.Попробуйте использовать Parse и соответствующую культуру:

System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");
DateTime aDate = DateTime.Parse(appDate.Text, culture);
TimeSpan aTime = DateTime.Parse(appTime.Text).TimeOfDay;

Кроме того, у Access нет особого времени, поэтому попробуйте (хотя я не могу проверить это в данный момент):

con.Parameters.Add("@time", OleDbType.Date).Value = aTime;

Если это не сработает, вам, возможно, придется использовать грубую силу, используя эпоху (числовая нулевая дата) VBA DateTime:

DateTime vbaEpoch = new DateTime(1899, 12, 30);
System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");
DateTime aDate = DateTime.Parse(appDate.Text, culture);
DateTime aTime = vbaEpoch.AddTicks(DateTime.Parse(appTime.Text).TimeOfDay.Ticks);

и:

con.Parameters.Add("@time", OleDbType.Date).Value = aTime;

Кроме того, вы можете вырезать все это, используя одно поле даты-времени :

DateTime aDateTime = DateTime.Parse(appDate.Text + " " + appTime.Text, culture);
0 голосов
/ 04 апреля 2019

Вы должны использовать это как:

TimeSpan aTime = TimeSpan.ParseExact(appTime.Text, "hh\\:mm\\ tt", culture);

Для получения дополнительной информации см. Документацию: Пользовательские строки формата TimeSpan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...