【问题标题】:OracleParameterCollection.Add(string, type, string, size, string)OracleParameterCollection.Add(string, type, string, size, string)
【发布时间】:2014-11-22 16:44:52
【问题描述】:

我在 WinForms 项目中使用 C# 和 Oracle。我收到错误:

使用“InsertCommand.Parameters.Add”时,ORA-01400 无法将 null 插入(字符串)。

问题是参数(":ID", ":NOME", ":OBSERVACAO", ":NUMERO", ":ENDERECO") 没有从方法“Add”的“srcColumn”("ID", "NOME", "OBSERVACAO", "NUMERO", "ENDERECO") 参数接收值。我做错了什么?

public Form1()
    {
        InitializeComponent();
        ConsultaGRID();
    }

    OracleConnection conn = new OracleConnection("Data Source=xxx; User ID=xxx; Password=xxx;");
    DataTable tabela = new DataTable();
    OracleDataAdapter da = new OracleDataAdapter();

    private void ConsultaGRID()
    {
        while (conn.State != ConnectionState.Open) { conn.Open(); }
        OracleCommand cmd = new OracleCommand("select ID, NOME, OBSERVACAO, NUMERO, ENDERECO from CADASTRO_FONES order by ID", conn);

        da = new OracleDataAdapter(cmd);
        da.Fill(tabela);

        dataGridView1.DataSource = tabela;

    }

    private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.F6)//Inserir
        {
            GetInsert();
        }
        else if (e.KeyCode == Keys.F10)//Salvar
        {
            GetSave();
        }
    }

    private void GetInsert()
    {
        tabela.Rows.Add();
        dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[0];
    }

    private void GetSave()
    {
        try
        {
            while (conn.State != ConnectionState.Open) { conn.Open(); }                
            da.InsertCommand = new OracleCommand("insert into CADASTRO_FONES (NOME, ID, OBSERVACAO, NUMERO, ENDERECO) values (:NOME ,:ID ,:OBSERVACAO ,:NUMERO ,:ENDERECO)", conn);                

            da.InsertCommand.Parameters.Add(":ID", OracleType.Number, 22, "ID");
            da.InsertCommand.Parameters.Add(":NOME", OracleType.VarChar, 70, "NOME");
            da.InsertCommand.Parameters.Add(":OBSERVACAO", OracleType.VarChar, 70, "OBSERVACAO");
            da.InsertCommand.Parameters.Add(":NUMERO", OracleType.VarChar, 20, "NUMERO");
            da.InsertCommand.Parameters.Add(":ENDERECO", OracleType.VarChar, 70, "ENDERECO");

            da.Update(tabela);
        }
        catch (Exception ex) { MessageBox.Show(ex.Message); }
        finally
        {
            conn.Close();
        }
    }

我将“GetSave()”函数更改为下面的代码,但仍然无法正常工作:

private void GetSave()
    {
        try
        {
            while (conn.State != ConnectionState.Open) { conn.Open(); }                
            OracleCommand cmd = new OracleCommand("insert into CADASTRO_FONES (NOME, ID, OBSERVACAO, NUMERO, ENDERECO) values (:NOME ,:ID ,:OBSERVACAO ,:NUMERO ,:ENDERECO)", conn);                

            da.InsertCommand.Parameters.Add("ID", OracleType.Number, 22, "ID");
            da.InsertCommand.Parameters.Add("NOME", OracleType.VarChar, 70, "NOME");
            da.InsertCommand.Parameters.Add("OBSERVACAO", OracleType.VarChar, 70, "OBSERVACAO");
            da.InsertCommand.Parameters.Add("NUMERO", OracleType.VarChar, 20, "NUMERO");
            da.InsertCommand.Parameters.Add("ENDERECO", OracleType.VarChar, 70, "ENDERECO");

            da.InsertCommand = cmd;

            da.Update(tabela);
        }
        catch (Exception ex) { MessageBox.Show(ex.Message); }
        finally
        {
            conn.Close();
        }
    }

【问题讨论】:

    标签: c# oracle parameters sql-insert


    【解决方案1】:

    你需要去掉Parameters.Add中的冒号:

     da.InsertCommand.Parameters.Add(":ID", OracleType.Number, 22, "ID");
    

    应该是

     da.InsertCommand.Parameters.Add("ID", OracleType.Number, 22, "ID");
    

    在实际的 SQL 字符串中使用冒号来表示绑定参数。创建参数时,名称不带冒号即可。

    参见示例here

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 2020-06-30
      • 2021-08-27
      • 2022-07-29
      • 2010-09-24
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多