public string BindValues(CommandParams cmdParams, bool forPrepareStmt)
        {
            StringBuilder strBuilder = new StringBuilder();
            int           count      = _sqlSections.Count;

            for (int i = 0; i < count; i++)
            {
                var sqlSection = _sqlSections[i];
                switch (sqlSection.sectionKind)
                {
                default:
                    throw new NotSupportedException();

                case SqlSectionKind.SqlText:
                    strBuilder.Append(sqlSection.Text);
                    break;

                case SqlSectionKind.ValueKey:


                    if (forPrepareStmt)
                    {
                        strBuilder.Append('?');
                    }
                    else
                    {
                        //get bind data
                        MyStructData bindedData;
                        if (!cmdParams.TryGetData(sqlSection.Text, out bindedData))
                        {
                            throw new Exception("Error : This key not assign." + sqlSection.Text);
                        }
                        else
                        {
                            //format data
                            FormatAndAppendData(strBuilder, ref bindedData);
                        }
                    }
                    break;

                case SqlSectionKind.SpecialKey:
                    string found;
                    if (cmdParams.TryGetSqlPart(sqlSection.Text, out found))
                    {
                        strBuilder.Append(found);
                    }
                    else
                    {
                        throw new Exception("not found " + sqlSection.Text);
                    }
                    break;
                }
            }

            return(strBuilder.ToString());
        }