簡體   English   中英

使用參數時,對象引用未設置為對象的實例

[英]object reference not set to an instance of an object when using parameter

有人可以告訴我如何將對象引用設置為實例嗎? ....這里,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();
        }

謝謝大家的幫助! 我知道了!

編輯:您的代碼有很多錯誤:

  • 盡管在SQL中,但您沒有在命令中指定user_id參數
  • 即使您未指定任何插入SQL,您InsertCommand嘗試使用適配器的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();
    }
}

我認為user_id不是可為空的列,它在您的參數為空時發生。 首先是,參數名稱不匹配。 之后,當文本框為空時,仍然可能發生這種情況。 最好在客戶端進行檢查以進行驗證。

我懷疑adap.InsertCommand在以下行中為null:

adap.InsertCommand.Parameters.Add

在上一行中,使用以下構造函數:

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

但是此構造函數初始化SelectCommand而不是InsertCommand 因此adap.InsertCommand仍將具有其默認值null。

然后,您的代碼繼續嘗試使用此適配器填充DataTable:

adap.Fill(ds,"A");

但這也不起作用:您需要執行SelectCommand

要填充數據集,您的代碼可能應該類似於以下內容:

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。

您提供的參數為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM