コード例 #1
0
        /// <summary>
        /// Sets the expected column types for a given function command tree
        /// </summary>
        private void SetFunctionExpectedTypes(DbFunctionCommandTree tree, EFMySqlCommand cmd)
        {
            if (tree.ResultType != null)
            {
                Debug.Assert(tree.ResultType.EdmType.BuiltInTypeKind == BuiltInTypeKind.CollectionType,
                             Resources.WrongFunctionResultType);

                CollectionType collectionType = (CollectionType)(tree.ResultType.EdmType);
                EdmType        elementType    = collectionType.TypeUsage.EdmType;

                if (elementType.BuiltInTypeKind == BuiltInTypeKind.RowType)
                {
                    ReadOnlyMetadataCollection <EdmMember> members = ((RowType)elementType).Members;
                    cmd.ColumnTypes = new PrimitiveType[members.Count];

                    for (int ordinal = 0; ordinal < members.Count; ordinal++)
                    {
                        EdmMember     member        = members[ordinal];
                        PrimitiveType primitiveType = (PrimitiveType)member.TypeUsage.EdmType;
                        cmd.ColumnTypes[ordinal] = primitiveType;
                    }
                }
                else if (elementType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType)
                {
                    cmd.ColumnTypes    = new PrimitiveType[1];
                    cmd.ColumnTypes[0] = (PrimitiveType)elementType;
                }
                else
                {
                    Debug.Fail(Resources.WrongFunctionResultType);
                }
            }
        }
コード例 #2
0
        public async Task ExecuteNonQueryAndScalarAsyncAwait()
        {
            if (st.Version < new Version(5, 0))
            {
                return;
            }

            st.execSQL("CREATE TABLE NonQueryAndScalarAsyncAwaitTest (id int)");
            st.execSQL("CREATE PROCEDURE NonQueryAndScalarAsyncAwaitSpTest() BEGIN SET @x=0; REPEAT INSERT INTO NonQueryAndScalarAsyncAwaitTest VALUES(@x); " +
                       "SET @x=@x+1; UNTIL @x = 100 END REPEAT; END");

            EFMySqlCommand proc = new EFMySqlCommand()
            {
                CommandText = "NonQueryAndScalarAsyncAwaitSpTest", Connection = st.conn
            };

            proc.CommandType = CommandType.StoredProcedure;
            int result = await proc.ExecuteNonQueryAsync();

            Assert.NotEqual(-1, result);

            EFMySqlCommand cmd = new EFMySqlCommand()
            {
                CommandText = "SELECT COUNT(*) FROM NonQueryAndScalarAsyncAwaitTest;", Connection = st.conn
            };

            cmd.CommandType = CommandType.Text;
            object cnt = await cmd.ExecuteScalarAsync();

            Assert.Equal(100, Convert.ToInt32(cnt));
        }
コード例 #3
0
 /// <summary>
 /// Sets the expected column types
 /// </summary>
 private void SetExpectedTypes(DbCommandTree commandTree, EFMySqlCommand cmd)
 {
     if (commandTree is DbQueryCommandTree)
         SetQueryExpectedTypes(commandTree as DbQueryCommandTree, cmd);
     else if (commandTree is DbFunctionCommandTree)
         SetFunctionExpectedTypes(commandTree as DbFunctionCommandTree, cmd);
 }
コード例 #4
0
ファイル: InsertTests.cs プロジェクト: Arsslensoft/FleshHRMS
        public void ExecuteNonQueryAndScalarAsync()
        {
            if (st.Version < new Version(5, 0))
            {
                return;
            }

            st.execSQL("CREATE TABLE test (id int)");
            st.execSQL("DROP PROCEDURE IF EXISTS spTest");
            st.execSQL("CREATE PROCEDURE spTest() BEGIN SET @x=0; REPEAT INSERT INTO test VALUES(@x); " +
                       "SET @x=@x+1; UNTIL @x = 100 END REPEAT; END");

            EFMySqlCommand proc = new EFMySqlCommand()
            {
                CommandText = "spTest", Connection = st.conn
            };

            proc.CommandType = CommandType.StoredProcedure;
            System.Threading.Tasks.Task <int> result = proc.ExecuteNonQueryAsync();

            Assert.NotEqual(-1, result.Result);

            EFMySqlCommand cmd = new EFMySqlCommand()
            {
                CommandText = "SELECT COUNT(*) FROM test;", Connection = st.conn
            };

            cmd.CommandType = CommandType.Text;
            object cnt = cmd.ExecuteScalarAsync().Result;

            Assert.Equal(100, Convert.ToInt32(cnt));
        }
コード例 #5
0
        protected override DbCommandDefinition CreateDbCommandDefinition(
            DbProviderManifest providerManifest, DbCommandTree commandTree)
        {
            if (commandTree == null)
                throw new ArgumentNullException("commandTree");

            SqlGenerator generator = null;
            if (commandTree is DbQueryCommandTree)
                generator = new SelectGenerator();
            else if (commandTree is DbInsertCommandTree)
                generator = new InsertGenerator();
            else if (commandTree is DbUpdateCommandTree)
                generator = new UpdateGenerator();
            else if (commandTree is DbDeleteCommandTree)
                generator = new DeleteGenerator();
            else if (commandTree is DbFunctionCommandTree)
                generator = new FunctionGenerator();

            string sql = generator.GenerateSQL(commandTree);

            EFMySqlCommand cmd = new EFMySqlCommand();
            cmd.CommandText = sql;
            if (generator is FunctionGenerator)
                cmd.CommandType = (generator as FunctionGenerator).CommandType;

            SetExpectedTypes(commandTree, cmd);

            EdmFunction function = null;
            if (commandTree is DbFunctionCommandTree)
                function = (commandTree as DbFunctionCommandTree).EdmFunction;

            // Now make sure we populate the command's parameters from the CQT's parameters:
            foreach (KeyValuePair<string, TypeUsage> queryParameter in commandTree.Parameters)
            {
                DbParameter parameter = cmd.CreateParameter();
                parameter.ParameterName = queryParameter.Key;
                parameter.Direction = ParameterDirection.Input;
                parameter.DbType = Metadata.GetDbType(queryParameter.Value);

                FunctionParameter funcParam;
                if (function != null &&
                    function.Parameters.TryGetValue(queryParameter.Key, false, out funcParam))
                {
                    parameter.ParameterName = funcParam.Name;
                    parameter.Direction = Metadata.ModeToDirection(funcParam.Mode);
                    parameter.DbType = Metadata.GetDbType(funcParam.TypeUsage);
                }
                cmd.Parameters.Add(parameter);
            }

            // Now add parameters added as part of SQL gen
            foreach (DbParameter p in generator.Parameters)
                cmd.Parameters.Add(p);

            return CreateCommandDefinition(cmd);
        }
