使用参数时,对象引用未设置为对象的实例

时间:2013-11-12 06:55:24

标签: c# visual-studio-2010 oracle nullreferenceexception

有人可以告诉我如何将对象引用设置为实例吗? .... 这里,user_id是将文本框值带入sql语句的参数。

private void button1_Click(object sender, EventArgs e)
{

    OracleConnection con = new OracleConnection("Data Source=KBETEST; Persist Security Info=TRUE; User ID=dbo; Password=dbo123; Unicode=True");
    DataSet ds = new DataSet();
    OracleDataAdapter adap = new OracleDataAdapter();
    OracleCommandBuilder b = new OracleCommandBuilder(adap);

    adap = new OracleDataAdapter("insert into banks_ben_branch_99 (ben_bank_id, ben_brn_code, brn_name,ben_brn_addr1, ben_brn_loc, ben_brn_state, ben_brn_city, ben_bank_city, coun_code,brn_stat, remarks, brn_id, user_id, pc_tcp_ip, rtgs_stat, pay_brn_code,sys_date) select bankid,benbrn_code,brn_name,substr(brn_addr,1,100),brn_loc, brn_stat, brn_city, brn_city, coun_code,'A', remarks, '15', :user_id,'172.20.1.109', rtgs_stat, benbrn_code,sysdate from bbbt",con);
    adap.InsertCommand.Parameters.Add("user_id", OracleType.VarChar,20, "user_id").Value = textBox1.Text;
    adap.Fill(ds,"A");
    DataTable table = ds.Tables["A"];
    dataGridView1.DataSource = ds.Tables["A"];
    con.Dispose();
}

谢谢!

修改

private void button1_Click(object sender, EventArgs e)
    {

       OracleConnection con = new OracleConnection("Data Source=KBETEST; Persist Security Info=TRUE; User ID=dbo; Password=dbo123; Unicode=True");
       DataSet ds = new DataSet();
       OracleDataAdapter adap = new OracleDataAdapter();
       OracleCommandBuilder b = new OracleCommandBuilder(adap);
       string str = "insert into banks_ben_branch_99 (ben_bank_id, ben_brn_code, brn_name,ben_brn_addr1, ben_brn_loc, ben_brn_state, ben_brn_city, ben_bank_city, coun_code,brn_stat, remarks, brn_id, user_id, pc_tcp_ip, rtgs_stat, pay_brn_code,sys_date) select bankid,benbrn_code,brn_name,substr(brn_addr,1,100),brn_loc, brn_stat, brn_city, brn_city, coun_code,'A', remarks, '15', :user_id, '172.20.1.109', rtgs_stat, benbrn_code,sysdate from bbbt";
       con.Open();
       adap.InsertCommand = new OracleCommand(str, con);
       adap.InsertCommand.Parameters.Add("user_id", OracleType.VarChar,20).Value = textBox1.Text;
       adap.InsertCommand.ExecuteNonQuery();

       con.Dispose();
        }

感谢大家的帮助!!我明白了!

3 个答案:

答案 0 :(得分:3)

编辑:您的代码存在多处问题:

  • 您没有在命令中指定user_id参数,尽管它在SQL中
  • 即使您未指定任何插入SQL,您也尝试使用适配器的InsertCommand
  • 您正在尝试填充数据集,但尚未指定查询 - 只是一个插入命令。

我怀疑你根本不应该使用数据适配器。如果您只需要插入一些数据,请使用:

using (var connection = new OracleConnection(...)
{
    connection.Open();
    string sql = "insert into banks_ben_branch_99 [... as before ...]";
    using (var command = new OracleCommand(sql, conn))
    {
        command.Parameters.Add("user_id", OracleType.VarChar, 20)
                          .Value = textBox1.Text;
        command.ExecuteNonQuery();
    }
}

答案 1 :(得分:2)

我怀疑adap.InsertCommand在以下行中为空:

adap.InsertCommand.Parameters.Add

在上一行中,您使用以下构造函数:

adap = new OracleDataAdapter("insert into ...", con); 

但是此构造函数初始化SelectCommand,而不是InsertCommand。因此,adap.InsertCommand仍将具有其默认值null。

然后您的代码继续尝试使用此适配器填充DataTable:

adap.Fill(ds,"A");

但这也不起作用:您需要SelectCommand才能执行此操作。

要填充DataSet,您的代码应该类似于:

adap = new OracleDataAdapter("SELECT ... FROM ... WHERE ...", con); 
adap.SelectCommand.Parameters.Add(... any parameters you need ...);
adap.Fill(ds, "A");
  

现在正在传递断点,没有对oracle数据库表进行任何更改!为什么会这样。

我认为你误解了DataAdapter的工作原理。

要将数据库中的数据导入DataTable,您需要:

  • 使用SelectCommand
  • 创建适配器
  • 调用adapter.Fill执行SelectCommand并使用结果
  • 填充DataTable

要从DataTable将数据插入数据库,您需要:

  • 使用您要插入的数据在DataTable中插入行
  • 使用InsertCommand
  • 创建适配器
  • 调用adapter.Update将数据插入数据库。

更新/删除数据库中的行与插入类似,但使用UpdateCommand和DeleteCommand。

答案 2 :(得分:1)

您提供的参数为null。