Prepare() public method

public Prepare ( ) : void
return void
コード例 #1
0
ファイル: Utils.cs プロジェクト: helluvamatt/nuodb-dotnet
        internal static void CreateGameTable()
        {
            using (NuoDbConnection connection = new NuoDbConnection(connectionString))
            {
                connection.Open();
                try
                {
                    DbCommand dropCommand = new NuoDbCommand("drop table Game", connection);
                    dropCommand.ExecuteNonQuery();
                }
                catch (Exception)
                {
                    // table is allowed to be missing
                }
                DbCommand createCommand = new NuoDbCommand("create table Game" +
                                                            "(" +
                                                            "   Id       bigint generated always as identity not NULL primary key," +
                                                            "   Date     DATE" +
                                                            ")", connection);
                createCommand.ExecuteNonQuery();

                DbCommand insertCommand = new NuoDbCommand("Insert into Game (Date) Values (?)", connection);
                insertCommand.Prepare();

                insertCommand.Parameters[0].Value = "1970-01-01";

                insertCommand.ExecuteNonQuery();

            }
        }
コード例 #2
0
        public void DB4329()
        {
            using (NuoDbConnection connection = new NuoDbConnection(TestFixture1.connectionString))
            {
                connection.Open();
                Utils.DropTable(connection, "ExpenseTest");
                DbCommand createCommand = new NuoDbCommand("Create table ExpenseTest" +
                                                           "(" +
                                                           "SourceExpenseId int," +
                                                           "ExpenseAmount numeric(15,2)" +
                                                           ")", connection);
                createCommand.ExecuteNonQuery();

                DbCommand insertCommand = new NuoDbCommand("Insert Into ExpenseTest(SourceExpenseId, ExpenseAmount) Values (?,?)", connection);
                insertCommand.Prepare();

                insertCommand.Parameters[0].Value = -1254524;
                insertCommand.Parameters[1].Value = -135.35;
                insertCommand.ExecuteNonQuery();

                insertCommand.Parameters[0].Value = 100100100;
                insertCommand.Parameters[1].Value = -1325465.35;
                insertCommand.ExecuteNonQuery();

                insertCommand.Parameters[0].Value = 100100101;
                insertCommand.Parameters[1].Value = 200000.35;
                insertCommand.ExecuteNonQuery();

                DbCommand selectCommand = new NuoDbCommand("select SourceExpenseId, ExpenseAmount from ExpenseTest", connection);
                using (DbDataReader reader = selectCommand.ExecuteReader())
                {
                    bool hasNext=reader.Read();
                    Assert.IsTrue(hasNext);
                    Assert.AreEqual(-1254524, reader[0]);
                    Assert.AreEqual(-135.35, reader[1]);
                    hasNext = reader.Read();
                    Assert.IsTrue(hasNext);
                    Assert.AreEqual(100100100, reader[0]);
                    Assert.AreEqual(-1325465.35, reader[1]);
                    hasNext = reader.Read();
                    Assert.IsTrue(hasNext);
                    Assert.AreEqual(100100101, reader[0]);
                    Assert.AreEqual(200000.35, reader[1]);
                }

            }
        }
コード例 #3
0
        public void TestPrepareParamOut()
        {
            using (NuoDbConnection connection = new NuoDbConnection(TestFixture1.connectionString))
            {
                connection.Open();
                new NuoDbCommand("drop procedure nunit_test if exists", connection).ExecuteNonQuery();
                new NuoDbCommand("create procedure nunit_test(out p1 string) as p1='hello'; end_procedure", connection).ExecuteNonQuery();

                NuoDbCommand cmd = new NuoDbCommand("nunit_test", connection);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Prepare();
                Assert.IsTrue(cmd.Parameters.Contains("p1"));
                Assert.AreEqual(ParameterDirection.Output, cmd.Parameters["p1"].Direction);
                cmd.ExecuteNonQuery();
                Assert.AreEqual("hello", cmd.Parameters["p1"].Value);
            }
        }
