问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

.net开发C/S应用程序,能否帮我分析一下这个该怎么做

发布网友 发布时间:2022-04-30 23:01

我来回答

6个回答

懂视网 时间:2022-05-01 03:22

其实这个不是一个什么新的话题。但是之前在多次项目中,总是遇到大家针对Oracle数据库的访问时,会有各种各样的问题,最基本的就是要在客户端安装各种client,版本不一样的话还有各种问题。

静下心来看看,其实也没有那么难。我这里总结一下,如何在.NET应用程序中,简单优雅地使用Oracle数据库。

第一个原则:不要依赖

最好的情况就是,程序自己就可以完成数据访问,不需要额外地安装所谓的Oracle Client,那是一个很麻烦而且痛苦的事情。

我们首先看看,如果不装任何东西,是否可以实现Oracle数据库访问?

其实,.NET本身是自带了针对Oracle数据库访问的组件的,就是下面这个System.Data.OracleClient

技术分享

我们的代码如下(这是最原始的ADO.NET代码,只是做演示)

using System;
using System.Data.OracleClient;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "user id=system;password=password;data source=192.168.56.101:1521/orcl";

            using (var connection = new OracleConnection(connectionString))
            {
                var cmd = connection.CreateCommand();
                cmd.CommandText = "select * from sys.dba_all_tables";
                connection.Open();
                var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));

                }

                reader.Close();
                connection.Close();

            }
           
        }
    }
}

 

看起来应该是没有问题的,运行起来却会报错

Additional information: System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.

技术分享

这里的提示就是说,需要有Oracle Client。

这不是我们希望看到的结果。实际上原理上说,我们这么理解吧,可能是这个组件只是一个wrapper,它实际去操作数据库,还需要通过Oracle Client才能实现。

 

使用Oracle提供的组件

更好的建议就是,使用Oracle 官方提供的托管代码组件。Oracle.ManagedDataAccess.dll

技术分享

技术分享

只要添加了这个Nuget Package,代码几乎不需要任何改动,直接就可以复用。

using System;
using Oracle.ManagedDataAccess.Client;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "user id=system;password=password;data source=192.168.56.101:1521/orcl";

            using (var connection = new OracleConnection(connectionString))
            {
                var cmd = connection.CreateCommand();
                cmd.CommandText = "select * from sys.dba_all_tables";
                connection.Open();
                var reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));

                }

                reader.Close();
                connection.Close();

            }
           
        }
    }
}

 

当然比较理想的情况是将连接字符串之类的,可以放在配置文件中去。这个很简单,这里就不说明了。

 

结合Entity Framework使用

Entity Framework 出来已经好多年了,几乎成了所有.NET应用程序中的标配(不管有没有用到)。现在的最新版本应该是 6.1.3 .同时,需要注意的是,以后会有一个所谓的Entity Framework Core ,而且开源了 https://github.com/aspnet/EntityFramework

回到正题,之前的代码写法其实还是比较原始的,那么如何结合Entity Framework进行Oracle数据库方面的编程呢?

首先,安装下面的这个组件:Oracle.ManagedDataAccess.EntityFramework

技术分享

然后,可以使用Code first的方式编写如下代码

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace ConsoleApplication
{
    public class OracleContext : DbContext
    {
        public OracleContext() : base("OracleDbContext")
        {

        }

        public DbSet<Employee> Employees { get; set; }

    }

    [Table("EMPLOYEES", Schema = "SYSTEM")]
    public class Employee
    {
        [Key()]
        [Column("EMPLOYEEID")]
        public int EmployeeID { get; set; }

        [Column("FIRSTNAME")]
        public string FirstName { get; set; }
        [Column("LASTNAME")]
        public string LastName { get; set; }
    }
}

 

 

这里的代码没有什么出奇的。配置文件需要有如下的设置(一般在添加Oracle.ManagedDataAccess.EntityFramework 这个组件的时候,会自动修改配置文件)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="oracle" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
             </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="OracleDbContext" connectionString="user id=system;password=password;data source=oracle" providerName="Oracle.ManagedDataAccess.Client" />
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v13.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

后台数据库的表格设计也是很简单。

技术分享

需要注意的是,经过实验,我发现目前这个Entity Framework要求所操作的表必须要有主键,而且主键必须是一个identity column(即自己绑定一个序列,实现自动增长),否则会报错

实际上后台会通过一个触发器来实现这个功能

