2014-04-16 87 views
0

下面的代码可以在Oracle的SqlPlus(使用Oracle 11.2.02.0g)中正常工作,但是当我通过C#代码连接并通过ODBC连接时,我得到的消息告诉我有一个无效字符。Oracle vs Oracle 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); 
     } 
+0

您可能想向我们展示您的C#代码... – mustaccio

+0

这里有三个单独的语句。从C#执行时,三者中的哪一个会导致错误? –

+0

据我所知第一和第二个陈述(第三个依赖于前两个)。 C#代码现在也包含在内。 – user3308131

回答

2

请勿使用“;” (分号)。

ODBC或ODP中的命令文本应该是一个命令,例如,不是一组命令,因此 - “;”不相关,并且是无效字符。


似乎您试图运行一个脚本.. 如果这是你的意图,它应该有一个“开始”和“结束”的代码能够运行来填充:

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

(参见http://www.intertech.com/Blog/executing-sql-scripts-with-oracle-odp/获取更多信息)

最后一件事 - 如果你想运行一个“创建用户”从一个匿名块或程序中(或任何其他DDL),你需要与运行“立即执行“语法:

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