コード例 #4
0
        public void TestPrepareParamIn()
        {
            using (NuoDbConnection connection = new NuoDbConnection(TestFixture1.connectionString))
            {
                connection.Open();
                new NuoDbCommand("drop procedure nunit_test if exists", connection).ExecuteNonQuery();
                new NuoDbCommand("create procedure nunit_test(in p1 string) as throw p1; end_procedure", connection).ExecuteNonQuery();

                NuoDbCommand cmd = new NuoDbCommand("nunit_test", connection);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Prepare();
                Assert.IsTrue(cmd.Parameters.Contains("p1"));
                Assert.AreEqual(ParameterDirection.Input, cmd.Parameters["p1"].Direction);
                cmd.Parameters["p1"].Value = "hello";
                try
                {
                    cmd.ExecuteNonQuery();
                    Assert.Fail();
                }
                catch (Exception e)
                {
                    Assert.AreEqual("hello", e.Message);
                }
            }
        }
コード例 #5
0
ファイル: Utils.cs プロジェクト: helluvamatt/nuodb-dotnet
        internal static void CreateHockeyTable()
        {
            using (NuoDbConnection connection = new NuoDbConnection(TestFixture1.connectionString))
            {
                connection.Open();
                DropTable(connection, "hockey");
                DbCommand createCommand = new NuoDbCommand("create table Hockey" +
                                                            "(" +
                                                            "   Id       bigint not NULL generated always as identity primary key," +
                                                            "   Number   Integer," +
                                                            "   Name     String," +
                                                            "   Position String," +
                                                            "   Team     String" +
                                                            ")", connection);
                createCommand.ExecuteNonQuery();

                DbCommand insertCommand = new NuoDbCommand("Insert into Hockey (Number, Name, Position, Team) Values (?,?,?,?)", connection);
                insertCommand.Prepare();

                insertCommand.Parameters[0].Value = 37;
                insertCommand.Parameters[1].Value = "PATRICE BERGERON";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 48;
                insertCommand.Parameters[1].Value = "CHRIS BOURQUE";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 11;
                insertCommand.Parameters[1].Value = "GREGORY CAMPBELL";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 18;
                insertCommand.Parameters[1].Value = "NATHAN HORTON";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 23;
                insertCommand.Parameters[1].Value = "CHRIS KELLY";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 46;
                insertCommand.Parameters[1].Value = "DAVID KREJCI";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 17;
                insertCommand.Parameters[1].Value = "MILAN LUCIC";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 64;
                insertCommand.Parameters[1].Value = "LANE MACDERMID";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 63;
                insertCommand.Parameters[1].Value = "BRAD MARCHAND";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 20;
                insertCommand.Parameters[1].Value = "DANIEL PAILLE";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 49;
                insertCommand.Parameters[1].Value = "RICH PEVERLEY";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 91;
                insertCommand.Parameters[1].Value = "MARC SAVARD";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 19;
                insertCommand.Parameters[1].Value = "TYLER SEGUIN";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 22;
                insertCommand.Parameters[1].Value = "SHAWN THORNTON";
                insertCommand.Parameters[2].Value = "Forward";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 55;
                insertCommand.Parameters[1].Value = "JOHNNY BOYCHUK";
                insertCommand.Parameters[2].Value = "Defense";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 33;
                insertCommand.Parameters[1].Value = "ZDENO CHARA";
                insertCommand.Parameters[2].Value = "Defense";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 21;
                insertCommand.Parameters[1].Value = "ANDREW FERENCE";
                insertCommand.Parameters[2].Value = "Defense";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 27;
                insertCommand.Parameters[1].Value = "DOUGIE HAMILTON";
                insertCommand.Parameters[2].Value = "Defense";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 45;
                insertCommand.Parameters[1].Value = "AARON JOHNSON";
                insertCommand.Parameters[2].Value = "Defense";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 54;
                insertCommand.Parameters[1].Value = "ADAM MCQUAID";
                insertCommand.Parameters[2].Value = "Defense";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 44;
                insertCommand.Parameters[1].Value = "DENNIS SEIDENBERG";
                insertCommand.Parameters[2].Value = "Defense";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 35;
                insertCommand.Parameters[1].Value = "ANTON KHUDOBIN";
                insertCommand.Parameters[2].Value = "Goalie";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 40;
                insertCommand.Parameters[1].Value = "TUUKKA RASK";
                insertCommand.Parameters[2].Value = "Goalie";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters[0].Value = 1;
                insertCommand.Parameters[1].Value = "MAX SUMMIT";
                insertCommand.Parameters[2].Value = "Fan";
                insertCommand.Parameters[3].Value = "Bruins";
                insertCommand.ExecuteNonQuery();

            }
        }