create or replace TRIGGER EMPLOYEES_TRG
BEFORE INSERT ON EMPLOYEES
FOR EACH ROW
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.EMPLOYEEID IS NULL THEN
      SELECT EMPLOYEES_SEQ.NEXTVAL INTO :NEW.EMPLOYEEID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;

 

接下来在前端程序中就简单多了,下面是一个代码片段

var ctx = new OracleContext();

ctx.Employees.Add(new Employee() {FirstName = "ares", LastName = "chen" });
ctx.SaveChanges();

var query = ctx.Employees.ToArray();
foreach (var item in query)
{
    Console.WriteLine(item);
}

 

需要注意的是,如果需要使用Entity Frmaework的Database first或Model first的功能,还是需要安装Oracle Client,或者准确地说应该是ODAC组件

http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html

在.NET开发面向Oracle数据库的应用程序

标签:

热心网友 时间:2022-05-01 00:30

。。。Oracle是数据库,.net是一个架构平台,c 是一门语言。如果要搞好IT,这三个都应该了解。作为数据库Oracle是关系数据库商业应用的代表。.net是微软力推的开发平台,开发架构,用xaml来描述界面等。c 是个面向对象的语言,兼顾了c的效率和面向对象的特点。
建议:
1.数据库要了解Mysql,SqlServer,Oracle。至少知道他们是干啥的,还最最近流行起来的NoSql
2.平台比较多根据学习的语言和应用的方向会有很多东西,.net,RoR,等等
3.语言,面向对象的语言建议学习Python,函数式的语言lua,另外有兴趣可以学习c,c ,java。多掌握几门语言是有好处的要冲级了,采纳下吧
pzbrgfwydr25675558072013-2-8 14:26:12

热心网友 时间:2022-05-01 01:48

这种应该是深度定制的控件,不仅仅是简单的控件拼拼凑凑搭配出来的。你要是用WPF可以很容易的实现。WinForm你只能自己写一个控件了

热心网友 时间:2022-05-01 03:23

这个使用 TREEVIEW 控件即可。
将treeview的加减号,用箭头图片来实现,就可以了。追问

但是treeview选中一个节点,图片中那个蓝条效果怎么弄?(下图是选中treeview节点的效果)

热心网友 时间:2022-05-01 05:14

网上下载一个插件,或者找找开源的代码,模仿写一个!

热心网友 时间:2022-05-01 07:22

网上搜一下仿QQ界面的代码,应该有的
简述C/S和B/S模式的区别

C / S程序可以更加注重进程,可以检查多级权限,并可以较少考虑系统的运行速度。B / S对安全性和访问速度的多重考虑是基于对更多优化的需求。从MS的.Net系列开始,具有比C / S更高要求的程序架构是一种发展趋势。 BizTalk 2000 Exchange 2000等,完全支持网络组件构建系统。 SUN和IBM推出JavaBean组件...

什么是b/s模式?b/s模式的 结构?c/s与b/s的异同?

其次,今天所有电脑的浏览器界面,不仅直观和易于使用,更主要的是基于浏览器平台的任何应用软件其风格都是一样的,使用人对操作培训的要求不高,而且软件可操作性强,易于识别;再者,平台体系结构也从过去单用户发展到今天的文件/服务器(F/S)体系、客户机/服务器(C/S)体系和浏览器/服务器(B/S)体系。二、C/S和B/...

从b/s转型到c/s,我是洗具了还是杯具了

现在这个网络时代 较多的还是 B/S..所以虽然你做C/S,但你千万不要把B/S给丢了...

我的毕设是完成一个应用程序的开发.可我只学过c语言怎么办?我是不是...

如果有较多界面开发的话,最好学学java或者是c#,用起来会方便很多。当然,如果你对mfc已经很熟悉了的话,c++也很容易搞定的 完成的目标一开始就已经确定的话,那无非就是定需求,然后分模块设计再实现就ok了。

计算机网络的就业方向

网络管理与维护。主要工作内容为:计算机设备安装与调试、网络运行监控、网络安全监控、网络设备管理、网络产品销售与售后服务、网络安全管理。网站建设与维护。主要工作内容为:网站规划设计、素材采集与加工、网站建设、网站运行维护。网络编程。主要工作内容为:数据库编程、开发C/S和B/S构架的应用程序。;

计算机网络技术就业方向?

2、资源共享 资源共享是人们建立计算机网络的主要目的之一。计算机资源包括硬件资源、软件资源和数据资源。硬件资源的共享可以提高设备的利用率,避免设备的重复投资,如利用计算机网络建立网络打印机;软件资源和数据资源的共享可以充分利用已有的信息资源,减少软件开发过程中的劳动,避免大型数据库的重复建设。3...

