Newbie

R

Rob

I am trying to modify the code below (taken from
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/denet9/html/5a188b50-7170-4069-acad-5de5c915f65d.htm
) to take in another parameter. The class concatenates a list of values
using a comma as the delimiter. I want to be able to pass in the delimiter
instead of a hard coded comma.
I have not used C# in the past and don't know where to begin. Any guidance
would be greatly appreciated.

using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.IO;
using System.Text;

[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined, //use clr serialization to serialize the
intermediate result
IsInvariantToNulls = true, //optimizer property
IsInvariantToDuplicates = false, //optimizer property
IsInvariantToOrder = false, //optimizer property
MaxByteSize = 8000) //maximum size in bytes of persisted value
]
public class Concatenate : IBinarySerialize
{
/// <summary>
/// The variable that holds the intermediate result of the concatenation
/// </summary>
private StringBuilder intermediateResult;

/// <summary>
/// Initialize the internal data structures
/// </summary>
public void Init()
{
this.intermediateResult = new StringBuilder();
}

/// <summary>
/// Accumulate the next value, not if the value is null
/// </summary>
/// <param name="value"></param>
public void Accumulate(SqlString value)
{
if (value.IsNull)
{
return;
}

this.intermediateResult.Append(value.Value).Append(','); /// I want
to replace ',' with a passed in delimiter.
}

/// <summary>
/// Merge the partially computed aggregate with this aggregate.
/// </summary>
/// <param name="other"></param>
public void Merge(Concatenate other)
{
this.intermediateResult.Append(other.intermediateResult);
}

/// <summary>
/// Called at the end of aggregation, to return the results of the
aggregation.
/// </summary>
/// <returns></returns>
public SqlString Terminate()
{
string output = string.Empty;
//delete the trailing comma, if any
if (this.intermediateResult != null
&& this.intermediateResult.Length > 0)
{
output = this.intermediateResult.ToString(0,
this.intermediateResult.Length - 1);
}

return new SqlString(output);
}

public void Read(BinaryReader r)
{
intermediateResult = new StringBuilder(r.ReadString());
}

public void Write(BinaryWriter w)
{
w.Write(this.intermediateResult.ToString());
}
}
 
J

Jay

Rob said:
I am trying to modify the code below (taken from
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/denet9/html/5a188b50-7170-4069-acad-5de5c915f65d.htm
) to take in another parameter. The class concatenates a list of values
using a comma as the delimiter. I want to be able to pass in the delimiter
instead of a hard coded comma.
I have not used C# in the past and don't know where to begin. Any guidance
would be greatly appreciated.


Rob,

You can add a parameter to the Accumulate function that contains the
delimiter you want to use. Something like this:

public void Accumulate(SqlString value, char delimiter) {
if (value.IsNull) {
return;
}
this.intermediateResult.Append(value.Value).Append(delimiter);
}


HTH,
-Jay
 
C

chanmm

Well, there is another an angle you can look at it. Perhaps you can using
String.Replace to change your delimiter to comma.

chanmm
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top