コード例 #6
0
        private void WriteToServer(Feeder feeder)
        {
            if (this.tableName.Length == 0)
            {
                throw new ArgumentException("The name of the destination table hasn't been specified", "DestinationTableName");
            }

            StringBuilder builder = new StringBuilder();

            builder.Append("INSERT INTO `");
            builder.Append(this.tableName.Replace("`", "``"));
            builder.Append("` ");
            if (mappings.Count == 0)
            {
                // the target table has the same number and names of the columns as in the specified input rows
                builder.Append("VALUES (");
                for (int i = 0; i < feeder.FieldCount; i++)
                {
                    if (i != 0)
                    {
                        builder.Append(", ");
                    }
                    builder.Append("?");
                }
                builder.Append(")");
            }
            else
            {
                DataRowCollection targetColumns = null;
                builder.Append(" (");
                for (int i = 0; i < mappings.Count; i++)
                {
                    NuoDbBulkLoaderColumnMapping mapping = mappings[i];
                    if (i != 0)
                    {
                        builder.Append(", ");
                    }
                    builder.Append("`");
                    if (mapping.DestinationColumn == null)
                    {
                        // we are requested to map to a target column that is identified with its ordinal number, so
                        // fetch the schema of the target table to find out what is its name
                        if (targetColumns == null)
                        {
                            // split the destination table into its different parts
                            string[] parts = this.tableName.Split(new char[] { '.' });

                            DataTable targetSchema = this.connection.GetSchema("Columns", new string[] { null,                                   // catalog
                                                                                                         parts.Length == 2 ? parts[0] : null,    // schema
                                                                                                         parts.Length == 2 ? parts[1] : parts[0] // table
                                                                               });
                            targetColumns = targetSchema.Rows;
                        }

                        if (mapping.DestinationOrdinal < 0 || mapping.DestinationOrdinal > targetColumns.Count)
                        {
                            throw new IndexOutOfRangeException(String.Format("The specified ordinal of the target column ({0}) is outside the range of the column count ({1}) of table {2}",
                                                                             new object[] { mapping.DestinationOrdinal, targetColumns.Count, this.tableName }));
                        }

                        string columnName = (string)(targetColumns[mapping.DestinationOrdinal]["COLUMN_NAME"]);
                        builder.Append(columnName.Replace("`", "``"));
                    }
                    else
                    {
                        builder.Append(mapping.DestinationColumn.Replace("`", "``"));
                    }
                    builder.Append("`");
                }
                builder.Append(") VALUES (");
                for (int i = 0; i < mappings.Count; i++)
                {
                    if (i != 0)
                    {
                        builder.Append(", ");
                    }
                    builder.Append("?");
                }
                builder.Append(")");
            }
            string sqlString = builder.ToString();

#if DEBUG
            System.Diagnostics.Trace.WriteLine("NuoDbBulkLoader::WriteToServer: " + sqlString);
#endif

            if (this.connection.State != ConnectionState.Open)
            {
                this.connection.Open();
            }

            using (NuoDbCommand command = new NuoDbCommand(sqlString, this.connection))
            {
                command.Prepare();
                int totalSize = 0;

                // do the check for out-of-range values just once
                foreach (NuoDbBulkLoaderColumnMapping mapping in mappings)
                {
                    if (mapping.SourceColumn == null && mapping.SourceOrdinal < 0 || mapping.SourceOrdinal > feeder.FieldCount)
                    {
                        throw new IndexOutOfRangeException(String.Format("The specified ordinal of the source column ({0}) is outside the range of the column count ({1})",
                                                                         new object[] { mapping.SourceOrdinal, feeder.FieldCount }));
                    }
                }

                while (true)
                {
                    EncodedDataStream dataStream = new RemEncodedStream(connection.InternalConnection.protocolVersion);
                    dataStream.startMessage(Protocol.ExecuteBatchPreparedStatement);
                    dataStream.encodeInt(command.handle);
                    int batchCount = 0;

                    for (; batchCount < this.batchSize && feeder.MoveNext(); batchCount++)
                    {
                        dataStream.encodeInt(command.Parameters.Count);
                        if (mappings.Count == 0)
                        {
                            for (int i = 0; i < feeder.FieldCount; i++)
                            {
                                dataStream.encodeDotNetObject(feeder[i]);
                            }
                        }
                        else
                        {
                            foreach (NuoDbBulkLoaderColumnMapping mapping in mappings)
                            {
                                if (mapping.SourceColumn == null)
                                {
                                    dataStream.encodeDotNetObject(feeder[mapping.SourceOrdinal]);
                                }
                                else
                                {
                                    dataStream.encodeDotNetObject(feeder[mapping.SourceColumn]);
                                }
                            }
                        }
                    }

                    // the iterator hasn't found any more data to import, let's break out
                    if (batchCount == 0)
                    {
                        break;
                    }

                    dataStream.encodeInt(-1);
                    dataStream.encodeInt(batchCount);
                    totalSize += batchCount;
#if DEBUG
                    System.Diagnostics.Trace.WriteLine("NuoDbBulkLoader::WriteToServer: sending a batch of " + batchCount + " rows");
#endif
                    this.connection.InternalConnection.sendAndReceive(dataStream);

                    bool   hasErrors    = false;
                    string errorMessage = string.Empty;

                    for (int i = 0; i < batchCount; i++)
                    {
                        int result = dataStream.getInt();
                        if (result == EXECUTE_FAILED)
                        {
                            if (this.connection.InternalConnection.protocolVersion >= Protocol.PROTOCOL_VERSION6)
                            {
                                int    sqlCode = dataStream.getInt();
                                string message = dataStream.getString();

                                errorMessage = AppendError(errorMessage, message, i);
                            }
                            hasErrors = true;
                        }
                    }

                    if (this.connection.InternalConnection.protocolVersion >= Protocol.PROTOCOL_VERSION3)
                    {
                        long txnId          = dataStream.getLong();
                        int  nodeId         = dataStream.getInt();
                        long commitSequence = dataStream.getLong();
                        this.connection.InternalConnection.setLastTransaction(txnId, nodeId, commitSequence);
                    }

                    if (handlers.Count != 0)
                    {
                        BatchProcessedEventHandler[] tmpArray = new BatchProcessedEventHandler[handlers.Count];
                        handlers.CopyTo(tmpArray);
                        BatchProcessedEventArgs args = new BatchProcessedEventArgs();
                        args.BatchSize = batchCount;
                        args.TotalSize = totalSize;
                        args.HasErrors = hasErrors;
                        foreach (BatchProcessedEventHandler h in tmpArray)
                        {
                            h.Invoke(this, args);
                        }
                    }

                    if (hasErrors)
                    {
                        throw new NuoDbSqlException(errorMessage, NuoDbSqlCode.FindError("BATCH_UPDATE_ERROR"));
                    }
                }
            }
        }
