用存储过程 C# 的结果填充列表框

Fill List box with result from stored procedure C#

我为此搜索了很多,正如您所知,我是 C# 的新手,我正在努力学习这门语言。

因此,如果我看过的 100 份表格中有一份与您 post 说的相同,请原谅我。

我正在尝试用名为 LookupInvoices 的存储过程的结果填充列表框,这需要一个参数 @InvoiceNumber,即 int.

我有一个 WPF,我想用这个存储过程的结果填充一个名为 lstResults 的列表框。

请查看我的代码并告诉我哪里出错了,非常感谢您的宝贵时间!

private void btnFill_Click(object sender, RoutedEventArgs e)
{
    if (cmbInvoiceNumbers.SelectedItem == null)
    {
        System.Windows.MessageBox.Show("Please Choose A Invoice Number!");
        return;
    }

    SqlConnection cs = new SqlConnection("Data Source=JAMES-DESKTOP\SQLEXPRESS;Initial Catalog=contacts;Integrated Security=True");

    int cboItemNumber = cmbInvoiceNumbers.SelectedIndex;
    int invNumber = Convert.ToInt32(cmbInvoiceNumbers.Items[cboItemNumber].ToString());

    cs.Open();

    SqlCommand cmd = new SqlCommand("LookupInvoices", cs);

    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        SqlParameter pram = new SqlParameter("@invoiceNumber", invNumber);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(pram);
        cmd.Connection = cs;

        reader.Read();
    }

    cs.Close();
}

请注意,当我点击按钮时它会崩溃。这并没有 运行 一路过关斩将。

你应该把你所有的一次性元素(SqlConnectionSqlCommandSqlDataReader)放入using (....) { ...... }块,你需要添加参数before 调用 .ExecuteReader() - 试试这个代码:

public class InvoiceDto
{
    public string Description { get; set; }
    public int Hours { get; set; }
    public decimal Amount { get; set; }
}

public void List<InvoiceDto> GetInvoiceData(int invoiceNumber)
{
    List<InvoiceDto> data = new List<InvoiceData>();

    using (SqlConnection cs = new SqlConnection("Data Source=JAMES-DESKTOP\SQLEXPRESS;Initial Catalog=contacts;Integrated Security=True"))
    using (SqlCommand cmd = new SqlCommand("dbo.LookupInvoices", cs))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@invoiceNumber", SqlDbType.Int).Value = invoiceNumber;

        cs.Open();

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                InvoiceDto dto = new InvoiceDto();
                dto.Description = reader.GetFieldValue<string>(0);
                dto.Hours = reader.GetFieldValue<int>(1);
                dto.Amount = reader.GetFieldValue<decimal>(2);

                data.Add(dto);
            }
        }

        cs.Close();
    }

    return data;
}

并且在您的代码隐藏中,您应该在事件处理程序中调用此方法

private void btnFill_Click(object sender, RoutedEventArgs e)
{
     // get selected invoice number
     int cboItemNumber = cmbInvoiceNumbers.SelectedIndex;
     int invNumber = Convert.ToInt32(cmbInvoiceNumbers.Items[cboItemNumber].ToString());

     // call method to get the data from the stored procedure
     List<InvoiceDto> data = GetInvoiceData(invNumber);

     // loop over the data and fill your listbox
     foreach(InvoiceDto dto in data)
     {
         listbox.Items.Add(dto.Description);
     }
}