c# - 从 oracle 数据库中检索单个用户数据到 Visual Studio C# 应用程序
问题描述
我在 Visual Studio 中使用表单来创建应用程序,然后从 Oracle 数据库中检索数据。除了为单个用户获取数据外,我的所有部分都在工作。这是该部分的form.cs部分
private void getCustomerStringToolStripMenuItem_Click(object sender, EventArgs
e)
{
Getcuststring g = new Getcuststring();
g.Show();
}
这是我的部分类,名为 getcuststring.cs
namespace Assignment
{
public partial class Getcuststring : Form
{
public Getcuststring()
{
InitializeComponent();
}
private void Getcuststring_Load(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Getting();
}
public void Getting()
{
OracleConnection conn = new OracleConnection();
conn.ConnectionString = "Data Source=(DESCRIPTION =" + "(ADDRESS = (PROTOCOL = TCP)" +
"(HOST = *******)(PORT = 1521))" + "(CONNECT_DATA =" + "(SID = dms)));"
+ "User Id= *****;Password= ******;";
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "GET_CUST_STRING_FROM_DB";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("pcustid", OracleDbType.Long).Value = textBox1.Text;
cmd.Parameters.Add("return_value", OracleDbType.Varchar2).Direction = ParameterDirection.ReturnValue;
try
{
cmd.ExecuteNonQuery();
// string result = string.Empty;
var result = cmd.Parameters["result_value"].Value.ToString();
MessageBox.Show(result);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}
}
我的所有其他功能都在工作,但是在 Visual Studio 中执行此操作时,它每次都会发出异常,说没有找到数据,而该客户 ID 存在于 Oracle 数据库中,但它以某种方式没有显示结果,而是引发了异常。 所以你能告诉我我错在哪里,为什么他给我一个例外,说没有找到数据而数据实际上存在。
这是功能
CREATE OR REPLACE FUNCTION GET_CUST_STRING_FROM_DB(pcustid NUMBER) RETURN
VARCHAR2 AS
vcustid NUMBER;
vcustname VARCHAR2(255);
vcustsales NUMBER;
vcuststatus VARCHAR2(255);
BEGIN
SELECT CUSTID,CUSTNAME,SALES_YTD,STATUS INTO
vcustid,vcustname,vcustsales,vcuststatus
FROM CUSTOMER
WHERE CUSTID = pcustid;
RETURN 'CustID: ' || vcustid || ' Name: ' || vcustname || ' Status: ' ||
vcuststatus || ' SalesYTD: ' || vcustsales;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20021,'Customer ID not found');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000,SQLERRM);
END;
解决方案
我认为这是简单的错字,行
var result = cmd.Parameters["result_value"].Value.ToString();
应该:
var result = cmd.Parameters["return_value"].Value.ToString();
我建立了类似的案例,并System.IndexOutOfRangeException
在我运行它时得到了。纠正错字解决了问题。对我有用的整个代码:
OracleConnection CONNECTION
= new OracleConnection("Data Source=XX;User Id=XX;Password=XX;");
CONNECTION.Open();
OracleCommand cmd = new OracleCommand() { Connection = CONNECTION };
cmd.CommandText = "GET_CUST_STRING_FROM_DB";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("pcustid", OracleType.Double).Value = textBox1.Text;
cmd.Parameters.Add("return_value", OracleType.VarChar, 500).Direction
= System.Data.ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
var result = cmd.Parameters["return_value"].Value.ToString();
Console.WriteLine(result);
CONNECTION.Close();
推荐阅读
- matplotlib - 使用 Seaborn 显示多个图形
- asp.net-core - .Net Core Web API 手动验证 Azure AD 访问令牌并获取用户详细信息
- ruby-on-rails - 如何使用 Rails Secrets 存储 Google API 凭据?
- python - 使用前一个项目的代码创建一个新的 django 项目
- php - 当我尝试获取所有记录时,GraphQL 返回错误消息“无法查询字段...”
- scheme - 编写一个获取两个列表的过程 - lst,dup-count - 并根据 dup-count 复制 lst(下面的解释)
- python-3.x - 如何使用每个参数的值列表将 url 参数传递给 Django 模型过滤器
- c++ - 函数不能用作“constexpr”函数
- javascript - ReferenceError:进程未定义模块.../../../node_modules/graphql/jsutils/instanceOf.mjs
- javascript - 如何在 Chakra UI 主题中设置自定义过渡