0

我有一个关于根据字符长度将字符串消息分成三部分的问题。原因是我的存储过程不会超过 32767 个字符。(pl/sql 有效负载)因此,我想向存储过程发送三个消息(三个 clob),该存储过程可以附加这些消息并将其发送到队列。

如果我有一个最好的解决方案,string message并且我需要将它计算为三个部分,其中消息的最大长度可以是 32.000 个字符?

存储过程需要什么:(qname IN varchar2, i_clob1 IN clob, i_clob2 IN clob, i_clob3 IN clob)

如果string message第一部分少于 32.000 个字符,如何分三部分发送,但我还是想分三部分发送?

这是我的代码,它接收一条消息(i_clob)。

 public void Enqueue(string queueName, string mess)
        {
            OracleCommand cmd = null;
            try
            {
                cmd = new OracleCommand("", m_Connection)
                    {
                        CommandText = m_InSpName,
                        CommandType = CommandType.StoredProcedure
                    };


                //add Aq queue name 
                OracleParameter qName = new OracleParameter("qname", OracleType.VarChar)
                    {
                        Direction = ParameterDirection.Input,
                        Value = queueName
                    };

                //add message to enqueue
                OracleParameter message = new OracleParameter("i_clob", OracleType.Clob)
                    {
                        Direction = ParameterDirection.Input
                    };
                mess = mess.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "");
                message.Value = mess;

                cmd.Parameters.Add(qName);
                cmd.Parameters.Add(message);

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                //rethrow exception and make sure we clean up i.e. execute finally below
                throw new Exception("An error occurred trying to deliver the message to the queue", ex);
            }
            finally
            {
                if (cmd != null)
                {
                    cmd.Dispose();
                }
            }
        }
4

2 回答 2

3

我了解您正在寻找以下内容:

string i_clob1 = "";
string i_clob2 = "";
string i_clob3 = "";
if (message.Length >= 3 && message.Length <= 32000 * 3)
{
    int lastStart = 2 * message.Length / 3;
    int lastLength = message.Length - lastStart;
    i_clob1 = message.Substring(0, message.Length / 3);
    i_clob2 = message.Substring(message.Length / 3, message.Length / 3);
    i_clob3 = message.Substring(lastStart, lastLength);
}
else if (message.Length < 3)
{
    i_clob1 = message;
}
于 2013-11-13T12:37:58.717 回答
0

这是一个通用的字符串拆分器:

private IEnumerable<string> SplitString(string incomingString, int numberToCut)
    {
        int nombreDeCaractere = incomingString.Length;
        List<string> result = new List<string>();
        string temp = string.Empty;
        int curseur = 0;
        do
        {
            for (int i = 0; i < numberToCut - 1; i++)
            {
                temp += incomingString.Substring(i + curseur, 1);
            }

            result.Add(temp);
            temp = string.Empty;
            curseur += numberToCut;
        } while (nombreDeCaractere >= curseur + numberToCut);

        temp = string.Empty;
        for (int i = curseur; i < nombreDeCaractere; i++)
        {
            temp += incomingString.Substring(i, 1);
        }

        result.Add(temp);

        return result;
    }
于 2013-11-13T16:42:56.927 回答