Как использовать c # и наборы данных для чтения / записи DateTime в SQL Server - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть таблица в SQL Server, в которой есть столбец с именем sql_DateTime типа datetime.У меня также есть структура C #, которая отображается на одну запись из этой таблицы;в этой структуре есть член с именем m_DateTime типа DateTime.

. Моя проблема возникает после того, как я извлекаю запись из этой таблицы, используя DataSet, а затем пытаюсь получить sql_DateTime изDataset в мою m_DateTime переменную.Я получаю InvalidCastException, когда пытаюсь сделать это аналогично тому, как я обрабатываю другие типы данных.

Тогда я надеюсь, что смогу использовать DateTimePicker в моем графическом интерфейсе для отображения и установки даты ивремя.

Мой код прилагается для вашей справки.Спасибо за любые рекомендации.

 public bool GetExperiment(ref Experiment exp, int ExperimentID, ref string statusMsg)
    {
        bool ret = true;
        statusMsg = "GetExperiment: ";

        try
        {
            // Open the connection
            conn.Open();

            // init SqlDataAdapter with select command and connection
            string SelectString =
                @"SELECT * " +
                "FROM Experiment " +
                "WHERE ExperimentID = " + ExperimentID.ToString();

            SqlDataAdapter daExperiments = new SqlDataAdapter(SelectString, conn);

            // fill the dataset
            DataSet dsExperiments = new DataSet();
            daExperiments.Fill(dsExperiments, "Experiment");

            // assign dataset values to proj object that was passed in
            exp.m_ExperimentID = (int)dsExperiments.Tables["Experiment"].Rows[0]["ExperimentID"];
            exp.m_ProjectID = (int)dsExperiments.Tables["Experiment"].Rows[0]["ProjectID"];
            exp.m_Name = (string)dsExperiments.Tables["Experiment"].Rows[0]["Name"];
            exp.m_Description = (string)dsExperiments.Tables["Experiment"].Rows[0]["Description"];
            exp.m_UserID = (int)dsExperiments.Tables["Experiment"].Rows[0]["UserID"];

            // PROBLEM OCCURS HERE
            exp.m_DateTime = (DateTime)dsExperiments.Tables["Experiment"].Rows[0]["DateTime"];

        }
        catch (Exception ex)
        {

            ret = false;
            statusMsg += "Failed - " + ex.Message;
        }
        finally
        {

            // Close the connection
            if (conn != null)
            {
                conn.Close();
            }
        }
        return ret;
    }


public class Experiment
{
    public int m_ExperimentID;
    public int m_ProjectID;
    public string m_Name;
    public string m_Description;
    public int m_UserID;
    public DateTime m_DateTime;
}

Ответы [ 4 ]

0 голосов
/ 10 ноября 2011

Возможно, проблема в том, что в DataTable, содержащем данные (Tables["Experiment"]), столбец ["DateTime"] не относится к типу DateTime, а является строкой.

Я думаю, у вас есть альтернативы:

  1. Если вы уверены, что это всегда DateTime, просто проанализируйте его:

    exp.m_DateTime =DateTime.Parse(dsExperiments.Tables["Experiment"].Rows[0]["DateTime"].ToString());
    
  2. Установите dsExperiments.Tables["Experiment"].Columns["DateTime"].DataType=typeof(DateTime);, прежде чем пытаться его прочитать.

0 голосов
/ 10 ноября 2011

Используете ли вы привязку данных? Если да, то привязываете ли вы к правильной собственности? И является ли SQL один обнуляемым типом или нет?

0 голосов
/ 10 ноября 2011

Попробуйте это:

        exp.m_DateTime =  DateTime.Parse(dsExperiments.Tables["Experiment"].Rows[0]["DateTime"].ToString());
0 голосов
/ 10 ноября 2011

Вы говорите:

У меня есть таблица в SQL Server, в которой есть столбец с именем sql_DateTime

А еще вы используете:

exp.m_DateTime = (DateTime)dsExperiments.Tables["Experiment"]
                                        .Rows[0]["DateTime"];

Обратите внимание на имя. Я удивлен тем, что у тебя проблемы с кастингом. Возможно ли, что на самом деле вы правильно поняли имя, но ваша строка не содержит значения, поэтому вы пытаетесь привести DBNull.Value к DateTime?

Кроме того, я бы сказал:

  • Нет необходимости передавать exp по ссылке
  • Я бы лично отделил обработку исключений от доступа к базе данных; Я бы позволил интерфейсу обработать исключение
  • Я бы использовал именованный параметр вместо включения идентификатора эксперимента непосредственно в SQL
...