我在本地服务器上运行了一个Web服务。在其中,我有一个方法返回Oracle数据库查询的json表示,该查询从List<Dictionary<String, String>>
对象转换。
我有一个需要相同数据的GUI程序。如果我尝试将查询移动到GUI,我必须要求用户在系统上安装Oracle,根据我在收到以下错误后阅读的内容:
无法加载文件或程序集'Oracle.DataAccess,Version = ...'
我不想让我的用户在他们的系统上安装Oracle。
我的解决方案是访问运行在Web服务(.NET 3.5 WebForms App)上的现有逻辑。我编写了另一个返回List<Dictionary<String, String>>
对象的Web服务,而不是经历将其转换为json对象的麻烦。
如何从GUI中获取此信息?
在我的初始搜索中,我发现了一些链接,表示它是可能的,或者是一些以json格式返回对象的链接。但没有任何明确的内容。
任何帮助?
答案 0 :(得分:0)
不是很关注你但是网络api怎么样?这是我使用hr模式玩的一个。所以创建一个web api项目。然后打开工具库包管理器并添加oracle驱动程序。键入Install-Package odp.net.managed
然后在您的网络配置中配置您的连接字符串这是我的本地计算机上的数据库,所以我将保留密码。
<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" />
然后在这里创建您的模型是一名员工
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的员工将是/ api / employee / 100姓氏为国王,将是/ api / employee / last_name / king
有大量的网络api示例和一些免费电子书,如果你想查看它。