C#分为WEB应用程序和windows应用程序,二者有什么区别,可不可以只学wind...

windows应用程序即窗体应用程序,常用的桌面程序都是,可开发C/S架构的软件。WEB应用程序就是以ASP.NET为主的web应用程序,说白了就是做网站!它可以开发B/S架构的软件。现在比较流行B/S架构,所以你必须学ASP.NET,否则C#不算学好,C#我认为在以ASP.NET为主的web应用程序应用的更广泛一些,更有发展...

计算机网络技术专业分 哪些

网络管理与维护。主要工作内容为:计算机设备安装与调试、网络运行监控、网络安全监控、网络设备管理、网络产品销售与售后服务、网络安全管理。网站建设与维护。主要工作内容为:网站规划设计、素材采集与加工、网站建设、网站运行维护。网络编程。主要工作内容为:数据库编程、开发C/S和B/S构架的应用程序。

如何用c#编写c/s模式的 电子教室

实际是用socket方法即可实现这个功能,具体代码看如下 服务端:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63...

为什么一直提示应用程序出错,这个要怎么处理?

或你在操作什么出现的?找到后卸载重装试试,还是不行,换类似的软件。如果找不出原因来,卸载出事前下载的东西,还原一下系统或重装(有问题请你追问我)。如果是开机出现的是程序的话,看看开机启动中是否有这个选项,如果有将其去掉,如果是系统进程不适用上面的方法。

C.A.T.S 什么是S C P 奔驰S M C都代表什么 A S E C级奔驰有什么不同 S/C S C A C与S的区别 管理中的P D Q C M S S C P官网
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见父母有一方死亡的预兆 昨晚做梦梦见我的父母和丈夫都死了, 父母本来就去世很久了,并且他们一... 农产品流通与管理专业怎么样_就业方向_主要课程 鱿鱼须是海鲜吗 鱿鱼须有哪些挑选的小窍门 保密教育培训方案 下列各项业务中,应通过"固定资产清理”账户核算的有 pcr上岗证考完试会在什么时候公布 帮忙解一道会计题目 固定资产清理,不考虑税收,按题回答即可 pcr证书怎样考? 机关事业单位涨工资最新消息 2020年已经10月11号机关事业单位涨工资怎么还没有消息今年能涨吗? 怎么把吃鸡号QQ的转到另一个QQ上 用QQ第二次登吃鸡为什么是个新号? 同一个QQ号怎样才能在吃鸡上像王者一样换区? 中秋节作文600字优秀篇加批注 我的中秋节作文600字 信用卡有逾期记录34个月,还能办房贷吗? 吃鸡为什么同样手机一个为什么显示两个账号? 一个QQ号登2个吃鸡号,改了QQ密码另一个号还需重新输密吗? 和平精英一个QQ账号有两个号但另一个号在另一个手机 舌苔白中间有裂纹边有齿痕是什什问题,需要怎样调理 请问我舌苔偏白中有裂纹边有齿痕是怎么回事? 上海名校名卷数学静安名校五年极第一学期第五单元测试卷答案 竞争乡镇领导干部有什么优势有什么特长有什么不足 名校试卷答案 长江出版社五年级上册数学学业测评第四十面第五大题的答案 城东小学五年级语文上册大试卷第6单元发展卷的参考答案 房贷未结清的住房可以申请快贷网抵押贷款么? 劳动合同与劳务合同的区别是什么? 全世界都在追杀我,怎么办? 为什么人类一思考上帝就发笑?这句话出自哪里? 世界末日 歌词 我想你飞,你温柔的追,求歌名 我总感觉全世界男人都在追我暗恋我怎么办? 找一本无限流小说开场是主角被全世界追杀躲在海上一直享受最后脱离世界一路还泡了很多妞 马丁.尼莫拉的忏悔诗 公司账户转到私人账户这个分录怎么做 公户对私户支付货款,账务怎样处理。 歌词 如果有梦想就去追至少不会遗憾后悔女唱的。知道歌名吗亲 个体户老板公账转到私账怎么做账 感觉全世界都在与我为敌 公司公账转私账请问一下怎么做外账 大众宝来换挡风玻璃多少钱? 有一个女孩子追我怎么办 触的音序和音节是什么?意思又是什么 裁员的一个案例 请教管理高手!!! 私人对公账户进行转账,公账再对私人转帐该怎么做账。 触字的音节 昨晚梦见飞碟在追杀我,什么意思