SQL Serverの行を保持するモデルオブジェクトを開発しようとしていますが、T-Sql/SqlServerのタイムスタンプを除いて、これを行う方法を完全に理解しています。テーブルは次のように定義されます。
CREATE TABLE activity (
activity_id int
, ip_address varchar(39)
, user_id varchar(255)
, message_text
, dt timestamp
)
テーブルの行をオブジェクトに解決するとき、intまたはstringの場合、次のようなことを期待します。
ActivityID = (int)dataReader["activity_id"];
IPAddress = (string)dataReader["ip_address"];
しかし、タイムスタンプ列はどうすればよいですか?どこにでもある「タイムスタンプ」データ型はありません。 SQL Serverがタイムスタンプを8バイトのバイナリとして格納することは知っていますが、これは通常、.NETと同等のものですか?
追加するために編集:少し追加情報...これは、SQLServerビューを介してメインフレーム上のDB2テーブルから返される行です。 「Rowversion」はオプションではなく、DB2は列をタイムスタンプとして渡します。タイムスタンプと行バージョンが同じである場合は、1つとして扱うことができますが、それ以外の場合はタイムスタンプでスタックします。
追加するために再度編集:このプロジェクトは私を狂わせるでしょう。少なくとも、短い旅行になるでしょう。とにかく、はい@JoelCこれはメインフレーム上のDB2データベースへのSQLServerビューです。私はついにDBAの1人を追跡することができました。彼は、「もちろん」DB2TIMESTAMPがSQLServerビューに関して日時として出くわすと軽蔑的に説明しました。彼の声の調子から、私は初心者だけがこれを知らないと思います。そのため、彼は実際のビューで「日時」と名付けました。 (私の例では、命名規則についての解説をトリガーしないように、別の名前を付けました。実際のデータモデル図では、これはTIMESTAMPであり、タイムスタンプと名付けられています)。したがって、このイベントでは、明らかにそれをDateTimeにキャストする必要があります。私もプログラマーを夢中にさせることができるように、DBAになることを検討し始めるかもしれないと思います。この質問への回答者のいずれかを誤解した場合は申し訳ありません。実際にはタイムスタンプがタイムスタンプであると期待していたため、意図的ではありませんでした。愚かな私。日付と時刻とは関係のないバイト配列データ型を「タイムスタンプ」と名付けてくれたMicrosoftに特に感謝します。どの回答を回答としてマークするかについて、私は漠然とした考えを持っていません。はぁ。
SQLServerのタイムスタンプデータ型の名前は紛らわしいです。バージョン番号のように考える方が本当に良いです—どこにも日付/時刻情報はありません。実際、SQL Server 2008の時点で、タイプの名前は「rowversion」に変更されました。
ほとんどの場合、代わりにSqlServerでdatetime
タイプが必要です。これは、C#のDateTimeに簡単にマップできます。または、それをサポートするSql Serverのバージョンがある場合は、おそらく datetime2 です。タイムスタンプの種類に関するドキュメントは次のとおりです。
http://msdn.Microsoft.com/en-us/library/ms182776(v = sql.90).aspx
本当にそのタイムスタンプ列をそのままマップする必要がある場合、最も近い一致はおそらく単純な古いlong
(またはおそらくulong)ですが、SQLサーバーがバイト順序またはビッグ/リトルエンディエンスをどのように処理するかはわかりません。 C#。
それは byte[]
、Length
の8
。
データベースから取得する場合
string dt = Convert.ToBase64String(dataReader["dt"] as byte[]);
データベースに渡すとき
new SqlParameter("@dt", Convert.FromBase64String(dt))