コード例 #7
0
ファイル: Utils.cs プロジェクト: biegomar/nuodb-dotnet
        internal static void CreatePersonTable()
        {
            using (NuoDbConnection connection = new NuoDbConnection(connectionString))
            {
                connection.Open();
                try
                {
                    DbCommand dropCommand = new NuoDbCommand("drop table Person", connection);
                    dropCommand.ExecuteNonQuery();
                }
                catch (Exception)
                {
                    // table is allowed to be missing
                }
                DbCommand createCommand = new NuoDbCommand("create table Person" +
                                                            "(" +
                                                            "   Id       char(38) not NULL primary key," +
                                                            "   Name     String" +
                                                            ")", connection);
                createCommand.ExecuteNonQuery();

                DbCommand insertCommand = new NuoDbCommand("Insert into Person (Id, Name) Values (?,?)", connection);
                insertCommand.Prepare();

                insertCommand.Parameters[0].Value = new Guid("{F571197E-7A4F-4961-9363-7411EACCA841}");
                insertCommand.Parameters[1].Value = "Klaus Müller";

                insertCommand.ExecuteNonQuery();

            }
        }
コード例 #8
0
ファイル: ProcFixture.cs プロジェクト: nuodb/nuodb-dotnet
        public void TestTableValuedArgument()
        {
            using (NuoDbConnection connection = new NuoDbConnection(TestFixture1.connectionString))
            {
                connection.Open();
                new NuoDbCommand("drop procedure nunit_test if exists", connection).ExecuteNonQuery();

                try
                {
                    new NuoDbCommand("create procedure nunit_test(input_data(field1 string, field2 integer), out output_data string) " +
                        " as " +
                        "   output_data = ''; " +
                        "   for select field1 from input_data; " +
                        "     output_data = output_data || field1 || ' '; " +
                        "   end_for; " +
                        " end_procedure", connection).ExecuteNonQuery();
                }
                catch (NuoDbSqlException e)
                {
                    if (e.Code.Code == -1)
                    {
                        // the server doesn't support table valued arguments for procedures
                        return;
                    }
                    else
                        throw;
                }
                NuoDbCommand cmd = new NuoDbCommand("nunit_test", connection);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Prepare();
                DataTable table = new DataTable();
                table.Columns.Add("f1", typeof(string));
                table.Columns.Add("f2", typeof(int));
                DataRow row1 = table.NewRow();
                row1[0] = "hello";
                row1[1] = 0;
                table.Rows.Add(row1);
                DataRow row2 = table.NewRow();
                row2[0] = "world!";
                row2[1] = 0;
                table.Rows.Add(row2);
                cmd.Parameters[0].Value = table;
                cmd.ExecuteNonQuery();
                Assert.AreEqual("hello world! ", cmd.Parameters[1].Value);
            }
        }
