跪求 C#.net ODBC在Oracle数据库中创建表

时间:2021-10-29 21:22:00
各位大侠,小妹想用 C#.net ODBC连接 在Oracle数据库中创建表,请大家帮忙一下特急!!
另外我有写了代码可总是报错,大家帮我看一下!create表的语句在oracle的工具中执行可以,但是在下面的代码中执行报
”[Microsoft][ODBC driver for Oracle][Oracle]ORA-00955: 名称已由现有对象使用“的错误
我用的是DNS连接数据库
  public bool ChkTable(string TableName) //检查表是否存在
        {
            string sql = "";
            OdbcConnection OdbcConn = new OdbcConnection(sConn);
            OdbcCommand cmd = new OdbcCommand("", OdbcConn);
            try
            {
                OdbcConn.Open();
                sql = "SELECT COUNT(TABLE_NAME) * FROM  USER_TABLES";
                sql += " WHERE TABLE_NAME='" + TableName.ToUpper() + "' ";
                cmd.CommandText = sql;
                oResult= cmd.ExecuteNonQuery();
            }
            catch
            {
                try
                {
                     //不存在创建新表
                    sql = "CREATE TABLE " + TableName.ToUpper() + "";
                    sql += "(";
                    sql += " USER_ID NUMBER(6) NOT NULL";
                    sql += ",USER_NO VARCHAR2(10) NOT NULL";
                    sql += ",USER_NAME_CH VARCHAR2(10) NOT NULL";
                    sql += ",USER_NAME_EN VARCHAR2(16) NULL";
                    sql += ",USER_DEPT VARCHAR2(30) NOT NULL";
                    sql += ",USER_TITLE VARCHAR2(30) NOT NULL";
                    sql += " ,CONSTRAINT USERINFO_PK PRIMARY KEY (USER_ID)";
                    sql += " USING INDEX";
                    sql += " TABLESPACE USERS,";
                    sql += " CONSTRAINT USERINFO_UNIQUE UNIQUE(USER_NO) ";
                    sql += ") TABLESPACE USERS";
                    cmd.CommandText = sql;
                    cmd.CommandType = CommandType.Text;
                    oResult = cmd.ExecuteNonQuery();
                    OdbcConn.Close();

                }
                catch (Exception e)
                {
                    throw e;
                };

            }
            if (oResult.Equals("-1"))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

11 个解决方案

#1


ORA-00955: 名称已由现有对象使用
和odbc没有关系,是你的创建的表名和库里的名字重复了,是不是你用工具执行了建表语句后没有drop,又用程序创建肯定会出错了

#2


Friendly Up!

#3


http://blog.csdn.net/wyzxg/archive/2009/02/19/3908146.aspx

先看看Oracle错误吗的提示,Oracle中的每个错误吗都有解释的

#4


你的方法严重有问题。

OdbcConn.Open();
                sql = "SELECT COUNT(TABLE_NAME) * FROM  USER_TABLES";
                sql += " WHERE TABLE_NAME='" + TableName.ToUpper() + "' ";
                cmd.CommandText = sql;
                oResult= cmd.ExecuteNonQuery();

这一段不知道写在这里有什么作用,没看它能判断出是否存在同名数据的逻辑。 并且ExecuteNonQuery()是用来执行增加、更新和删除的SQL语句,而不是查询的。

#5


asp.net夜话之七:ADO.NET介绍
ADO.NET是对Microsoft ActiveX Data Objects (ADO)一个跨时代的改进,它提供了平台互用性和可伸缩的数据访问。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。事实上,接受数据的组件不一定要是ADO .NET组件,它可以是基于一个Microsoft Visual Studio的解决方案,也可以是任何运行在其它平台上的任何应用程序。以前做数据库访问的时候,需要一直与数据库保持连接,直到获取完所有满足需要的数据之后才会断开数据库连接,这种数据库访问方式称之为连接式数据访问技术。相比于以前的连接式数据访问技术,ADO.NET除了提供连接式数据访问技术之外,还提供了另一种断开式解决方案,那就是在内存中模拟一个数据库,也就是内存中的数据库。我们知道在实际的数据库技术中,每个数据库就是一个业务逻辑单元,一般来说这个数据库包含了实现一个应用软件或者一个网站所需要的全部数据。

Command对象
Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
Command主要有三个方法:
ExecuteNonQuery () :执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。
ExecuteReader ():执行一个查询的SQL语句,返回一个DataReader对象。
ExecuteScalar ():从数据库检索单个值。这个方法主要用于统计操作。

#6


方法设置有些问题,仔细看看! 

#7


liangchencf
我去oracle数据库里查了,没有这个表!!
另外请大家给出详细的代码

#8


一个不带异常检测的示例:

public void ChkTable(string TableName) //检查表是否存在,如果不存在则创建表
    {
        string sql = "";
        OdbcConnection OdbcConn = new OdbcConnection(sConn);
        OdbcCommand cmd = new OdbcCommand("", OdbcConn);
        OdbcConn.Open();
        sql = "SELECT COUNT(TABLE_NAME) * FROM  USER_TABLES";
        sql += " WHERE TABLE_NAME='" + TableName.ToUpper() + "' ";
        cmd.CommandText = sql;
        int count = int.Parse(cmd.ExecuteScalar().ToString());
        if (count == 0)
        {
            //不存在创建新表
            sql = "CREATE TABLE " + TableName.ToUpper() + "";
            sql += "(";
            sql += " USER_ID NUMBER(6) NOT NULL";
            sql += ",USER_NO VARCHAR2(10) NOT NULL";
            sql += ",USER_NAME_CH VARCHAR2(10) NOT NULL";
            sql += ",USER_NAME_EN VARCHAR2(16) NULL";
            sql += ",USER_DEPT VARCHAR2(30) NOT NULL";
            sql += ",USER_TITLE VARCHAR2(30) NOT NULL";
            sql += " ,CONSTRAINT USERINFO_PK PRIMARY KEY (USER_ID)";
            sql += " USING INDEX";
            sql += " TABLESPACE USERS,";
            sql += " CONSTRAINT USERINFO_UNIQUE UNIQUE(USER_NO) ";
            sql += ") TABLESPACE USERS";
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;
            oResult = cmd.ExecuteNonQuery();
        }
        OdbcConn.Close(); 

    }

#9


周公回答的很详尽
回复内容太短了!

#10


为什么用odbc连接Oracle数据库呢,,汗,,,用Oracleclent啊~~~
 string   ConnectionString="Data   Source=sky;user=system;password=manager;";   //写连接串   
  OracleConnection   conn=new   OracleConnection(ConnectionString);   //创建一个新连接   
  try   
  {   
        conn.Open();   
        OracleCommand   cmd=conn.CreateCommand();   
        cmd.CommandText="select   *   from   MyTable";   //在这儿写sql语句   
        OracleDataReader   odr=cmd.ExecuteReader();//创建一个OracleDateReader对象   
        while(odr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了                                   
        {   
              Response.Write(odr.GetOracleString(1).ToString());//输出字段1,这个数是字段索引,具体怎么使用字段名还有待研究   
          }   
          odr.Close();   
  }   
  catch(Exception   ee)   
  {   
            Response.Write(ee.Message);//如果有错误,输出错误信息   
  }   
  finally   
  {   
            conn.Close();   //关闭连接   
  }   

还有你的这句oResult= cmd.ExecuteNonQuery(); 
这是对数据库增删改的操作,而不是查询的操作,你上网搜搜吧,大把大把的

#11


如果是vs2008
你在VS2008里点击 网站->添加引用->.net选项卡里找到System.Data.OracleClient 然后添加。 
然后在引入命名空间的地方输入using System.Data.OracleClient; 
然后就可以像用SqlClient一样用了。对象基本都是类似的。 
这个命名空间是2.0的版本,可能兼容性有点问题。

#1


ORA-00955: 名称已由现有对象使用
和odbc没有关系,是你的创建的表名和库里的名字重复了,是不是你用工具执行了建表语句后没有drop,又用程序创建肯定会出错了

#2


Friendly Up!

#3


http://blog.csdn.net/wyzxg/archive/2009/02/19/3908146.aspx

先看看Oracle错误吗的提示,Oracle中的每个错误吗都有解释的

#4


你的方法严重有问题。

OdbcConn.Open();
                sql = "SELECT COUNT(TABLE_NAME) * FROM  USER_TABLES";
                sql += " WHERE TABLE_NAME='" + TableName.ToUpper() + "' ";
                cmd.CommandText = sql;
                oResult= cmd.ExecuteNonQuery();

这一段不知道写在这里有什么作用,没看它能判断出是否存在同名数据的逻辑。 并且ExecuteNonQuery()是用来执行增加、更新和删除的SQL语句,而不是查询的。

#5


asp.net夜话之七:ADO.NET介绍
ADO.NET是对Microsoft ActiveX Data Objects (ADO)一个跨时代的改进,它提供了平台互用性和可伸缩的数据访问。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。事实上,接受数据的组件不一定要是ADO .NET组件,它可以是基于一个Microsoft Visual Studio的解决方案,也可以是任何运行在其它平台上的任何应用程序。以前做数据库访问的时候,需要一直与数据库保持连接,直到获取完所有满足需要的数据之后才会断开数据库连接,这种数据库访问方式称之为连接式数据访问技术。相比于以前的连接式数据访问技术,ADO.NET除了提供连接式数据访问技术之外,还提供了另一种断开式解决方案,那就是在内存中模拟一个数据库,也就是内存中的数据库。我们知道在实际的数据库技术中,每个数据库就是一个业务逻辑单元,一般来说这个数据库包含了实现一个应用软件或者一个网站所需要的全部数据。

Command对象
Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
Command主要有三个方法:
ExecuteNonQuery () :执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。
ExecuteReader ():执行一个查询的SQL语句,返回一个DataReader对象。
ExecuteScalar ():从数据库检索单个值。这个方法主要用于统计操作。

#6


方法设置有些问题,仔细看看! 

#7


liangchencf
我去oracle数据库里查了,没有这个表!!
另外请大家给出详细的代码

#8


一个不带异常检测的示例:

public void ChkTable(string TableName) //检查表是否存在,如果不存在则创建表
    {
        string sql = "";
        OdbcConnection OdbcConn = new OdbcConnection(sConn);
        OdbcCommand cmd = new OdbcCommand("", OdbcConn);
        OdbcConn.Open();
        sql = "SELECT COUNT(TABLE_NAME) * FROM  USER_TABLES";
        sql += " WHERE TABLE_NAME='" + TableName.ToUpper() + "' ";
        cmd.CommandText = sql;
        int count = int.Parse(cmd.ExecuteScalar().ToString());
        if (count == 0)
        {
            //不存在创建新表
            sql = "CREATE TABLE " + TableName.ToUpper() + "";
            sql += "(";
            sql += " USER_ID NUMBER(6) NOT NULL";
            sql += ",USER_NO VARCHAR2(10) NOT NULL";
            sql += ",USER_NAME_CH VARCHAR2(10) NOT NULL";
            sql += ",USER_NAME_EN VARCHAR2(16) NULL";
            sql += ",USER_DEPT VARCHAR2(30) NOT NULL";
            sql += ",USER_TITLE VARCHAR2(30) NOT NULL";
            sql += " ,CONSTRAINT USERINFO_PK PRIMARY KEY (USER_ID)";
            sql += " USING INDEX";
            sql += " TABLESPACE USERS,";
            sql += " CONSTRAINT USERINFO_UNIQUE UNIQUE(USER_NO) ";
            sql += ") TABLESPACE USERS";
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;
            oResult = cmd.ExecuteNonQuery();
        }
        OdbcConn.Close(); 

    }

#9


周公回答的很详尽
回复内容太短了!

#10


为什么用odbc连接Oracle数据库呢,,汗,,,用Oracleclent啊~~~
 string   ConnectionString="Data   Source=sky;user=system;password=manager;";   //写连接串   
  OracleConnection   conn=new   OracleConnection(ConnectionString);   //创建一个新连接   
  try   
  {   
        conn.Open();   
        OracleCommand   cmd=conn.CreateCommand();   
        cmd.CommandText="select   *   from   MyTable";   //在这儿写sql语句   
        OracleDataReader   odr=cmd.ExecuteReader();//创建一个OracleDateReader对象   
        while(odr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了                                   
        {   
              Response.Write(odr.GetOracleString(1).ToString());//输出字段1,这个数是字段索引,具体怎么使用字段名还有待研究   
          }   
          odr.Close();   
  }   
  catch(Exception   ee)   
  {   
            Response.Write(ee.Message);//如果有错误,输出错误信息   
  }   
  finally   
  {   
            conn.Close();   //关闭连接   
  }   

还有你的这句oResult= cmd.ExecuteNonQuery(); 
这是对数据库增删改的操作,而不是查询的操作,你上网搜搜吧,大把大把的

#11


如果是vs2008
你在VS2008里点击 网站->添加引用->.net选项卡里找到System.Data.OracleClient 然后添加。 
然后在引入命名空间的地方输入using System.Data.OracleClient; 
然后就可以像用SqlClient一样用了。对象基本都是类似的。 
这个命名空间是2.0的版本,可能兼容性有点问题。