2016-11-24 95 views
0

Problem from yesterday ...仍然無法排序。檢索並分配組合框值到存儲過程參數

已經經歷了一百萬個帖子和視頻,但找不到指出我做錯了什麼的人。我基本上想要檢索並分配組合框的值,並將其發送到SQL存儲過程的參數。我被指責沒有提供足夠的代碼昨天所以這裏有一點更詳細。

SqlConnection _connection; 
SqlCommand _command; 

_connection = new SqlConnection(@"Data Source=someserver;Initial Catalog=sometable;Integrated Security=True"); 

_connection.Open(); 

_command = _connection.CreateCommand(); 
_command.CommandType = CommandType.StoredProcedure; 

private void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     _command.CommandText = "someprocedurename"; 
     _command.Parameters.Add("@someparameter", SqlDbType.NVarChar).Value = combobox1.SelectedItem.ToString(); 

     _command.ExecuteNonQuery(); 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
     _connection.Close(); 
    } 
} 

會發生什麼:當我在組合框中選擇該項目,它首先會自動彈出錯誤信息,那麼就說明框中的項目,但顯然它的價值沒有得到傳遞給@someparameter,或者至少存儲過程沒有被觸發。在SQL中編寫和測試的存儲過程起作用 - 問題出在C#代碼中。我知道這可能是很多專業人士的蹩腳問題,但請考慮我已經完成了我的研究。請儘可能具體 - 不要在這裏受到批評,但要提高我的新手技能。謝謝。

C#,Windows窗體

編輯:

catch塊被修改爲亨利爵士建議。

This is what I see now

和移動_connection.Open後();進入try塊,

this is what I see

差不多跆拳道......

編輯2:

看來問題沒有了,感謝亨利爵士。我現在需要弄清楚的是,如何根據第一個組合框的值調用的存儲過程來填充第二個組合框。這是怎樣的代碼看起來像現在:

private void SelectedIndexChanged(object sender, EventArgs e) 
    { 

     using (SqlConnection _connection = 
       new SqlConnection(@"Data Source=someserver;Initial Catalog=sometable;Integrated Security=True")) 

      try 
      { 

       _connection.Open(); 

       SqlCommand _command = new SqlCommand("someprocedurename", _connection); 

       _command.CommandType = CommandType.StoredProcedure; 

       _command.Parameters.Add("@someparameter", SqlDbType.NVarChar).Value = combobox1.SelectedValue.ToString(); 

       _command.ExecuteNonQuery(); 

/* i guess this is the part where i should "inform" combobox2 about the 
result of the stored procedure, based on combobox1. have no idea though, 
how it could be done. maybe i need a dataset? clueless. just to be clear: 
if value "a" was selected in combobox1, i want to populate combobox2 with 
the value "1". if value "b" was selected in combobox1, i want to populate 
combobox2 with the value "2". etc. */ 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
    } 
+0

首先你應該找出異常。我想這可能是命令或連接的問題。對於這個重寫catch塊catch(Exception ex) MessageBox.Show(ex.ToString(),「Error」,MessageBoxButtons.OK,MessageBoxIcon.Error); }然後在您的問題 –

+0

中發佈例外情況,對於遲到的回覆感到抱歉 - 星期五關閉了,但現在我回來了,並且已經做了必要的更改。請參閱問題中的編輯。謝謝 – stuckedagain

+0

你的問題是_connection.Close();在終於阻止。連接通常有兩種類型的全局或本地(工作單元)。環球始終是開放的,以當地方式關閉它是不好的做法。本地已在方法主體中初始化,您應該關閉連接或使用(){} insructon –

回答

1

你試過combobox1.SelectedValue.ToString();,而不是combobox1.SelectedItem.ToString();

其中的一個原因,這種問題是你的實體結合到ComboBox。你能分享數據綁定到ComboBox的代碼嗎?

+0

我剛纔嘗試過,但無濟於事,同樣的問題。數據綁定是Metro框架自動生成的代碼,您基本上爲組合框提供了一個數據源/表,並且完成了。感謝您嘗試幫助。 – stuckedagain

+0

您可以在該行放置斷點並調試ComboBox中的屬性。可以點亮一些。 – Nitesh

0

這應該工作

SqlConnection _connection; 
SqlCommand _command; 

_connection = new SqlConnection(@"Data Source=someserver;Initial Catalog=sometable;Integrated Security=True"); 

_connection.Open(); 

_command = _connection.CreateCommand(); 
_command.CommandType = CommandType.StoredProcedure; 

private void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     _command.CommandText = "someprocedurename"; 
     _command.Parameters.Add("@someparameter", SqlDbType.NVarChar).Value = combobox1.SelectedValue.ToString(); 

     _command.ExecuteNonQuery(); 
} 
catch (Exception) 
{ 
    MessageBox.Show("Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 
finally 
{ 
    _connection.Close(); 
    } 
} 
+0

sooo ....這個解決方案與我的完全不同?你能否指出你所做的改變?每一行都與問題中的相同,不幸的是不能正常工作。謝謝 – stuckedagain