c# GUI访问Web服务

本文关键字:服务 Web 访问 GUI | 更新日期: 2023-09-27 17:50:14

我有一个在本地服务器上运行的web服务。在它我有一个方法,返回一个json表示的Oracle数据库查询,这是从一个List<Dictionary<String, String>>对象转换。

我有一个需要相同数据的GUI程序。如果我试图将查询移动到GUI,我必须要求用户在那里的系统上安装Oracle,根据我得到以下错误后阅读的内容:

无法加载文件或程序集。DataAccess, Version =…"

我不想让我的用户在他们的系统上安装Oracle。

我的解决方案是只访问运行在web服务上的现有逻辑。. NET 3.5 WebForms App)。我编写了另一个web服务,它返回List<Dictionary<String, String>>对象,而不是经历将其转换为json对象的麻烦。

我如何从GUI得到这个?

在我最初的搜索中,我发现了一些链接,说这是可能的,或者有些地方他们返回json格式的对象。但是没有我想要的东西

帮忙吗?

c# GUI访问Web服务

不太明白你的意思,但是web api呢?这是我用人力资源模式来做的。所以创建一个web API项目。然后打开tools库包管理器,添加oracle驱动程序。输入Install-Package odp.net.managed,然后在你的web配置中配置你的连接字符串,这里是我的,只是我本地机器上的一个数据库,所以我会留下密码。

<add name="hr" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SID=mydatabase))); User Id=hr; Password=fdsafdsafafads;" providerName="oracle.manaagedatacess.client" />

然后创建你的模型/s,这里是一个雇员

public class employee{
    public int employee_id { get; set; }
            public string first_name { get; set; }
            public string last_name { get; set; }
            public string email { get; set; }
            public string phone_number { get; set; }
            public DateTime hire_date { get; set; }
            public string job_id { get; set; }
            public decimal? salary { get; set; }
            public decimal? commission_pct { get; set; }
            public int? manager_id { get; set; }
            public int? department_id { get; set; } 
}

然后我做了一个存储库(如果你使用实体框架,而不是ado,你不需要这些步骤,但我通常不使用实体框架)

namespace webApiOracle.Models
{
    internal class employeeRepository
    {
        internal static IEnumerable<employee> getAllEmployees()
        {
            List<employee> employees = new List<employee>();
            string sql = "SELECT * from employees";
            OracleDataReader rdr = dataHelper.getrdr(sql);
            if (rdr.HasRows)
            {
                while (rdr.Read())
                {
                    employee emp = getEmployee(rdr);
                    employees.Add(emp);
                }
                rdr.Close();
            }
            return employees;
        }
        internal static employee getEmployee(int id)
        {
            employee emp = null;
            string sql = "SELECT * from employees where employee_id = " + id;
            OracleDataReader rdr = dataHelper.getrdr(sql);
            if (rdr.HasRows)
            {
                while (rdr.Read())
                {
                    emp = getEmployee(rdr);
                }
                rdr.Close();
            }
            return emp;
        }
        internal static employee add(employee emp)
        {
            OracleDataAdapter oda = new OracleDataAdapter();
            string sql = "Insert into employees ";
            sql = sql + "(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID) ";
            sql = sql + "values (EMPLOYEES_SEQ.NEXTVAL,:first_name,:last_name,:email,:phone_number,sysdate,:job_id,:salary,:commission_pct,:manager_id,:department_id)";
            OracleConnection cn =
              new OracleConnection(
                  ConfigurationManager.ConnectionStrings
                  ["hr"].ConnectionString);
            cn.Open();
            oda.InsertCommand = new OracleCommand(sql, cn);
            oda.InsertCommand.BindByName = true;
            oda.InsertCommand.Parameters.Add(":first_name", emp.first_name);
            oda.InsertCommand.Parameters.Add(":last_name", emp.last_name);
            oda.InsertCommand.Parameters.Add(":email", emp.email);
            oda.InsertCommand.Parameters.Add(":phone_number", emp.phone_number);
            oda.InsertCommand.Parameters.Add(":job_id", emp.job_id);
            oda.InsertCommand.Parameters.Add(":salary", emp.salary);
            oda.InsertCommand.Parameters.Add(":commission_pct", emp.commission_pct);
            oda.InsertCommand.Parameters.Add(":manager_id", emp.manager_id);
            oda.InsertCommand.Parameters.Add(":department_id", emp.department_id);
            int count = oda.InsertCommand.ExecuteNonQuery();
            sql = "SELECT * from employees where employee_id = EMPLOYEES_SEQ.CURRVAL";
            OracleDataReader rdr = dataHelper.getrdr(sql);
            if (rdr.HasRows)
            {
                while (rdr.Read())
                {
                    emp = getEmployee(rdr);
                }
                rdr.Close();
            }
            return emp;
        }
        internal static IEnumerable<employee> getEmployeesByVal(string key, string value)
        {
            List<employee> employees = new List<employee>();
            string sql = "SELECT * from employees where " + key + " = '" + value + "'";
            OracleDataReader rdr = dataHelper.getrdr(sql);
            if (rdr.HasRows)
            {
                while (rdr.Read())
                {
                    employee emp = getEmployee(rdr);
                    employees.Add(emp);
                }
                rdr.Close();
            }
            return employees;
        }
        private static employee getEmployee(OracleDataReader rdr)
        {
            employee emp = new employee
            {
                employee_id = rdr.GetInt32(rdr.GetOrdinal("EMPLOYEE_ID")),
                first_name = rdr["FIRST_NAME"].ToString(),
                last_name = rdr["LAST_NAME"].ToString(),
                email = rdr["EMAIL"].ToString(),
                phone_number = rdr["PHONE_NUMBER"].ToString(),
                hire_date = rdr.GetDateTime(rdr.GetOrdinal("HIRE_DATE")),
                job_id = rdr["JOB_ID"].ToString(),
                salary = dataHelper.decimalnullable(rdr, "SALARY"),
                commission_pct = dataHelper.decimalnullable(rdr, "COMMISSION_PCT"),
                manager_id = dataHelper.intnullable(rdr, "MANAGER_ID"),
                department_id = dataHelper.intnullable(rdr, "DEPARTMENT_ID")
            };
            return emp;
        }
    }
}

然后制作一个web API控制器到控制器文件夹右键单击并选择空的web API控制器。

public class employeeController : ApiController
    {

        public IEnumerable<employee> GetAllEmployees()
        {
            return employeeRepository.getAllEmployees();
        }
        //[Route("api/employee/{id:int}")]
        public employee getEmployee(int id) {
            return employeeRepository.getEmployee(id);
        }
        [Route("api/employee/{key}/{value}")]
        public IEnumerable<employee> getEmployeesByVal(string key, string value) {
            return employeeRepository.getEmployeesByVal(key, value);
        }
        [HttpPost]
        public employee add(employee emp)
        {
            return employeeRepository.add(emp);
        }
    }
}

然后当你需要json数据时调用url如果我想要所有员工,url是/api/employee如果你只想要一个员工,id为100的url是/api/employee/100如果你想要姓king的员工,id为/api/employee/last_name/king

有很多web API的例子,如果你想看的话,还有一些免费的电子书。