protected void CopyBinaryData(DBHelper source, string sourceTableName, string sourceBinColumn, string sourceIdentityColumn, object sourceId, DBHelper target, string targetTableName, string targetBinColumn, string targetIdentityColumn, SqlCommand cmd, SqlParameter paramTextPtr, SqlParameter paramData, SqlParameter paramId) { if (source == null) throw new ArgumentNullException("source"); if (cmd == null) throw new ArgumentNullException("cmd"); if (paramTextPtr == null) throw new ArgumentNullException("paramTextPtr"); if (target == null) throw new ArgumentNullException("target"); if (paramData == null) throw new ArgumentNullException("paramData"); object size = source.RunTextScalar(string.Format(CultureInfo.InvariantCulture, "SELECT DATALENGTH([{0}]) FROM [{1}] WHERE [{2}] = @id", sourceBinColumn, sourceTableName, sourceIdentityColumn), new SqlParameter("@id", sourceId)); if (size != null && size != DBNull.Value && (int)size > 0) { cmd.CommandText = string.Format(CultureInfo.InvariantCulture, "SET NOCOUNT ON UPDATE [{1}] SET [{0}] = 0x0 WHERE [{2}] = @id SELECT @ptr = TEXTPTR([{0}]) FROM [{1}] WHERE [{2}] = @id", targetBinColumn, targetTableName, targetIdentityColumn); cmd.Parameters.Clear(); cmd.Parameters.Add(paramId); cmd.Parameters.Add(paramTextPtr); paramTextPtr.Direction = ParameterDirection.Output; target.RunCmd(cmd); cmd.CommandText = string.Format(CultureInfo.InvariantCulture, "UPDATETEXT [{0}].[{1}] @ptr 0 NULL @data", targetTableName, targetBinColumn); cmd.Parameters.Clear(); cmd.Parameters.Add(paramData); cmd.Parameters.Add(paramTextPtr); paramTextPtr.Direction = ParameterDirection.Input; using (IDataReader reader = source.RunTextDataReaderBlob(string.Format(CultureInfo.InvariantCulture, "SELECT [{0}] FROM [{1}] WHERE [{2}] = @id", sourceBinColumn, sourceTableName, sourceIdentityColumn), new SqlParameter("@id", sourceId))) { if (reader.Read()) { long read, startIndex = 0; do { read = reader.GetBytes(0, startIndex, _buffer, 0, _binaryBufferSize); paramData.Size = (int)read; target.RunCmd(cmd); startIndex += read; cmd.CommandText = string.Format(CultureInfo.InvariantCulture, "UPDATETEXT [{0}].[{1}] @ptr NULL NULL @data", targetTableName, targetBinColumn); } while (read == _binaryBufferSize); } } } }