Oracle与Oracle ODBC

时间:2014-04-16 17:24:01

标签: sql oracle oracle11g odbc

以下代码可以在Oracle的SqlPlus中使用(使用Oracle 11.2.02.0g),但是当我通过C#代码连接和ODBC连接时,我被告知我的字符无效。

由于单引号在SQLplus中不起作用,我假设ODBC认为无效的字符是双引号。我试过大括号'{'和括号'['但仍然得到相同的错误 - >错误[HY000] [Oracle] [ODBC] [Ora] ORA-00911:无效字符< -

非常感谢任何帮助。我仍然不明白为什么因为连接类型而对SQL语句的解释会有所不同。

CREATE USER "AD1\EGRYXU" IDENTIFIED EXTERNALLY;

如果单独运行会导致用户名与其他用户或角色名称冲突,则会出错。它确实在数据库中创建用户。

C#代码如下。

private void button1_Click(object sender, EventArgs e)
        {
            string happy = "";
            string sql1 = "";
            string sql2 = "";
            string sql3 = "";
            string sql4 = "";
            string column;
            int rownum = -1;
            bool frst = false;
            string dirIni = "\\\\ramxtxss021-f01\\hou_common_013\\globaluser\\";
            string fileIni = "add_users.sql";
            string transIniFullFileName = Path.Combine(dirIni, fileIni);
            System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection();

            num_users = (usrdetails.Count > 0);
            if (regions && num_users)
            {
               using (StreamWriter sw = new StreamWriter(transIniFullFileName))
                {
                    for (int y = 0; y < usrdetails.Count; y++)
                    {
                        switch(usrdetails[y].add_del.ToUpper())
                        {
                            case "A":
                                  sql1 = "CREATE USER \"" + usrdetails[y].userID.ToUpper() + "\" IDENTIFIED EXTERNALLY;";
                                  sql2 = "GRANT EDMROLE TO \"" + usrdetails[y].userID.ToUpper() + "\";";
                                  sql3 = "INSERT INTO MD_SITE_USER VALUES(generate_key(5), (select user_id from MD_SITE_USER where user_name = '" +
                                         usrdetails[y].group + "') , {" + usrdetails[y].userID.ToUpper() + "}, " + usrdetails[y].seclev +
                                         ", '" + usrdetails[y].username.ToUpper() + "', 'U', '" + usrdetails[y].isext.ToUpper() + "', 'N');";
                                  sw.WriteLine(sql1);
                                  sw.WriteLine(sql2);
                                  sw.WriteLine(sql3);
                                  break;
                            case "D":
                                  sql2 = "DELETE MD_SITE_APP_ACTION_OWNER WHERE user_id in (SELECT user_id FROM MD_SITE_USER where user_name  = ‘"+ usrdetails[y].userID + "’+ and user_or_group = ‘U’);";
                                  sql3 = "DELETE FROM MD_SITE_USER where user_name  = ‘"+ usrdetails[y].userID + "’ and user_or_group = ‘U’;";
                                  sql4 = "DROP USER "+ usrdetails[y].userID + " FROM USERS;";
                                  sw.WriteLine(sql2);
                                  sw.WriteLine(sql3);
                                  sw.WriteLine(sql4);
                                  break;
                            default:
                                  MessageBox.Show("Add/Delete command argument not recognized for user\r\n" + usrdetails[y].userID + " \r\n Argument -> " + usrdetails[y].add_del);
                                  break;

                        }
                    }
                 sw.Close();
                }
                for (int x = 0; x < region.Count; x++)
                {
                    OdbcCommand command = new OdbcCommand();
                    conn.ConnectionString = "Driver={Oracle in OraClient11g_home1};" +
                                            "Dbq=" + region[x].dbname +
                                            ";Uid=" + region[x].username + ";Pwd=" + region[x].password + ";";
                    try
                    {
                        string cmdTexts = File.ReadAllText(transIniFullFileName);
                        conn.Open();
                        using (conn)
                        {
                            command.Connection = conn;
                            command.CommandText = cmdTexts;
                            command.ExecuteNonQuery();
                            OdbcDataReader dr = command.ExecuteReader();
                            Form6.dataGridView2.AutoGenerateColumns = false;
                            if (!frst)
                            {
                                for (int i = 0; i < dr.FieldCount; i++)
                                {
                                    column = dr.GetName(i);
                                    Form6.dataGridView2.Columns.Add("col" + i, column);
                                    Form6.dataGridView2.Columns[i].FillWeight = 1;
                                }
                                frst = true;
                            }
                            rownum++;
                            dataGridView1.Rows.Add();
                            dataGridView1.Rows[rownum].Cells[0].Value = "Results for Region -> " + Form5.region[x].dbname;
                            dataGridView1.Refresh();
                            while (dr.Read())
                            {
                                rownum++;
                                Form6.dataGridView2.Rows.Add();
                                for (int i = 0; i < dr.FieldCount; i++)
                                {
                                    column = dr.GetValue(i).ToString();
                                    Form6.dataGridView2.Rows[rownum].Cells[i].Value = column;
                                }
                            }
                            Form6.dataGridView2.Refresh();
                            Form6.dataGridView2.Show();
                            Form6.Show();
                        }
                       conn.Close();
                       Form6.dataGridView2.Refresh();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error Message: " + ex.Message);
                    }
                }
            }
            else
            {
                if (!regions)
                    happy = "Error - You have not selected any regions.\r\n";
                else
                    happy = "Regions are now selected.\r\n";
                if (!num_users)
                    happy = happy + "Error - You have not entered any users.\r\n";
                MessageBox.Show(happy);
            }
          File.Delete(transIniFullFileName);
        }

1 个答案:

答案 0 :(得分:2)

不要使用&#34;;&#34;命令文本中的(分号)..

ODBC或ODP中的命令文本应该是一个命令,例如因此,不是一组命令 - &#34;;&#34;是不相关的,是无效的角色。


看起来你正在尝试运行脚本.. 如果这是你的意图,那么它应该用&#34; begin&#34;填充。和&#34;结束&#34;使代码能够运行:

BEGIN
 INSERT...;
 DELETE ...;
END;

(有关详细信息,请参阅http://www.intertech.com/Blog/executing-sql-scripts-with-oracle-odp/

最后一件事 - 如果你想运行&#34;创建用户&#34; (或任何其他DDL)来自匿名块或您需要使用&#34执行的过程;立即执行&#34;语法:

BEGIN
 execute immediate 'CREATE USER test IDENTIFIED EXTERNALLY';
END;