注:これが発生する理由と修正方法を探していますが、回避策は探していません。これはサーバー(SQL Serverまたは接続文字列)の問題のようです。
sql 2008データベース(データベースA)に接続されているプログラムがあり、intと文字列が返されて実行されるインラインsqlがあり、正常に動作します。しかし、別の2008データベース(データベースB)に切り替えるように求められましたが、すべてが文字列として返され、指定されたキャストがC#から無効になっています。SQL2008(データベースA)に接続すると、これは言いません。これはインラインSQLステートメントであるため、SQLステートメントは変更されず、データベースのテーブルスキーマは同じです。これをint主キーで実行するアイデアはありますか?
もともとは2000年から2008年の問題だと思っていましたが、2008年も問題があります。両方のデータベースはSQLサーバーの同じインスタンス上にあり、これらは接続文字列です
接続文字列
Server=Server01\instance;Database=Fraud_Micah; Trusted_Connection=yes <- Server 2008 (this one does not)
Server=Server02\instance;Database=Fraud; Trusted_Connection=yes <- Server 2008 (this one works)
両方のデータベースのDB互換性レベルは100です
selectステートメント
select *, delimeter, file_filetype.LocalPath, ArchiveDir, EmailList
from file_importtable
join file_filetype on file_importtable.FileTypeID = file_filetype.ID
where importsuccessdate is null and transferdate is not null
and remotediscoverdate is not null
and OriginalFileName in ('Test987.xml.pgp')
fileTypeID
その破壊->InvalidCastException: Specified cast is not valid.
C#コード(リーダーはSQLDataReaderタイプであることに注意してください)
if (!(reader.IsDBNull(reader.GetOrdinal("FileTypeID"))))
{
file.FileTypeID = reader.GetInt32(reader.GetOrdinal("FileTypeID"));
}
列の定義は次[FileTypeID] [int] NULL
のとおりです。、テーブルにnull値はありません。
C#コードはこれから来ているとは思いません、それはintですか?public int? FileTypeID { get; set; }
デバッグモードの場合:reader["FileTypeID"]
-> "1"実際には文字列ですが、2008データベースに接続すると、 "1"の1が返されるのはなぜですか?
2008テーブルA定義
[ProcessSuccessDate] [datetime] NULL,
[ProcessSuccessUser] [datetime] NULL,
[FileTypeID] [int] NULL,
[HoldDate] [datetime] NULL,
2008年表B定義
ProcessSuccessDate] [datetime] NULL,
[ProcessSuccessUser] [datetime] NULL,
[FileTypeID] [int] NULL,
[HoldDate] [datetime] NULL,
file.FileTypeID = (int)reader["FileTypeID"];
同じ結果が得られます。
を行う
file.FileTypeID (int)reader.GetInt32(reader.GetOrdinal("FileTypeID"));
動作しますが、intとしてすでに戻ってくるはずのすべての列に対してこれを実行したくありません。このようなSQLも記述します。
select Convert(int, FileTypeID) as FileTypeId, delimeter, file_filetype.LocalPath, ArchiveDir, EmailList
問題を回避することもできますが、テーブルで型をintとして設定しているのに、なぜこれを行う必要があるのかを知りたいです。すべてのタイプを文字列としてテーブルに配置したほうがよいでしょう。この時点では、回避策を探していません。なぜそれが本来のように機能しないのかを理解したいと思います。