コード例 #9
0
ファイル: ProcFixture.cs プロジェクト: nuodb/nuodb-dotnet
        public void TestPrepareLotsOfParams()
        {
            using (NuoDbConnection connection = new NuoDbConnection(TestFixture1.connectionString))
            {
                connection.Open();
                new NuoDbCommand("drop procedure nunit_test if exists", connection).ExecuteNonQuery();
                new NuoDbCommand("create procedure nunit_test(inout p1 string, in p2 string, out p3 int, inout p4 float, in p5 double, out p6 boolean, " +
                    "inout p7 string, in p8 string, out p9 int, inout p10 float, in p11 double, out p12 boolean, " +
                    "inout p13 string, in p14 string, out p15 int, inout p16 float, in p17 double, out p18 boolean, " +
                    "inout p19 string, in p20 string, out p21 int, inout p22 float, in p23 double, out p24 boolean) " +
                    " returns output(p00 string, p01 int, p02 float, p04 double, p05 boolean, p06 blob) " +
                    " as if(p1='goodbye') p1='hello'; end_if; end_procedure", connection).ExecuteNonQuery();

                NuoDbCommand cmd = new NuoDbCommand("nunit_test", connection);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Prepare();
                int index = 1;
                foreach (DbParameter param in cmd.Parameters)
                {
                    Assert.AreEqual(String.Format("P{0}", index++), param.ParameterName);
                }
                Assert.AreEqual(25, index);
            }
        }
