0

有人可以告诉我如何将对象引用设置为实例吗?.... 这里,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();
        }

谢谢大家的帮助!!我得到了它!

4

4 回答 4

3

编辑:您的代码有很多问题:

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

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

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();
    }
}
于 2013-11-12T06:58:24.357 回答
2

我认为user_id这不是一个可为空的列,并且当您的参数为空时会发生。首先是参数名称不匹配。之后,当文本框为空时仍然会发生。最好在客户端进行检查以进行验证。

于 2013-11-12T07:02:15.090 回答
2

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

adap.InsertCommand.Parameters.Add

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

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

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

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

adap.Fill(ds,"A");

但这也不起作用:您需要 aSelectCommand来执行此操作。

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

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

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

我认为您误解了 DataAdapters 的工作方式。

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

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

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

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

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

于 2013-11-12T07:09:59.987 回答
1

你给的参数是空的。

于 2013-11-12T07:12:28.870 回答