.net(C#)操作Oracle的一点小问题的解决过程

问题表现:

初次学习连接Oracle,写了几行测试代码 。

         /// <summary>       
        /// 读数据表oracledatareader       
        /// </summary>        
        /// <param name="sender"></param>       
        /// <param name="e"></param>       
        private void button_Click(object sender, EventArgs e)
        {
            string connstr = ConfigurationManager.AppSettings.Get("conn");
            using (OracleConnection conn = new OracleConnection(connstr))
            {
                try
                {
                    string sqlstr = "SELECT col_1,col_2 FROM wangguodong_test1";
                    OracleCommand cmd = new OracleCommand(sqlstr, conn);
                    conn.Open();
                    using (OracleDataReader reader = cmd.ExecuteReader())
                    {
                        string str = string.Empty;
                        while (reader.Read())
                        {
                            str += reader.GetString(0) + ", " + reader.GetString(1);
                        } MessageBox.Show(str);
                    }
                }
                catch (Exception exx)
                {
                    MessageBox.Show(exx.Message);
                    throw exx;      
                }
                finally
                {
                    conn.Close();
                }
            }
        }

OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用。

在 System.Data.Common.UnsafeNativeMethods.OCIEnvCreate(IntPtr& envhpp, MODE mode, IntPtr ctxp, IntPtr malocfp, IntPtr ralocfp, IntPtr mfreefp, UInt32 xtramemsz, IntPtr usrmempp)
在 System.Data.OracleClient.TracedNativeMethods.OCIEnvCreate(IntPtr& envhpp, MODE mode)
在 System.Data.OracleClient.OciHandle..ctor(OciHandle parentHandle, HTYPE handleType, MODE ocimode, HANDLEFLAG handleflags)
在 System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
在 System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
在 System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
在 System.Data.OracleClient.OracleConnection.Open()

我的解决思路:

1、问题因为客户端还是服务端引起。

方法如下:程序能编译过。在服务虚拟机上运行。问题没有,很正常。关掉服务机,在客户机运行。并不是每次报找不到服务机错误。问题依旧。断定,问题出在客户端。

2、客户端那里和服务端不同。

仔细想来。调用的驱动可能不同,随添加Oracle.DataAccess.dll引用编译运行。问题解决。

Oracle.DataAccess.dll和System.Data.OracleClient.dll 是有不同的。

相关文档:

在 Oracle 数据库上使用 Visual Studio 2008 构建 .NET 应用程序

System.Data.OracleClient 命名空间

此条目发表在学习笔记分类目录。将固定链接加入收藏夹。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据