【问题标题】:How to insert text box values from C# into Oracle Database如何将 C# 中的文本框值插入 Oracle 数据库
【发布时间】:2017-08-23 16:47:19
【问题描述】:

好的,我对这一切都很陌生,正在努力在 Windows 窗体应用程序中插入 TextBox 值(用户输入)并将这些值存储到 Oracle 数据库表中。

C# 代码:

string oradb = "DATA SOURCE = larry.uopnet.plymouth.ac.uk:1521/orcl.fost.plymouth.ac.uk;PERSIST SECURITY INFO = True;USER ID = xxxxxxxxxx;password = xxxxxxxxx";

OracleConnection con = new OracleConnection(oradb);
con.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText = "Insert into USER.Client VALUES (txtBoxClientName, txtBoxClientCity, txtBoxClientCountry, txtBoxClientNumber, txtBoxClientURL, comboClientStatus)";

int rowsUpdated = cmd.ExecuteNonQuery();
if (rowsUpdated == 0)
    MessageBox.Show("Please fill in required fields");
else
    MessageBox.Show("Client has been added");
con.Dispose();

此错误出现在 int rowsUpdated = cmd.ExecuteNonQuery(); 行 - Oracle.DataAccess.dll 中出现 Oracle.DataAccess.Client.OracleException 类型的未处理异常

Oracle 中的触发代码:

create or replace TRIGGER trg_client_ClientID
BEFORE INSERT ON client FOR EACH ROW
BEGIN
  :NEW.ClientID := seq_client_ClientID.nextval;
END;

【问题讨论】:

  • 先检查你的连接字符串,然后我还建议你在那里提供有关OracleException的错误详细信息、内部异常和堆栈跟踪。
  • 好吧,我已经玩了一些,但还是没有运气。我 100% 确定我的连接字符串是正确的(如果我更改它,则会在 con.Open 处出现错误)它是我的 CommandText 或我的异常捕获。

标签: c# sql oracle winforms


【解决方案1】:

在添加 OracleException 和 ArgumentException 以及使用 Elkhan 的 Parameter 代码的帮助下,我设法修复了它 - 这是我修改后的工作代码:

    private void btnClientSave_Click(object sender, EventArgs e)
    {

        string oradb = "DATA SOURCE = larry.uopnet.plymouth.ac.uk:1521/orcl.fost.plymouth.ac.uk;PERSIST SECURITY INFO = True;USER ID = xxxxxxxxx;password = xxxxxxxx";
        string insertquery = "Insert into Client VALUES (:1, :2, :3, :4, :5, :6, :7)";


        OracleConnection con = new OracleConnection(oradb);
        con.Open();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = con;
        cmd.CommandText = insertquery;
        try
        {

            cmd.Parameters.Add(new OracleParameter("1", OracleDbType.Decimal, ParameterDirection.ReturnValue));
            cmd.Parameters.Add(new OracleParameter("2", OracleDbType.Varchar2, txtBoxClientName.Text, ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("3", OracleDbType.Varchar2, txtBoxClientCity.Text, ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("4", OracleDbType.Varchar2, txtBoxClientCountry.Text, ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("5", OracleDbType.Varchar2, txtBoxClientNumber.Text, ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("6", OracleDbType.Varchar2, txtBoxClientURL.Text, ParameterDirection.Input));
            cmd.Parameters.Add(new OracleParameter("7", OracleDbType.Varchar2, comboClientStatus.Text, ParameterDirection.Input));

            cmd.ExecuteNonQuery();

            MessageBox.Show("Client has been added");
            con.Close();
            Close();
        }
        catch (OracleException e1)
        {
            MessageBox.Show("Error: " + e1.Message);
        }
        catch (ArgumentException e2)
        {
            MessageBox.Show("Error: " + e2.Message);
        }
        finally
        {                
            cmd.Dispose();
            con.Dispose();
        }

【讨论】:

  • "cmd.Parameters.Add(new OracleParameter("1", OracleDbType.Decimal, ParameterDirection.ReturnValue));" 名称为“1”的参数不是返回值,而你只是没有绑定参数值。它必须是这样的: cmd.Parameters.Add(new OracleParameter("1", OracleDbType.Varchar2, string.Empty, ParameterDirection.Input));
  • 我认为它需要返回值,因为该字段是由 Oracle 自动生成的,因为它是主键,在我的情况下是客户端 ID 列。通过研究,我发现 ODP.NET 仅通过表列的顺序而不是在插入查询时按名称工作。
【解决方案2】:

像这样:

    cmd.CommandText = "Insert into USER.Client VALUES (:param_txtBoxClientName, :param_txtBoxClientCity, :param_txtBoxClientCountry, :param_txtBoxClientNumber, :param_txtBoxClientURL, :param_comboClientStatus)";

    cmd.Parameters.Add(new OracleParameter("param_txtBoxClientName", OracleDbType.Varchar2, txtBoxClientName.Text, ParameterDirection.Input));
    cmd.Parameters.Add(new OracleParameter("param_txtBoxClientCity", OracleDbType.Varchar2, txtBoxClientCity.Text, ParameterDirection.Input));
    cmd.Parameters.Add(new OracleParameter("param_txtBoxClientNumber", OracleDbType.Varchar2, txtBoxClientNumber.Text, ParameterDirection.Input));
    cmd.Parameters.Add(new OracleParameter("param_txtBoxClientURL", OracleDbType.Varchar2, txtBoxClientURL.Text, ParameterDirection.Input));

【讨论】:

  • 我已经使这段代码生效,并为 OracleException 和 ArgumentException 放入了 2 个 catch 语句。然后我得到返回的错误说“无效的参数绑定。参数名称:ClientName”我不确定如何从那里修复它
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2017-12-03
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多