私は、次の形式で、SQL Serverのテーブルにファイルを格納しています:SQL ServerとC# - アップロードするvarbinary(max)ファイルが既にテーブルに存在するかどうかを確認する方法はありますか
FILEID - int型(自動インクリメント)、 ファイル名 - VARBINARY(MAX)、 FILEDATA - varbinary型(MAX)を。
私は何をしたいのです - パラメータとして新しいファイル名&、FILEDATAをアップロードして、最初のfileIDを返すところそれほどのようなファイル名&ファイルデータが一致し、:
SqlCommand cmd = new SqlCommand("SELECT TOP 1 FileID FROM Attachments WHERE FileName = @FileName AND FileData = @FileData", Program.connection);
cmd.Parameters.AddWithValue("@FileName", Path.GetFileName(MyFile));
cmd.Parameters.Add("@FileData", SqlDbType.VarBinary).Value = File.ReadAllBytes(MyFile);
int result = (int)cmd.ExecuteScalar();
しかし、私は何をすべきかに関係なく、 、最後の行で実際にクエリを実行するときに関数は(例外なく)終了するだけです。私は間違って何をしていますか?
各ファイルのデータを取得したくない場合は、可能であればC#で比較してください。&
チェックサムまたはハッシュのいくつかの形式を考慮したので、実行する必要がある完全な比較の数を大幅に減らすことができます。 –
サイドノート:ファイルの_contents_を比較しないでください。代わりに、ファイルハッシュを計算し、内容と一緒に格納します。次に、アップロード時に、ハッシュを計算し、データベースに格納されているものと比較します。ハッシュは非常に短いので、はるかに効率的です。 – Evk
"可能であれば、各ファイルのデータを取得せずにC#で比較したいと思っています。"ファイル全体を読み込んでSQL Serverにアップロードし、比較を行うことを求めることはほとんど効率的ではありません。他の人が言ったように、衝突の可能性を十分に小さくして、可能性を考慮する必要がないような(良い、暗号指向の)チェックサムを採用します。 –