C# ORA-01008: ошибка не всех переменных - PullRequest
1 голос
/ 20 января 2020

Я впервые для C#, сейчас я пытаюсь вставить данные в oracle дБ из переменной. Но я получил эту ошибку. Я не знаю, какой смысл в этом исходном коде.

    public class Foo
    {
        public string PLANTCODE { get; set; }
        public string LOCATIONCODE { get; set; }
        public string LOCATIONNAME { get; set; }
        public string LOCATIONSTATUS { get; set; }
        public string DEPARTMENTCODE { get; set; }
        public string DEPARTMENTNAME { get; set; }
      //  public DateTime LASTUPDATED { get; set; }
       // public OracleDbType OracleDbType { get; set; }

    }
    public List<Foo> GetData()
    {
        List<Foo> dataList = new List<Foo>();
        string connectionString = "Data Source=xxx; Initial Catalog=xxx;Integrated Security = false; User ID=xxx;Password=xxx";
        string selectStatement = "SELECT PLANTCODE,LOCATIONCODE,LOCATIONNAME,LOCATIONSTATUS,DEPARTMENTCODE,DEPARTMENTNAME from V_Location";

        using (var con = new SqlConnection(connectionString))
        {
            using (var cmd = new SqlCommand(selectStatement, con))
            {
                con.Open();

                using (var reader = cmd.ExecuteReader())
                { if (reader.Read())

                        {
                            dataList.Add(new Foo
                            {
                                PLANTCODE = reader.GetString(0),
                                LOCATIONCODE = reader.GetString(1),
                                LOCATIONNAME = reader.GetString(2),
                                LOCATIONSTATUS = reader.GetString(3),
                                DEPARTMENTCODE = reader.GetString(4),
                                DEPARTMENTNAME = reader.GetString(5),
                            });
                        }
                 }
            }
        }
        return dataList;
    }
    public void InsertData()
    {


        string connectionString = "Provider=MSDAORA;Data Source=ORCL;Persist Security Info=True;User ID=xxx;Password=xxx;Unicode=True";
        string insertStatment = "INSERT INTO xxx.BTH_V_LOCATION (PLANTCODE, LOCATIONCODE, LOCATIONNAME, LOCATIONSTATUS, DEPARTMENTCODE, DEPARTMENTNAME) VALUES (:PLANTCODE, :LOCATIONCODE, :LOCATIONNAME, :LOCATIONSTATUS, :DEPARTMENTCODE, :DEPARTMENTNAME)";


        List<Foo> dataList = GetData();

        if (dataList.Count > 0)
        {
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {

                    using (OleDbCommand cmd = new OleDbCommand(insertStatment, con))
                    {
                        con.Open();
                        foreach (var items in dataList)
                        {


                            cmd.Parameters.Clear();
                            cmd.Parameters.Add("PLANTCODE", OleDbType.VarChar).Value = items.PLANTCODE;
                            cmd.Parameters.Add("LOCATIONCODE", OleDbType.VarChar).Value = items.LOCATIONCODE;
                            cmd.Parameters.Add("LOCATIONNAME", OleDbType.VarChar).Value = items.LOCATIONNAME;
                            cmd.Parameters.Add("LOCATIONSTATUS", OleDbType.VarChar).Value = items.LOCATIONSTATUS;
                            cmd.Parameters.Add("DEPARTMENTCODE", OleDbType.VarChar).Value = items.DEPARTMENTCODE;
                            cmd.Parameters.Add("DEPARTMENTNAME", OleDbType.VarChar).Value = items.DEPARTMENTNAME;


                        }

                        cmd.ExecuteNonQuery();
                    }

            }
        }

    }
    private void button1_Click_1(object sender, EventArgs e)
    {

        InsertData();

    }





}

}

Этот исходный код сначала выбирает данные с сервера sql. После этого сохраните данные в переменной для вставки в oracle. Сейчас я пытаюсь вставить без переменной, затем может вставить данные. но если я изменяю на вставку по переменной, но не могу вставить и получить эту ошибку

ORA-01008: не все переменные связаны с ошибкой "on" cmd.ExecuteNonQuery ();

Ответы [ 4 ]

0 голосов
/ 20 января 2020

Я думаю, вам нужно использовать @ вместо : для параметров. И вам нужно выполнить в пределах l oop и очистить параметры после выполнения.

