public Dictionary<string, List<SpColumn>> RetriveStoreProcedureParameterMeta(string[] storeProcedureNames)
 {
     var stroePorcedureParameterMeta = new Dictionary<string, List<SpColumn>>();
     for (int i = 0; i < storeProcedureNames.Length; i++)
     {
         List<SpColumn> columns = new List<SpColumn>();
         SqlParameterCollection collection = GetParameterCollectionByProcedure(storeProcedureNames[i]);
         for (int j = 0; j < collection.Count; j++)
         {
             SpColumn spColumn = new SpColumn();
             spColumn.CName = collection[j].ParameterName;
             spColumn.IsNullable = collection[j].IsNullable;
             spColumn.CType = DataTypeMapper.MapFromDBType(collection[j].SqlDbType.ToString());
             spColumn.Length = collection[j].Size;
             columns.Add(spColumn);
         }
         stroePorcedureParameterMeta.Add(storeProcedureNames[i], columns);
     }
     return stroePorcedureParameterMeta;
 }
        public Dictionary<string, List<SpColumn>> RetriveStoreProcedureResultMeta(Dictionary<string, string> storeProcedureFailed, string[] storeProcedureNames, [Optional, DefaultParameterValue(null)] Dictionary<string, SqlParameter[]> storeProcedureParameters)
        {
            var storeProcedureResultMeta = new Dictionary<string, List<SpColumn>>();
            SqlCommand innerCommand = new SqlCommand();
            SqlDataReader innerReader = null;
            innerCommand.CommandType = CommandType.StoredProcedure;
            innerCommand.Connection = connection;
            for (int i = 0; i < storeProcedureNames.Length; i++)
            {
                try
                {
                    List<SpColumn> columns = new List<SpColumn>();

                    innerCommand.CommandText = storeProcedureNames[i];
                    innerCommand.Parameters.Clear();
                    if (storeProcedureParameters == null)
                    {
                        SqlParameterCollection collection = GetParameterCollectionByProcedure(storeProcedureNames[i]);
                        for (int j = 0; j < collection.Count; j++)
                        {
                            if (collection[j].IsNullable)
                                continue;
                            SqlParameter newParameter = new SqlParameter(collection[j].ParameterName, collection[j].Value);
                            innerCommand.Parameters.Add(newParameter);
                        }
                    }
                    else
                    {
                        innerCommand.Parameters.AddRange(storeProcedureParameters[storeProcedureNames[i]]);
                    }
                    if (connection.State == System.Data.ConnectionState.Closed)
                        connection.Open();
                    innerReader = innerCommand.ExecuteReader(CommandBehavior.CloseConnection);
                    DataTable table = innerReader.GetSchemaTable();
                    if (table == null)
                    {
                        table = emptyDataTable;
                        innerReader.Close();
                    }

                    int emptyColumnNameSerial = 0;
                    for (int k = 0; k < table.Rows.Count; k++)
                    {
                        SpColumn spColumn = new SpColumn();
                        spColumn.CName = table.Rows[k]["ColumnName"].ToString().Trim() == "" ? "Column" + (++emptyColumnNameSerial) : table.Rows[k]["ColumnName"].ToString().Trim();
                        spColumn.IsNullable = true;
                        spColumn.CType = DataTypeMapper.MapFromDBType(table.Rows[k]["DataTypeName"].ToString());
                        columns.Add(spColumn);
                    }
                    storeProcedureResultMeta.Add(storeProcedureNames[i], columns);
                    innerReader.Close();
                }
                catch (Exception e)
                {
                    storeProcedureFailed.Add(storeProcedureNames[i], e.Message);
                }
                finally
                {
                    if (innerReader!=null && !innerReader.IsClosed)
                        innerReader.Close();
                }
            }
            return storeProcedureResultMeta;
        }
 public void FillParameter(StoreProcedure sp)
 {
     List<SpColumn> columns = new List<SpColumn>();
     SqlParameterCollection collection = GetParameterCollectionByProcedure(sp.Name);
     for (int j = 0; j < collection.Count; j++)
     {
         SpColumn spColumn = new SpColumn();
         spColumn.CName = collection[j].ParameterName;
         spColumn.IsNullable = collection[j].IsNullable;
         spColumn.CType = DataTypeMapper.MapFromDBType(collection[j].SqlDbType.ToString());
         columns.Add(spColumn);
     }
     sp.Parameters = columns;
 }