Beispiel #1
0
		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);
					}
				}
			}
		}