2011-11-10 10 views
0

datetimeという名前の列がsql_DateTimeというSQL Serverのテーブルがあります。私はまた、このテーブルからの単一のレコードにマップするC#構造体を持っています。この構造ではDateTimem_DateTimeという名前のメンバーがあります。私は、このテーブルからレコードを取得DataSetを使用して、その後、私のm_DateTime変数にDatasetからsql_DateTimeを取得しようとした後c#とdatasetsを使用してSQL ServerにDateTimeを読み書きする方法

私の問題が発生します。 InvalidCastExceptionを取得すると、他のデータ型を扱う方法と似たようにしようとします。

ご希望の場合は、GUIにDateTimePickerを使用して、日付と時刻を表示および設定することができます。

参考のため、私のコードが添付されています。ご指摘ありがとうございます。

私はSQL_DATETIME

使用

そして、まだ名前の列を持つSQL Serverのテーブルがあります:

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

は名前をメモあなたが言う

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; 
} 
+0

MSSQL DATETIMEをDateTime .NET構造に変換する方法については、オンラインで数多くの記事があります。私はあなたの間違った変数の型を使用して推測し、その理由のためにキャストすることはできません。これを読んでください:http://stackoverflow.com/questions/1181662/is-there-any-difference-between-datetime-in-c-sharp-and-datetime-in-sql-server –

答えて

0

。私はあなたがキャスティングの問題を抱えているのに驚いています。現実には名前が正しいのに行に値が含まれていない可能性があるので、DBNull.ValueDateTimeにキャストしようとしていますか?

また、私が言うと思います:

  • を私は個人的にデータベースへのアクセスからの例外処理を分けるだろう参照
  • expに合格する必要はありません。私は、あなたがデータバインディングを使用しています直接SQL
+0

ジョン - あなたが正しいと思います。私のSQLテーブルのdatetime列はNULLSを許可するように設定されていました。この場合、値はNULLでした。私は単にNULLSを許可しないように変更し、既存のレコードの値を入れて、キャスティングの問題を解決しました。私はそれがばかげた間違いであると思った。私はあなたがなぜexpを参照渡しする必要がないと言ったのか不思議です... expオブジェクトを呼び出しコードに戻す必要があります。たぶん私は何かを逃したでしょう。とにかく、素晴らしいコメントをありがとう。 –

+0

@BryanGreenway:http://pobox.com/~skeet/csharp/parameters.html –

+0

素晴らしい記事を読んでください。私のために物事をクリアします。助けてくれてありがとう。 –

0

に実験IDを含む名前付きパラメータの代わりに使用したいUIが例外

  • を処理させるだろうか?もしそうなら、あなたは適切な財産に縛っていますか? SQLはnullable型かどうか?

  • 0

    これを試してみてください:

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

    問題は、データ(Tables["Experiment"])を含むDataTableの列["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);あなたがそれを読み取ろうとする前に。

    関連する問題