string insertStatment = "INSERT INTO xxx.BTH_V_LOCATION (PLANTCODE, LOCATIONCODE, LOCATIONNAME, LOCATIONSTATUS, DEPARTMENTCODE, DEPARTMENTNAME) VALUES (@PLANTCODE, @LOCATIONCODE, @LOCATIONNAME, @LOCATIONSTATUS, @DEPARTMENTCODE, @DEPARTMENTNAME)";

    List<Foo> dataList = GetData();

    if (dataList.Count > 0)
    {
        using (OleDbConnection con = new OleDbConnection(connectionString))
        {
            using (OleDbCommand cmd = new OleDbCommand(insertStatment, con))
            {
                con.Open();
                foreach (var items in dataList)
                {

                    cmd.Parameters.AddRange(new OleDbParameter[]
                    {
                        new OleDbParameter("@PLANTCODE", items.PLANTCODE),
                        new OleDbParameter("@LOCATIONCODE", items.LOCATIONCODE),
                        new OleDbParameter("@LOCATIONNAME", items.LOCATIONNAME),
                        new OleDbParameter("@LOCATIONSTATUS", items.LOCATIONSTATUS),
                        new OleDbParameter("@DEPARTMENTCODE", items.DEPARTMENTCODE),
                        new OleDbParameter("@DEPARTMENTNAME", items.DEPARTMENTNAME),
                    });

                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
            }
        }
    }
0 голосов
/ 20 января 2020

Большое спасибо за ваш ответ, но я пытаюсь переместить cmd.Parameters.clear (); , Я все еще получаю ту же ошибку.

using (OleDbConnection con = new OleDbConnection(connectionString))  //OleDbConnection
            {

                using (OleDbCommand cmd = new OleDbCommand(insertStatment, con))  //OleDbCommand
                    {
                        con.Open();
                        foreach (var items in dataList)
                        {
                            cmd.Parameters.Add("PLANTCODE", OleDbType.VarChar).Value = items.PLANTCODE;
                            cmd.Parameters.Add("LOCATIONCODE", OleDbType.VarChar).Value = items.LOCATIONCODE;
                            cmd.Parameters.Add("LOCATIONNAME", OleDbType.VarChar).Value = items.LOCATIONNAME;
                            cmd.Parameters.Add("LOCATIONSTATUS", OleDbType.VarChar).Value = items.LOCATIONSTATUS;
                            cmd.Parameters.Add("DEPARTMENTCODE", OleDbType.VarChar).Value = items.DEPARTMENTCODE;
                            cmd.Parameters.Add("DEPARTMENTNAME", OleDbType.VarChar).Value = items.DEPARTMENTNAME;
                         }
                     cmd.ExecuteNonQuery();
                     cmd.Parameters.Clear();
                    }
            } 

, и я пытаюсь поменять местами "cmd.ExecuteNonQuery ();" и "cmd.Parameters.Clear ();" но тот же результат.

0 голосов
/ 20 января 2020

Теперь я могу исправить эту проблему, меняю имя параметра на "?"

 string insertStatment = "INSERT INTO xxx.BTH_V_LOCATION (PLANTCODE, LOCATIONCODE, LOCATIONNAME, LOCATIONSTATUS, DEPARTMENTCODE, DEPARTMENTNAME) VALUES (?,?,?,?,?,?)";
        List<Foo> dataList = GetData();
        if (dataList.Count > 0)
        {
            using (OleDbConnection con2 = new OleDbConnection(connectionString))  //OleDbConnection
            {

                using (OleDbCommand cmd2 = new OleDbCommand(insertStatment, con2))  //OleDbCommand
                    {
                        con2.Open();
                        cmd2.Parameters.Clear();
                        foreach (var items in dataList)
                        {
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.PLANTCODE;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.LOCATIONCODE;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.LOCATIONNAME;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.LOCATIONSTATUS;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.DEPARTMENTCODE;
                            cmd2.Parameters.Add("?", OleDbType.VarChar).Value = items.DEPARTMENTNAME;
                            //cmd2.ExecuteNonQuery();
                            //cmd2.Parameters.Clear();
                         }
                     cmd2.ExecuteNonQuery();
                     //cmd2.Parameters.Clear();
                    }
               } 
           }
0 голосов
/ 20 января 2020

Move cmd.Parameters.clear (); вне l oop.

Кажется, что очищается каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...