コード例 #1
0
 protected virtual OrganizationRequestBuilderVisitor GetVisitor(CrmDbCommand command)
 {
     var metaDataProvider = command.CrmDbConnection.MetadataProvider;
     var commandParams = command.Parameters;
     var settings = command.CrmDbConnection.Settings;
     return new OrganizationRequestBuilderVisitor(metaDataProvider, commandParams, _DynamicsAttributeTypeProvider, settings);
 }
コード例 #2
0
        public void Should_Support_Deletion_Of_A_Single_Entity_By_Id()
        {
            // Arrange
            Guid id = Guid.NewGuid();

            var sql = "DELETE FROM contact WHERE contactid = '" + id + "'";

            // set up fake metadata provider.
              //  var fakeMetadataProvider = MockRepository.GenerateMock<ICrmMetaDataProvider>();
               // var fakeMetadata = GetFakeContactMetadata();
               // fakeMetadataProvider.Stub(a => a.GetEntityMetadata("contact")).Return(fakeMetadata);
            var fakeConn = MockRepository.GenerateMock<CrmDbConnection>();
            fakeConn.Stub(a => a.MetadataProvider).Return(new FakeContactMetadataProvider());

            var cmd = new CrmDbCommand(fakeConn);
            cmd.CommandText = sql;

            // Act
            var deleteRequest = GetOrganizationRequest<DeleteRequest>(cmd);

            // Assert
            EntityReference targetEntityRef = deleteRequest.Target;
            Assert.That(targetEntityRef, Is.Not.Null);
            Assert.That(targetEntityRef.Id, Is.EqualTo(id));
        }
コード例 #3
0
 private ICrmOperation GetOperationFromTableDirectCommand(CrmDbCommand command, CommandBehavior behavior)
 {
     // No need to parse the command text as SQL because table direct commands should just contain the table name.
     // Therefore just construct a command that will execute a retreive multiple for the entity name specified.
     var request = GetRetrieveMultipleRequest(command, behavior);
     var result = new SelectMultipleEntitiesOperation(null, request);
     result.CommandBehavior = behavior;
     result.DbCommand = command;
     // result.OperationType = Enums.CrmOperation.RetrieveMultiple;
     return result;
 }
        public void Should_Support_Parameters(string filterOperator, object value, string filterFormatString)
        {
            // Arrange
            // Formulate DML (SQL) statement from test case data.
            var columnName = "firstname";
            if (value == null || !value.GetType().IsArray)
            {
                filterFormatString = string.Format(filterFormatString, columnName, filterOperator);
            }
            else
            {
                throw new NotImplementedException();
            }
            var sql = string.Format("Select contactid, firstname, lastname From contact Where {0} ", filterFormatString);

            // Create test subject.
            using (var sandbox = RequestProviderTestsSandbox.Create())
            {
                var cmd = new CrmDbCommand(sandbox.FakeCrmDbConnection);
                cmd.CommandText = sql;
                var param = cmd.CreateParameter();
                param.ParameterName = "@param1";
                param.Value = value;
                cmd.Parameters.Add(param);

                // Act
                var subject = ResolveTestSubjectInstance();

                // Act
                // Ask our test subject to Convert the SelectBuilder to a Query Expression.
                var queryExpression = base.GetQueryExpression(cmd);

                // Assert
                // Verify that the Query Expression looks as expected in order to work agaisnt the Dynamics SDK.
                Assert.That(queryExpression.ColumnSet.AllColumns == false);
                Assert.That(queryExpression.ColumnSet.Columns[0] == "contactid");
                Assert.That(queryExpression.ColumnSet.Columns[1] == "firstname");
                Assert.That(queryExpression.EntityName == "contact");

                //var defaultConditons = queryExpression.Criteria.Conditions;
                var defaultConditons = queryExpression.Criteria.Filters[0].Conditions;

                Assert.That(defaultConditons.Count, Is.EqualTo(1));
                //Assert.That(defaultFilterGroup.FilterOperator, Is.EqualTo(LogicalOperator.And));
                Assert.That(defaultConditons[0].AttributeName == "firstname");

                var condition = defaultConditons[0];
                AssertUtils.AssertFilterExpressionContion("firstname", filterOperator, value, condition);
            }
        }
コード例 #5
0
        public ICrmOperation GetOperation(CrmDbCommand command, CommandBehavior behavior)
        {
            bool schemaOnly = (behavior & CommandBehavior.SchemaOnly) > 0;
            ICrmOperation result = null;

            switch (command.CommandType)
            {
                case CommandType.StoredProcedure:
                    throw new System.NotImplementedException();

                case CommandType.TableDirect:
                    result = GetOperationFromTableDirectCommand(command, behavior);
                    break;
                case CommandType.Text:
                    result = GetOperationFromTextCommand(command, behavior);
                    break;
                default:
                    throw new System.NotImplementedException();
            }
            return result;
        }