コード例 #6
0
        public async Task PrepareAsyncAwait()
        {
            st.execSQL("CREATE TABLE PrepareAsyncAwaitTest (val1 varchar(20), numbercol int, numbername varchar(50));");
            EFMySqlCommand cmd = new EFMySqlCommand()
            {
                CommandText = "INSERT INTO PrepareAsyncAwaitTest VALUES(NULL, @number, @text)", Connection = st.conn
            };
            await cmd.PrepareAsync();

            cmd.Parameters.Add(new MySqlParameter("@number", 1));
            cmd.Parameters.Add(new MySqlParameter("@text", "One"));

            for (int i = 1; i <= 100; i++)
            {
                cmd.Parameters["@number"].Value = i;
                cmd.Parameters["@text"].Value   = "A string value";
                cmd.ExecuteNonQuery();
            }
        }
コード例 #7
0
        /// <summary>
        /// Sets the expected column types for a given query command tree
        /// </summary>
        private void SetQueryExpectedTypes(DbQueryCommandTree tree, EFMySqlCommand cmd)
        {
            DbProjectExpression projectExpression = tree.Query as DbProjectExpression;
            if (projectExpression != null)
            {
                EdmType resultsType = projectExpression.Projection.ResultType.EdmType;

                StructuralType resultsAsStructuralType = resultsType as StructuralType;
                if (resultsAsStructuralType != null)
                {
                    cmd.ColumnTypes = new PrimitiveType[resultsAsStructuralType.Members.Count];

                    for (int ordinal = 0; ordinal < resultsAsStructuralType.Members.Count; ordinal++)
                    {
                        EdmMember member = resultsAsStructuralType.Members[ordinal];
                        PrimitiveType primitiveType = member.TypeUsage.EdmType as PrimitiveType;
                        cmd.ColumnTypes[ordinal] = primitiveType;
                    }
                }
            }
        }
コード例 #8
0
        protected override System.Data.Entity.Core.Common.DbCommandDefinition CreateDbCommandDefinition(
            System.Data.Entity.Core.Common.DbProviderManifest providerManifest, DbCommandTree commandTree)
        {
            if (commandTree == null)
            {
                throw new ArgumentNullException("commandTree");
            }

            SqlGenerator generator = null;

            if (commandTree is DbQueryCommandTree)
            {
                generator = new SelectGenerator();
            }
            else if (commandTree is DbInsertCommandTree)
            {
                generator = new InsertGenerator();
            }
            else if (commandTree is DbUpdateCommandTree)
            {
                generator = new UpdateGenerator();
            }
            else if (commandTree is DbDeleteCommandTree)
            {
                generator = new DeleteGenerator();
            }
            else if (commandTree is DbFunctionCommandTree)
            {
                generator = new FunctionGenerator();
            }

            string sql = generator.GenerateSQL(commandTree);

            EFMySqlCommand cmd = new EFMySqlCommand();

            cmd.CommandText = sql;
            if (generator is FunctionGenerator)
            {
                cmd.CommandType = (generator as FunctionGenerator).CommandType;
            }

            SetExpectedTypes(commandTree, cmd);

            EdmFunction function = null;

            if (commandTree is DbFunctionCommandTree)
            {
                function = (commandTree as DbFunctionCommandTree).EdmFunction;
            }

            // Now make sure we populate the command's parameters from the CQT's parameters:
            foreach (KeyValuePair <string, TypeUsage> queryParameter in commandTree.Parameters)
            {
                DbParameter parameter = cmd.CreateParameter();
                parameter.ParameterName = queryParameter.Key;
                parameter.Direction     = ParameterDirection.Input;
                parameter.DbType        = Metadata.GetDbType(queryParameter.Value);

#if NET_45_OR_GREATER
                if (queryParameter.Value.EdmType is PrimitiveType &&
                    ((PrimitiveType)queryParameter.Value.EdmType).PrimitiveTypeKind == PrimitiveTypeKind.Geometry)
                {
                    ((MySqlParameter)parameter).MySqlDbType = MySqlDbType.Geometry;
                }
#endif

                FunctionParameter funcParam;
                if (function != null &&
                    function.Parameters.TryGetValue(queryParameter.Key, false, out funcParam))
                {
                    parameter.ParameterName = funcParam.Name;
                    parameter.Direction     = Metadata.ModeToDirection(funcParam.Mode);
                    parameter.DbType        = Metadata.GetDbType(funcParam.TypeUsage);
                }
                cmd.Parameters.Add(parameter);
            }

            // Now add parameters added as part of SQL gen
            foreach (DbParameter p in generator.Parameters)
            {
                cmd.Parameters.Add(p);
            }

            return(CreateCommandDefinition(cmd));
        }