【发布时间】:2018-09-18 14:23:30
【问题描述】:
我在 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;
【问题讨论】:
-
很可能问题出在函数
GET_CUST_STRING_FROM_DB,请给我们看一下这个函数的代码。 -
pcustid的数据类型真的是LONG。 Oracle 中的数据类型LONG已被弃用很长时间,通常在使用时会导致很多问题。 -
@WernfriedDomscheit 的 pcustid 数据类型是数字,但该选项在虚拟工作室中不可用,所以我必须使用这个
-
你应该使用
Double或Int64,见OracleDbType Enumeration -
您应该将返回值作为参数集合的第一个元素。 Oracle 不使用这些名称(除非您在我认为的命令文本中指定它们)。
标签: c# oracle forms visual-studio exception-handling