【问题标题】:What query syntax should I use for inserting records in an Oracle database?我应该使用什么查询语法在 Oracle 数据库中插入记录?
【发布时间】:2015-04-22 11:26:35
【问题描述】:

我是一个初学者,正在尝试用 C# 创建一个简单的程序,用于在 Oracle 数据库中插入和更新记录。我已成功连接到数据库,但我的 SQL 语句出现异常,指出不支持 (?) 符号。为什么会出现此异常以及如何解决此问题?

我的代码是:

private void btnSave_Click(object sender, EventArgs e)
{
    OracleConnection con = null;
    try
    {
        con = new OracleConnection();
        string constr = "Data source=XE; User ID=cloudester; Password=cloudester123;";
        if (con.State != ConnectionState.Open)
        {
            try
            {
                con.ConnectionString = constr;
                con.Open();
                //MessageBox.Show("Successfull connection");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Exception caught");
            }
        }

        if (con.State == ConnectionState.Open)
        {
            string str = "Insert into EMP_DETAIL(EmpId, Name, Age)";
            str += "values (?,?,?)";

            OracleCommand cmd = new OracleCommand();
            cmd.CommandText = Text;
            cmd.Connection = con;
            cmd.Parameters.Add(new OracleParameter("EmpId", OracleDbType.Varchar2)).Value = txtEmpId;
            cmd.Parameters.Add(new OracleParameter("Name", OracleDbType.Varchar2)).Value = txtName;
            cmd.Parameters.Add(new OracleParameter("Age", OracleDbType.Int16)).Value = int.Parse(txtAge.Text);

            cmd.ExecuteNonQuery();
        }
    }
    catch { ... }
}

【问题讨论】:

  • 我不知道应该用什么来代替?
  • 我想在 oracle 表中插入新记录。我已成功连接数据库,但不知道如何插入记录。我在互联网上搜索,但没有找到任何可行的解决方案
  • 我尝试使用 Oraclecommand,但它在 SQL satatement 中显示错误
  • 您应该使用带有: 占位符的命名参数,例如"Insert into EMP_DETAIL(EmpId, Name, Age) values(:EmpId, :Name, :Age)"
  • 你能帮我用OracleCommand简单的插入程序吗

标签: c# oracle sql-insert query-parameters


【解决方案1】:

您需要为您的命令使用命名参数

string str = "Insert into EMP_DETAIL(EmpId, Name, Age) values (:EmpId, :Name, :Age)";
OracleCommand cmd = new OracleCommand();
cmd.CommandText = str;  //cmd.CommandText = Text; not sure why did you use Text here
cmd.Connection = con;
cmd.Parameters.Add(new OracleParameter("EmpId", OracleDbType.Varchar2)).Value = txtEmpId;
cmd.Parameters.Add(new OracleParameter("Name", OracleDbType.Varchar2)).Value = txtName;
cmd.Parameters.Add(new OracleParameter("Age", OracleDbType.Int16)).Value = int.Parse(txtAge.Text);
cmd.ExecuteNonQuery();

【讨论】:

    【解决方案2】:

    作为agent5566 said,来自OracleCommand.Parameters property

    在 SQL 语句中使用命名参数时 OracleCommandCommandType.Text,您必须在参数名称之前 带冒号 (:)

    像这样使用它们;

    using(var con = new OracleConnection(constr))
    using(var cmd = con.CreateCommand())
    {
       cmd.CommandText = @"Insert into EMP_DETAIL(EmpId, Name, Age)
                           values (:EmpId, :Name, :Age)";
       cmd.Parameters.Add(new OracleParameter("EmpId", OracleDbType.Varchar2)).Value = txtEmpId;
       cmd.Parameters.Add(new OracleParameter("Name", OracleDbType.Varchar2)).Value = txtName;
       cmd.Parameters.Add(new OracleParameter("Age", OracleDbType.Int16)).Value = int.Parse(txtAge.Text);
       con.Open();
       cmd.ExecuteNonQuery();
    }
    

    顺便说一句,System.Data.OracleClient 在 .NET 4 版本中已被标记为已弃用。您可能想改用Oracle Data Provider for .NET

    作为替代方案,DataDirectDevArt 也有自己的 .NET 预言机提供程序。

    【讨论】:

    • 为了准确:不清楚他使用的是什么 Oracle Provider ;)
    • @agent5566 没错。我只是添加了一个附加信息:)
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多