コード例 #6
0
        public DataTable GetForeignKeys(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            // throw new NotImplementedException();

            string catalog = GetRestrictionOrNull(0, restrictions);
            string schema = GetRestrictionOrNull(1, restrictions);
            string constraintTable = GetRestrictionOrNull(2, restrictions);
            string constraintName = GetRestrictionOrNull(3, restrictions);

            //  string entityName = GetRestrictionOrNull(0, restrictions);
            // string constraintName = GetRestrictionOrNull(1, restrictions);
            bool hasConstraintTableFilter = !string.IsNullOrEmpty(constraintTable);
            bool hasConstraintNameFilter = !string.IsNullOrEmpty(constraintName);

            string commandText = "SELECT o.* FROM entitymetadata e INNER JOIN onetomanyrelationshipmetadata o ON e.MetadataId = o.MetadataId ";

            if (hasConstraintTableFilter || hasConstraintNameFilter)
            {
                commandText += "WHERE ";
                if (hasConstraintTableFilter)
                {
                    commandText += " (e.LogicalName = '" + constraintTable + "') AND (o.referencingentity = '" + constraintTable + "')";
                }
                if (hasConstraintTableFilter && hasConstraintNameFilter)
                {
                    commandText += " AND ";
                }
                if (hasConstraintNameFilter)
                {
                    commandText += " (o.SchemaName = '" + constraintName + "')";
                }
            }

            var command = new CrmDbCommand(crmDbConnection);
            command.CommandText = commandText;
            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;
            adapter.Fill(dataTable);

            //  dataTable.AsDataView().RowFilter = "ReferencingEntity = '" + entityName +

            dataTable.Columns.Add("CONSTRAINT_CATALOG", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(0);
            dataTable.Columns.Add("CONSTRAINT_SCHEMA", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(1);

            dataTable.Columns.Add("CONSTRAINT_NAME", typeof(string), "o.schemaname").SetOrdinal(2);

            //dataTable.Columns["o.schemaname"].ColumnName = "CONSTRAINT_NAME";
            //dataTable.Columns["CONSTRAINT_NAME"].SetOrdinal(2);

            //   dataTable.Columns.Add("CONSTRAINT_NAME", typeof(string), "''");

            dataTable.Columns.Add("TABLE_CATALOG", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(3);
            dataTable.Columns.Add("TABLE_SCHEMA", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(4);

            dataTable.Columns["o.referencingentity"].ColumnName = "TABLE_NAME";
            dataTable.Columns["TABLE_NAME"].SetOrdinal(5);

            dataTable.Columns.Add("CONSTRAINT_TYPE", typeof(string), "'FOREIGN KEY'").SetOrdinal(6);

            dataTable.Columns.Add("IS_DEFERRABLE", typeof(string), "'NO'").SetOrdinal(7);
            dataTable.Columns.Add("INITIALLY_DEFERRED", typeof(string), "'NO'").SetOrdinal(8);

            //if (hasEntityFilter)
            //{
            //    filteredView.RowFilter = "TABLE_NAME = '" + entityName + "'";
            //}
            //dataTable = filteredView.ToTable(true);

            if (hasConstraintNameFilter)
            {
                var filteredView = dataTable.AsDataView();
                filteredView.RowFilter = "CONSTRAINT_NAME = '" + constraintName + "'";
                dataTable = filteredView.ToTable(true);
            }

            //else
            //{
            //    dataTable = filteredView.ToTable(true);
            //}

            return dataTable;
        }
コード例 #7
0
        public DataTable GetForeignKeyColumns(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            string catalog = GetRestrictionOrNull(0, restrictions);
            string schema = GetRestrictionOrNull(1, restrictions);
            string table = GetRestrictionOrNull(2, restrictions);
            string constraintname = GetRestrictionOrNull(3, restrictions);
            string columnname = GetRestrictionOrNull(4, restrictions);

            bool hasEntityFilter = !string.IsNullOrEmpty(table);
            bool hasColumnFilter = !string.IsNullOrEmpty(columnname);
            bool hasConstraintNameFilter = !string.IsNullOrEmpty(constraintname);

            string commandText = "SELECT o.* FROM entitymetadata e INNER JOIN onetomanyrelationshipmetadata o ON e.MetadataId = o.MetadataId";

            if (hasEntityFilter || hasColumnFilter || hasConstraintNameFilter)
            {
                commandText += " WHERE ";
                if (hasEntityFilter)
                {
                    commandText += " (e.LogicalName = '" + table + "') AND (o.ReferencingEntity = '" + table + "')";
                }
                if (hasEntityFilter && (hasConstraintNameFilter || hasColumnFilter))
                {
                    commandText += " AND ";
                }
                if (hasConstraintNameFilter)
                {
                    commandText += " (o.SchemaName = '" + constraintname + "')";
                }
                if (hasConstraintNameFilter && hasColumnFilter)
                {
                    commandText += " AND ";
                }
                if (hasColumnFilter)
                {
                    commandText += " (o.ReferencingAttribute = '" + columnname + "')";
                }
            }

            var command = new CrmDbCommand(crmDbConnection);
            command.CommandText = commandText;
            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;
            adapter.Fill(dataTable);

            // need to get columns seperately then join to get column ordinal
            commandText = "SELECT entitymetadata.LogicalName, a.LogicalName, a.ColumnNumber FROM entitymetadata JOIN attributemetadata a on entitymetadata.MetadataId = a.MetadataId";

            if (hasEntityFilter || hasColumnFilter)
            {
                commandText += "AND ";
                if (hasEntityFilter)
                {
                    commandText += " (entitymetadata.LogicalName = '" + table + "')";
                }
                if (hasEntityFilter && hasColumnFilter)
                {
                    commandText += " AND ";
                }
                if (hasColumnFilter)
                {
                    commandText += " (a.LogicalName = '" + columnname + "')";
                }
            }

            //var columnsCommand = new CrmDbCommand(crmDbConnection);
            //columnsCommand.CommandText = commandText;
            //var columnsAdaptor = new CrmDataAdapter(columnsCommand);
            //var columnsDatatable = new DataTable();
            //columnsDatatable.Locale = CultureInfo.InvariantCulture;
            //columnsAdaptor.Fill(columnsDatatable);

            //DataSet fkInfoDataset = new DataSet();
            //fkInfoDataset.Tables.Add(dataTable);
            //fkInfoDataset.Tables.Add(columnsDatatable);

            //var parentCols = new DataColumn[] { dataTable.Columns["e.LogicalName"], dataTable.Columns["o.ReferencingAttribute"] };
            //var childCols = new DataColumn[] { columnsDatatable.Columns["LogicalName"], columnsDatatable.Columns["a.LogicalName"] };
            //DataRelation columnInfoRelation = new DataRelation("columnJoin", parentCols, childCols);
            //fkInfoDataset.Relations.Add(columnInfoRelation);

            //var view = dataTable.AsDataView();
            //view.j

            dataTable.Columns.Add("constraint_catalog", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(0);
            dataTable.Columns.Add("constraint_schema", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(1);
            dataTable.Columns.Add("constraint_name", typeof(string), "o.schemaname").SetOrdinal(2);

            dataTable.Columns.Add("table_catalog", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(3);
            dataTable.Columns.Add("table_schema", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(4);
            dataTable.Columns["o.ReferencingEntity"].ColumnName = "table_name";
            dataTable.Columns["table_name"].SetOrdinal(5);

            dataTable.Columns.Add("column_name", typeof(string), "o.ReferencingAttribute").SetOrdinal(6);

            dataTable.Columns.Add("ordinal_position", typeof(int)).SetOrdinal(7); // TODO: FIX THIS ORDINAL!

            //  dataTable.Columns["a.columnnumber"].ColumnName = "ordinal_position";
            // dataTable.Columns["ordinal_position"].SetOrdinal(7);

            dataTable.Columns.Add("constraint_type", typeof(string), "'FOREIGN KEY'").SetOrdinal(8);
            dataTable.Columns.Add("index_name", typeof(string), "constraint_name").SetOrdinal(9);

            //foreach (DataRow item in dataTable.Rows)
            //{
            //    var columnName = (string)item["column_name"];

            //    var columnAttInfos = item.GetChildRows(columnInfoRelation);
            //    if (columnAttInfos == null || !columnAttInfos.Any())
            //    {
            //        throw new InvalidOperationException("Could not find column attribute information for a one to many relationsnip column: " + columnName);
            //    }

            //    var singleColumnInfo = columnAttInfos.Single();
            //    item["ordinal_position"] = (int)singleColumnInfo["a.columnnumber"];
            //    // var columnResult = columnsDatatable.Rows.Find(myUserID);
            //}

            //  dataTable.Columns.Add("constraint_name", typeof(string), "'FK__' + IsNull(table_name, '') + '_' + IsNull(column_name, PrimaryIdAttribute)").SetOrdinal(2);

            //  dataTable.Columns["column_name"].SetOrdinal(6);

            //   dataTable.Columns.Add("KeyType", typeof(Byte), "36").SetOrdinal(8); // 36 = uniqueidentitifer datatype - all pk indexes in crm are uniqueidentifiers.
            //  dataTable.Columns.Add("type_desc", typeof(string), "'CLUSTERED'");

            //var filteredView = dataTable.AsDataView();
            //filteredView.RowFilter = "column_name = PrimaryIdAttribute";  // necessary due to #68
            //dataTable = filteredView.ToTable(true);

            //if (hasConstraintNameFilter)
            //{
            //    var filteredView = dataTable.AsDataView();
            //    filteredView.RowFilter = "constraint_name = '" + constraintname + "'";
            //    dataTable = filteredView.ToTable(true);
            //}

            return dataTable;
        }
コード例 #8
0
        public DataTable GetUsers(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            var command = new CrmDbCommand(crmDbConnection);
            command.CommandText = "SELECT su.systemuserid, su.fullname, su.domainname, su.createdon, su.modifiedon FROM systemuser su";

            if (restrictions != null && restrictions.Any())
            {
                string userName = restrictions[0];
                command.CommandText = string.Format("{0} WHERE su.fullname = {1}", command.CommandText, userName);
            }
            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;
            adapter.Fill(dataTable);
            return dataTable;
        }
コード例 #9
0
        public DataTable GetUniqueKeys(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            // throw new NotImplementedException();

            string entityName = GetRestrictionOrNull(0, restrictions);
            bool hasEntityFilter = !string.IsNullOrEmpty(entityName);

            string constraintName = GetRestrictionOrNull(1, restrictions);
            bool hasConstraintNameFilter = !string.IsNullOrEmpty(constraintName);

            string commandText = "SELECT * FROM entitymetadata";

            if (hasEntityFilter || hasConstraintNameFilter)
            {
                commandText += " WHERE";
                if (hasEntityFilter)
                {
                    commandText += " (LogicalName = '" + entityName + "')";
                }
                //if (hasEntityFilter && hasConstraintNameFilter)
                //{
                //    commandText += " AND ";
                //}
                //if (hasConstraintNameFilter)
                //{
                //    commandText += " (SchemaName = '" + constraintName + "')";
                //}
            }

            var command = new CrmDbCommand(crmDbConnection);
            command.CommandText = commandText;
            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;
            adapter.Fill(dataTable);

            //  dataTable.AsDataView().RowFilter = "ReferencingEntity = '" + entityName +

            dataTable.Columns.Add("CONSTRAINT_CATALOG", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(0);
            dataTable.Columns.Add("CONSTRAINT_SCHEMA", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(1);

            dataTable.Columns.Add("CONSTRAINT_NAME", typeof(string), "'PK__' + LogicalName + '_' + IsNull(PrimaryIdAttribute, LogicalName + 'id')").SetOrdinal(2);

            // dataTable.Columns["SchemaName"].ColumnName = "CONSTRAINT_NAME";
            // dataTable.Columns["CONSTRAINT_NAME"].SetOrdinal(2);

            //   dataTable.Columns.Add("CONSTRAINT_NAME", typeof(string), "''");

            dataTable.Columns.Add("TABLE_CATALOG", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(3);
            dataTable.Columns.Add("TABLE_SCHEMA", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(4);
            dataTable.Columns.Add("TABLE_NAME", typeof(string), "LogicalName").SetOrdinal(5);

            //    dataTable.Columns["LogicalName"].ColumnName = "TABLE_NAME";
            //      dataTable.Columns["TABLE_NAME"].SetOrdinal(5);

            dataTable.Columns.Add("CONSTRAINT_TYPE", typeof(string), "'PRIMARY KEY'").SetOrdinal(6);

            dataTable.Columns.Add("IS_DEFERRABLE", typeof(string), "'NO'").SetOrdinal(7);
            dataTable.Columns.Add("INITIALLY_DEFERRED", typeof(string), "'NO'").SetOrdinal(8);

            if (hasConstraintNameFilter)
            {
                var filteredView = dataTable.AsDataView();
                filteredView.RowFilter = "CONSTRAINT_NAME = '" + constraintName + "'";
                dataTable = filteredView.ToTable(true);
            }

            return dataTable;

            //else
            //{
            //    dataTable = filteredView.ToTable(true);
            //}
        }
コード例 #10
0
        public DataTable GetTables(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            //            table_catalog
            //table_schema
            //table_name
            //table_type
            //Type of table. Can be VIEW or BASE TABLE.

            var command = new CrmDbCommand(crmDbConnection);
            string commandText = "SELECT * FROM EntityMetadata";

            string catalog = GetRestrictionOrNull(0, restrictions);
            string schema = GetRestrictionOrNull(1, restrictions);
            string tableName = GetRestrictionOrNull(2, restrictions);
            string tableType = GetRestrictionOrNull(3, restrictions); // doesn't matter currently what tabletype restriction is specified, we only return "base tables" not views.

            if (catalog != null && catalog.ToLowerInvariant() != crmDbConnection.ConnectionInfo.OrganisationName.ToLowerInvariant())
            {
                // we only support the catalog currently connected to, can't query accross other catalogs.
                throw new ArgumentException("invalid catalog restriction. no such catalog.");
            }

            if (schema != null && schema.ToLowerInvariant() != DefaultSchema.ToLowerInvariant())
            {
                // we only support a single schema "dbo".
                throw new ArgumentException("invalid schema restriction. no such schema.");
            }

            if (!string.IsNullOrEmpty(tableName))
            {
                commandText = commandText + " WHERE LogicalName = '" + tableName + "'";
            }

            command.CommandText = commandText;

            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;
            adapter.Fill(dataTable);
            dataTable.Columns.Add("TABLE_CATALOG", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(0);
            dataTable.Columns.Add("TABLE_SCHEMA", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(1);
            dataTable.Columns["logicalname"].ColumnName = "TABLE_NAME";
            dataTable.Columns["TABLE_NAME"].SetOrdinal(2);
            dataTable.Columns.Add("TABLE_TYPE", typeof(string), "'BASE TABLE'").SetOrdinal(3);
            return dataTable;
        }
コード例 #11
0
 private RetrieveMultipleRequest GetRetrieveMultipleRequest(CrmDbCommand command, CommandBehavior behavior)
 {
     var entityName = command.CommandText;
     if (entityName.Contains(" "))
     {
         throw new ArgumentException("When CommandType is TableDirect, CommandText should be the name of an entity.");
     }
     var request = new RetrieveMultipleRequest()
     {
         Query = new QueryExpression(entityName) { ColumnSet = new ColumnSet(true), PageInfo = new PagingInfo() { ReturnTotalRecordCount = true } }
     };
     return request;
 }
コード例 #12
0
        public void Should_Be_Able_To_Query_Using_Filter_Groups(String joinType, string whereClause, int expectedResults)
        {
            // var join = JoinOperator.Natural;

            //switch (joinType)
            //{
            //    case "INNER":
            //        join = JoinOperator.Inner;
            //        //  Enum.Parse(typeof(JoinOperator), joinType)
            //        break;
            //    case "LEFT":
            //        join = JoinOperator.LeftOuter;
            //        break;
            //}

            var sql = string.Format("Select C.contactid, C.firstname, C.lastname, A.line1, A.customeraddressid From contact C {0} JOIN customeraddress A on C.contactid = A.parentid WHERE {1}", joinType, whereClause);

            var cmd = new CrmDbCommand(null);
            cmd.CommandText = sql;

            var connectionString = ConfigurationManager.ConnectionStrings["CrmOrganisation"];
            using (var conn = new CrmDbConnection(connectionString.ConnectionString))
            {
                conn.Open();
                var command = conn.CreateCommand();

                Console.WriteLine("Executing command " + sql);
                command.CommandText = sql;
                //   command.CommandType = CommandType.Text;

                using (var reader = command.ExecuteReader())
                {
                    int resultCount = 0;
                    foreach (var result in reader)
                    {
                        resultCount++;
                        var contactId = (Guid)reader["C.contactid"];
                        var firstName = (string)reader.SafeGetString(1);
                        var lastName = (string)reader.SafeGetString(2);
                        var line1 = (string)reader.SafeGetString(3);
                        var alsoLine1 = (string)reader.SafeGetString("A.line1");
                        var customerAddressId = (Guid)reader["A.customeraddressid"];
                        Console.WriteLine(string.Format("{0} {1} {2} {3} {4}", contactId, firstName, lastName, line1, customerAddressId));
                    }
                    Console.WriteLine("There were " + resultCount + " results..");
                    Assert.That(resultCount, Is.EqualTo(expectedResults));
                }
            }
        }
コード例 #13
0
        public void Should_Be_Able_To_Select_From_Table_Prefixed_With_Dbo_Schema(String schemaPrefix)
        {
            var sql = string.Format("Select C.contactid, C.firstname, C.lastname From {0}.contact C", schemaPrefix);

            var cmd = new CrmDbCommand(null);
            cmd.CommandText = sql;

            var connectionString = ConfigurationManager.ConnectionStrings["CrmOrganisation"];
            using (var conn = new CrmDbConnection(connectionString.ConnectionString))
            {
                conn.Open();
                var command = conn.CreateCommand();

                Console.WriteLine("Executing command " + sql);
                command.CommandText = sql;
                //   command.CommandType = CommandType.Text;

                using (var reader = command.ExecuteReader())
                {
                    int resultCount = 0;
                    foreach (var result in reader)
                    {
                        resultCount++;
                        var contactId = (Guid)reader["C.contactid"];
                        var firstName = (string)reader.SafeGetString(1);
                        var lastName = (string)reader.SafeGetString(2);
                        Console.WriteLine(string.Format("{0} {1} {2}", contactId, firstName, lastName));
                    }
                    Console.WriteLine("There were " + resultCount + " results..");
                }
            }
        }
コード例 #14
0
        public DataTable GetIndexes(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            string catalog = GetRestrictionOrNull(0, restrictions);
            string schema = GetRestrictionOrNull(1, restrictions);
            string table = GetRestrictionOrNull(2, restrictions);
            string constraintName = GetRestrictionOrNull(3, restrictions);

            bool hasEntityFilter = !string.IsNullOrEmpty(table);
            bool hasConstraintNameFilter = !string.IsNullOrEmpty(constraintName);

            string commandText = "SELECT LogicalName, PrimaryIdAttribute FROM entitymetadata ";

            if (hasEntityFilter || hasConstraintNameFilter)
            {
                commandText += "WHERE ";
                if (hasEntityFilter)
                {
                    commandText += " (LogicalName = '" + table + "')";
                }
                //if (hasEntityFilter && hasConstraintNameFilter)
                //{
                //    commandText += " AND ";
                //}
                //if (hasConstraintNameFilter)
                //{
                //    commandText += " (PrimaryIdAttribute = '" + constraintName + "')";
                //}
            }

            var command = new CrmDbCommand(crmDbConnection);
            command.CommandText = commandText;
            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;
            adapter.Fill(dataTable);

            //          <Indexes>
            //  <constraint_catalog>PortalDarrellDev</constraint_catalog>
            //  <constraint_schema>dbo</constraint_schema>
            //  <constraint_name>PK__tmp_ms_x__3214EC0737311087</constraint_name>
            //  <table_catalog>PortalDarrellDev</table_catalog>
            //  <table_schema>dbo</table_schema>
            //  <table_name>Table</table_name>
            //  <index_name>PK__tmp_ms_x__3214EC0737311087</index_name>
            //  <type_desc>CLUSTERED</type_desc>
            //</Indexes>

            dataTable.Columns.Add("constraint_catalog", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(0);
            dataTable.Columns.Add("constraint_schema", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(1);
            dataTable.Columns.Add("constraint_name", typeof(string), "'PK__' + [LogicalName] + '_' + [PrimaryIdAttribute]").SetOrdinal(2);

            dataTable.Columns.Add("table_catalog", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(3);
            dataTable.Columns.Add("table_schema", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(4);
            dataTable.Columns.Add("table_name", typeof(string), "[LogicalName]").SetOrdinal(5);

            //dataTable.Columns["LogicalName"].ColumnName = "table_name";
            // dataTable.Columns["table_name"].SetOrdinal(5);

            dataTable.Columns.Add("index_name", typeof(string), "constraint_name").SetOrdinal(6);
            dataTable.Columns.Add("type_desc", typeof(string), "'CLUSTERED'").SetOrdinal(7);

            if (hasConstraintNameFilter)
            {
                var filteredView = dataTable.AsDataView();
                filteredView.RowFilter = "constraint_name = '" + constraintName + "'";
                dataTable = filteredView.ToTable(true);
            }

            return dataTable;
        }
コード例 #15
0
        private ICrmOperation GetOperationFromTextCommand(CrmDbCommand command, CommandBehavior behavior)
        {
            // We actually need to parse the SQL, and then build the appropriate organisation request.

            var commandText = command.CommandText;

            // Use SQLGeneration to parse the SQL command into a Visitable Builder.
            var commandBuilder = new CommandBuilder();
            var options = new CommandBuilderOptions();
            options.PlaceholderPrefix = ParameterToken;
            var sqlCommandBuilder = commandBuilder.GetCommand(commandText, options);

            // Visit the builder with out custom visiter that will build the appropriate org request whilst visiting.
            var visitor = GetVisitor(command);
            if (visitor == null)
            {
                throw new InvalidOperationException("visitor was null");
            }
            sqlCommandBuilder.Accept(visitor);

            // The visitor should now have vuild the OrgCommand that we need.
            var orgCommand = visitor.CrmOperation;
            if (orgCommand == null || orgCommand.Request == null)
            {
                throw new NotSupportedException("Could not translate the command into the appropriate Organization Service Request Message");
            }

            // Before returning the command, ensure some additional properties are set.
            orgCommand.DbCommand = command;
            orgCommand.CommandBehavior = behavior;
            return orgCommand;
        }
コード例 #16
0
        public DataTable GetColumns(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            //TABLE_CATALOG
            //TABLE_SCHEMA
            //TABLE_NAME
            //COLUMN_NAME
            //ORDINAL_POSITION
            //COLUMN_DEFAULT
            //IS_NULLABLE
            //DATA_TYPE
            //CHARACTER_MAXIMUM_LENGTH
            //CHARACTER_OCTET_LENGTH
            //NUMERIC_PRECISION
            //NUMERIC_PRECISION_RADIX
            //NUMERIC_SCALE
            //DATETIME_PRECISION
            //CHARACTER_SET_CATALOG
            //CHARACTER_SET_SCHEMA
            //CHARACTER_SET_NAME
            //COLLATION_CATALOG
            //IS_SPARSE
            //IS_COLUMN_SET
            //IS_FILESTREAM
            string catalog = GetRestrictionOrNull(0, restrictions);
            string schema = GetRestrictionOrNull(1, restrictions);
            string entityName = GetRestrictionOrNull(2, restrictions);
            string attributeName = GetRestrictionOrNull(3, restrictions);
            bool hasEntityFilter = false;
            bool hasAttributeFilter = false;

            if (catalog != null && catalog.ToLowerInvariant() != crmDbConnection.ConnectionInfo.OrganisationName.ToLowerInvariant())
            {
                // we only support the catalog currently connected to, can't query accross other catalogs.
                throw new ArgumentException("invalid catalog restriction. no such catalog.");
            }

            if (schema != null && schema.ToLowerInvariant() != DefaultSchema.ToLowerInvariant())
            {
                // we only support a single schema "dbo".
                throw new ArgumentException("invalid schema restriction. no such schema.");
            }

            hasEntityFilter = !string.IsNullOrEmpty(entityName);
            hasAttributeFilter = !string.IsNullOrEmpty(attributeName);

            var commandText = "SELECT entitymetadata.PrimaryIdAttribute, attributemetadata.* FROM entitymetadata INNER JOIN attributemetadata ON entitymetadata.MetadataId = attributemetadata.MetadataId ";

            if (hasEntityFilter || hasAttributeFilter)
            {
                commandText += "WHERE ";
                if (hasEntityFilter)
                {
                    commandText += " (entitymetadata.LogicalName = '" + entityName + "')";
                }
                if (hasEntityFilter && hasAttributeFilter)
                {
                    commandText += " AND ";
                }
                if (hasAttributeFilter)
                {
                    commandText += " (attributemetadata.LogicalName = '" + attributeName + "')";
                }
            }

            var command = new CrmDbCommand(crmDbConnection);
            command.CommandText = commandText;
            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;

            adapter.Fill(dataTable);
            dataTable.Columns.Add("TABLE_CATALOG", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(0);
            dataTable.Columns.Add("TABLE_SCHEMA", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(1);
            dataTable.Columns["entitylogicalname"].ColumnName = "TABLE_NAME";
            dataTable.Columns["TABLE_NAME"].SetOrdinal(2);

            dataTable.Columns["logicalname"].ColumnName = "COLUMN_NAME";
            dataTable.Columns["COLUMN_NAME"].SetOrdinal(3);

            dataTable.Columns["columnnumber"].ColumnName = "ORDINAL_POSITION";
            dataTable.Columns["ORDINAL_POSITION"].SetOrdinal(4);

            // dataTable.Columns["defaultvalue"].ColumnName = "COLUMN_DEFAULT";
            dataTable.Columns.Add("COLUMN_DEFAULT", dataTable.Columns["defaultvalue"].DataType, "IIF([defaultvalue] = '-1', '', IIF([defaultvalue] = 'TRUE', '((' + 1 + '))', IIF([defaultvalue] = 'FALSE', '((0))', '((' + [defaultvalue] + '))')))").SetOrdinal(5);

            // dataTable.Columns["COLUMN_DEFAULT"].SetOrdinal(5);
            //  dataTable.Columns["isnullable"].ColumnName = "IS_NULLABLE";
            dataTable.Columns.Add("IS_NULLABLE", typeof(string), "IIF([isnullable] = True, 'YES', 'NO')").SetOrdinal(6);
            //dataTable.Columns["IS_NULLABLE"].SetOrdinal(6);

            dataTable.Columns["datatype"].ColumnName = "DATA_TYPE";
            dataTable.Columns["DATA_TYPE"].SetOrdinal(7);

            // dataTable.Columns["attributemetadata.length"].ColumnName = "character_maximum_length";
            dataTable.Columns.Add("CHARACTER_MAXIMUM_LENGTH", typeof(int), "IIF(data_type = 'nvarchar', [maxlength], NULL)").SetOrdinal(8);
            dataTable.Columns.Add("CHARACTER_OCTET_LENGTH", typeof(int), "IIF(data_type ='nvarchar',ISNULL(character_maximum_length, 0) * 2, character_maximum_length)").SetOrdinal(9);

            dataTable.Columns["numericprecision"].ColumnName = "NUMERIC_PRECISION";
            dataTable.Columns["NUMERIC_PRECISION"].SetOrdinal(10);

            dataTable.Columns["numericprecisionradix"].ColumnName = "NUMERIC_PRECISION_RADIX";
            dataTable.Columns["NUMERIC_PRECISION_RADIX"].SetOrdinal(11);

            dataTable.Columns["numericscale"].ColumnName = "NUMERIC_SCALE";
            dataTable.Columns["NUMERIC_SCALE"].SetOrdinal(12);

            dataTable.Columns.Add("DATETIME_PRECISION", typeof(int), "IIF(data_type = 'datetime', 3, NULL)").SetOrdinal(13);

            dataTable.Columns.Add("CHARACTER_SET_CATALOG", typeof(string), "NULL").SetOrdinal(14);
            dataTable.Columns.Add("CHARACTER_SET_SCHEMA", typeof(string), "NULL").SetOrdinal(15);

            dataTable.Columns.Add("CHARACTER_SET_NAME", typeof(string), "IIF(data_type ='nvarchar', 'UNICODE', NULL)").SetOrdinal(16);

            dataTable.Columns.Add("COLLATION_CATALOG", typeof(string), "NULL").SetOrdinal(17);
            dataTable.Columns.Add("IS_SPARSE", typeof(bool), "false").SetOrdinal(18);
            dataTable.Columns.Add("IS_COLUMN_SET", typeof(bool), "false").SetOrdinal(19);
            dataTable.Columns.Add("IS_FILESTREAM", typeof(bool), "false").SetOrdinal(20);

            return dataTable;
        }
コード例 #17
0
ファイル: CrmOperation.cs プロジェクト: YOTOV-LIMITED/CrmAdo
 protected void AssignResponseParameter(CrmDbCommand command, OrganizationResponse response)
 {
     if (command != null && command.Parameters.Contains(SystemCommandParameters.OrgResponse) && command.Parameters[SystemCommandParameters.OrgResponse].Direction == ParameterDirection.Output)
     {
         command.Parameters[SystemCommandParameters.OrgResponse].Value = response;
     }
 }
コード例 #18
0
        public DataTable GetUniqueKeyColumns(CrmDbConnection crmDbConnection, string[] restrictions)
        {
            string catalog = GetRestrictionOrNull(0, restrictions);
            string schema = GetRestrictionOrNull(1, restrictions);
            string table = GetRestrictionOrNull(2, restrictions);
            string constraintname = GetRestrictionOrNull(3, restrictions);
            string columnname = GetRestrictionOrNull(4, restrictions);

            bool hasEntityFilter = !string.IsNullOrEmpty(table);
            bool hasColumnFilter = !string.IsNullOrEmpty(columnname);
            bool hasConstraintNameFilter = !string.IsNullOrEmpty(constraintname);

            string commandText = "SELECT entitymetadata.PrimaryIdAttribute, entitymetadata.LogicalName, a.LogicalName, a.ColumnNumber FROM entitymetadata JOIN attributemetadata a on entitymetadata.MetadataId = a.MetadataId WHERE (a.isprimaryid = @isPrimaryId)";

            if (hasEntityFilter || hasColumnFilter)
            {
                commandText += "AND ";
                if (hasEntityFilter)
                {
                    commandText += " (entitymetadata.LogicalName = '" + table + "')";
                }
                if (hasEntityFilter && hasColumnFilter)
                {
                    commandText += " AND ";
                }
                if (hasColumnFilter)
                {
                    commandText += " (a.LogicalName = '" + columnname + "')";
                }
            }

            var command = new CrmDbCommand(crmDbConnection);
            var param = command.CreateParameter();
            param.DbType = DbType.Boolean;
            param.Direction = ParameterDirection.Input;
            param.ParameterName = "@isPrimaryId";
            param.Value = true;
            command.Parameters.Add(param);
            command.CommandText = commandText;
            var adapter = new CrmDataAdapter(command);
            var dataTable = new DataTable();
            dataTable.Locale = CultureInfo.InvariantCulture;
            adapter.Fill(dataTable);

            dataTable.Columns.Add("constraint_catalog", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(0);
            dataTable.Columns.Add("constraint_schema", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(1);

            dataTable.Columns["LogicalName"].ColumnName = "table_name";
            dataTable.Columns.Add("column_name", typeof(string), "IsNull([a.LogicalName], [PrimaryIdAttribute])");
            dataTable.Columns.Add("constraint_name", typeof(string), "'PK__' + IsNull(table_name, '') + '_' + IsNull(column_name, PrimaryIdAttribute)").SetOrdinal(2);
            dataTable.Columns.Add("table_catalog", typeof(string), string.Format("'{0}'", crmDbConnection.ConnectionInfo.OrganisationName)).SetOrdinal(3);
            dataTable.Columns.Add("table_schema", typeof(string), string.Format("'{0}'", DefaultSchema)).SetOrdinal(4);
            dataTable.Columns["table_name"].SetOrdinal(5);
            dataTable.Columns["column_name"].SetOrdinal(6);
            dataTable.Columns["a.columnnumber"].ColumnName = "ordinal_position";
            dataTable.Columns["ordinal_position"].SetOrdinal(7);

            dataTable.Columns.Add("constraint_type", typeof(string), "'PRIMARY KEY'").SetOrdinal(8);

            //   dataTable.Columns.Add("KeyType", typeof(Byte), "36").SetOrdinal(8); // 36 = uniqueidentitifer datatype - all pk indexes in crm are uniqueidentifiers.
            dataTable.Columns.Add("index_name", typeof(string), "constraint_name").SetOrdinal(9);
            //  dataTable.Columns.Add("type_desc", typeof(string), "'CLUSTERED'");

            var filteredView = dataTable.AsDataView();
            filteredView.RowFilter = "column_name = PrimaryIdAttribute";  // necessary due to #68
            dataTable = filteredView.ToTable(true);

            if (hasConstraintNameFilter)
            {
                filteredView = dataTable.AsDataView();
                filteredView.RowFilter = "constraint_name = '" + constraintname + "'";
                dataTable = filteredView.ToTable(true);
            }

            return dataTable;
        }
コード例 #19
0
        private CreateEntityRequest GetCreateEntityRequest(string sql)
        {
            // set up fake metadata provider.
            // var fakeMetadataProvider = MockRepository.GenerateMock<ICrmMetaDataProvider>();
            // var fakeMetadata = GetFakeContactMetadata();
            // fakeMetadataProvider.Stub(a => a.GetEntityMetadata("contact")).Return(fakeMetadata);
            var fakeConn = MockRepository.GenerateMock<CrmDbConnection>();
            //  fakeConn.Stub(a => a.MetadataProvider).Return(fakeMetadataProvider);

            var cmd = new CrmDbCommand(fakeConn);
            cmd.CommandText = sql;
            var createRequest = GetOrganizationRequest<CreateEntityRequest>(cmd);
            return createRequest;
        }