コード例 #10
0
        private void WriteToServer(Feeder feeder)
        {
            if (this.tableName.Length == 0)
                throw new ArgumentException("The name of the destination table hasn't been specified", "DestinationTableName");

            StringBuilder builder = new StringBuilder();
            builder.Append("INSERT INTO `");
            builder.Append(this.tableName.Replace("`", "``"));
            builder.Append("` ");
            if (mappings.Count == 0)
            {
                // the target table has the same number and names of the columns as in the specified input rows
                builder.Append("VALUES (");
                for (int i = 0; i < feeder.FieldCount; i++)
                {
                    if (i != 0)
                        builder.Append(", ");
                    builder.Append("?");
                }
                builder.Append(")");
            }
            else
            {
                DataRowCollection targetColumns = null;
                builder.Append(" (");
                for(int i=0;i<mappings.Count;i++)
                {
                    NuoDbBulkLoaderColumnMapping mapping = mappings[i];
                    if (i != 0)
                        builder.Append(", ");
                    builder.Append("`");
                    if (mapping.DestinationColumn == null)
                    {
                        // we are requested to map to a target column that is identified with its ordinal number, so
                        // fetch the schema of the target table to find out what is its name
                        if (targetColumns == null)
                        {
                            // split the destination table into its different parts
                            string[] parts = this.tableName.Split(new char[] { '.' });

                            DataTable targetSchema = this.connection.GetSchema("Columns", new string[] { null, // catalog
                                                                                    parts.Length == 2 ? parts[0] : null, // schema
                                                                                    parts.Length == 2 ? parts[1] : parts[0] // table
                                                                                });
                            targetColumns = targetSchema.Rows;
                        }

                        if (mapping.DestinationOrdinal < 0 || mapping.DestinationOrdinal > targetColumns.Count)
                            throw new IndexOutOfRangeException(String.Format("The specified ordinal of the target column ({0}) is outside the range of the column count ({1}) of table {2}",
                                new object[] { mapping.DestinationOrdinal, targetColumns.Count, this.tableName }));

                        string columnName = (string)(targetColumns[mapping.DestinationOrdinal]["COLUMN_NAME"]);
                        builder.Append(columnName.Replace("`", "``"));
                    }
                    else
                        builder.Append(mapping.DestinationColumn.Replace("`", "``"));
                    builder.Append("`");
                }
                builder.Append(") VALUES (");
                for (int i = 0; i < mappings.Count; i++)
                {
                    if (i != 0)
                        builder.Append(", ");
                    builder.Append("?");
                }
                builder.Append(")");
            }
            string sqlString = builder.ToString();
            #if DEBUG
            System.Diagnostics.Trace.WriteLine("NuoDbBulkLoader::WriteToServer: "+sqlString);
            #endif

            if (this.connection.State != ConnectionState.Open)
                this.connection.Open();

            using (NuoDbCommand command = new NuoDbCommand(sqlString, this.connection))
            {
                command.Prepare();
                int totalSize = 0;

                // do the check for out-of-range values just once
                foreach (NuoDbBulkLoaderColumnMapping mapping in mappings)
                {
                    if (mapping.SourceColumn == null && mapping.SourceOrdinal < 0 || mapping.SourceOrdinal > feeder.FieldCount)
                        throw new IndexOutOfRangeException(String.Format("The specified ordinal of the source column ({0}) is outside the range of the column count ({1})",
                            new object[] { mapping.SourceOrdinal, feeder.FieldCount }));
                }

                while (true)
                {
                    EncodedDataStream dataStream = new RemEncodedStream(connection.InternalConnection.protocolVersion);
                    dataStream.startMessage(Protocol.ExecuteBatchPreparedStatement);
                    dataStream.encodeInt(command.handle);
                    int batchCount = 0;

                    for (; batchCount < this.batchSize && feeder.MoveNext(); batchCount++)
                    {
                        dataStream.encodeInt(command.Parameters.Count);
                        if (mappings.Count == 0)
                        {
                            for (int i = 0; i < feeder.FieldCount; i++)
                            {
                                dataStream.encodeDotNetObject(feeder[i]);
                            }
                        }
                        else
                        {
                            foreach (NuoDbBulkLoaderColumnMapping mapping in mappings)
                            {
                                if (mapping.SourceColumn == null)
                                {
                                    dataStream.encodeDotNetObject(feeder[mapping.SourceOrdinal]);
                                }
                                else
                                {
                                    dataStream.encodeDotNetObject(feeder[mapping.SourceColumn]);
                                }
                            }
                        }
                    }

                    // the iterator hasn't found any more data to import, let's break out
                    if (batchCount == 0)
                        break;

                    dataStream.encodeInt(-1);
                    dataStream.encodeInt(batchCount);
                    totalSize += batchCount;
            #if DEBUG
                    System.Diagnostics.Trace.WriteLine("NuoDbBulkLoader::WriteToServer: sending a batch of " + batchCount + " rows");
            #endif
                    this.connection.InternalConnection.sendAndReceive(dataStream);

                    string firstViolationString = "";
                    int firstViolation = 0;
                    bool haserrors = false;

                    for (int i = 0; i < batchCount; i++)
                    {
                        int result = dataStream.getInt();
                        if (result == EXECUTE_FAILED)
                        {
                            if (this.connection.InternalConnection.protocolVersion >= Protocol.PROTOCOL_VERSION6)
                            {
                                int status = dataStream.getInt();
                                string s = dataStream.getString();

                                // Only take the first constraint violation.
                                if (NuoDbSqlCode.FindCode(status).SQLState.Equals("CONSTRAINT_ERROR") && firstViolation == 0)
                                {
                                    firstViolation = status;
                                    firstViolationString = s;
                                }
                            }
                            haserrors = true;
                        }
                    }

                    if (this.connection.InternalConnection.protocolVersion >= Protocol.PROTOCOL_VERSION3)
                    {
                        long txnId = dataStream.getLong();
                        int nodeId = dataStream.getInt();
                        long commitSequence = dataStream.getLong();
                        this.connection.InternalConnection.setLastTransaction(txnId, nodeId, commitSequence);
                    }

                    if (handlers.Count != 0)
                    {
                        BatchProcessedEventHandler[] tmpArray = new BatchProcessedEventHandler[handlers.Count];
                        handlers.CopyTo(tmpArray);
                        BatchProcessedEventArgs args = new BatchProcessedEventArgs();
                        args.BatchSize = batchCount;
                        args.TotalSize = totalSize;
                        args.HasErrors = haserrors;
                        foreach (BatchProcessedEventHandler h in tmpArray)
                        {
                            h.Invoke(this, args);
                        }
                    }

                    if (haserrors)
                    {
                        if (firstViolation == 0)
                        {
                            throw new NuoDbSqlException("", NuoDbSqlCode.FindError("BATCH_UPDATE_ERROR"));
                        }
                        else
                        {
                            throw new NuoDbSqlException(firstViolationString, NuoDbSqlCode.FindError("BATCH_UPDATE_ERROR"));
                        }
                    }
                }
            }
        }
コード例 #11
0
        public void TestUTFParams()
        {
            NuoDbConnection connection = new NuoDbConnection(connectionString);
            connection.Open();
            Utils.DropTable(connection, "temp");

            string utf8String = "z a \u0306 \u01FD \u03B2";
            new NuoDbCommand("create table temp (col1 string)", connection).ExecuteNonQuery();
            using (NuoDbCommand cmd = new NuoDbCommand("insert into temp values (?)", connection))
            {
                cmd.Prepare();
                cmd.Parameters[0].Value = utf8String;
                Assert.AreEqual(1, cmd.ExecuteNonQuery());
            }
            using (NuoDbCommand cmd = new NuoDbCommand("select * from temp", connection))
            {
                using (DbDataReader reader = cmd.ExecuteReader())
                {
                    Assert.IsTrue(reader.Read());
                    Assert.AreEqual(utf8String, reader.GetString(0));
                }
            }
        }