【问题标题】:Trouble updating my datagrid in WPF在 WPF 中更新我的数据网格时遇到问题
【发布时间】:2012-10-31 12:19:14
【问题描述】:

正如标题所示,我在 WPF 中更新数据网格时遇到问题。基本上我想要完成的是一个数据网格,它连接到一个 SQL Server 数据库,一旦用户将信息输入几个文本框并单击提交按钮,它就会自动更新。您会注意到我有一个连接两个表的命令。 Quote_Data 表中的数据稍后将由其他用户插入。现在我唯一关心的是从文本框和 General_Info 表中获取信息,然后从那里到我的数据网格。我将在下面包含的代码编译得很好,但是当我点击提交按钮时,什么也没有发生。这是我使用 SQL 数据库构建的第一个应用程序,因此其中许多概念对我来说都是新的,这就是为什么您可能会看到我的代码并想知道他在想什么。

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public DataSet mds; // main data set (mds)

    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        try
        {
            string connectionString = Sqtm.Properties.Settings.Default.SqtmDbConnectionString;

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                //Merging tables General_Info and Quote_Data
                SqlCommand cmd = new SqlCommand("SELECT General_Info.Quote_ID, General_Info.Open_Quote, General_Info.Customer_Name,"
                                            + "General_Info.OEM_Name, General_Info.Qty, General_Info.Quote_Num, General_Info.Fab_Drawing_Num, "
                                            + "General_Info.Rfq_Num, General_Info.Rev_Num,  Quote_Data.MOA, Quote_Data.MOQ, "
                                            + "Quote_Data.Markup, Quote_Data.FOB, Quote_Data.Shipping_Method, Quote_Data.Freight, "
                                            + "Quote_Data.Vendor_Price, Unit_Price, Quote_Data.Difference, Quote_Data.Vendor_NRE_ET, "
                                            + "Quote_Data.NRE, Quote_Data.ET, Quote_Data.STI_NET, Quote_Data.Mfg_Time, Quote_Data.Delivery_Time, "
                                            + "Quote_Data.Mfg_Name, Quote_Data.Mfg_Location "
                                            + "FROM General_Info INNER JOIN dbo.Quote_Data ON General_Info.Quote_ID = Quote_Data.Quote_ID",
                                            connection);

                SqlDataAdapter da = new SqlDataAdapter(cmd);

                DataTable dt = new DataTable();

                da.Fill(dt);

                MainGrid.ItemsSource = dt.DefaultView;

                mds = new DataSet();

                da.Fill(mds, "General_Info");

                MainGrid.DataContext = mds.Tables["General_Info"];
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        // renaming column names from the database so they are easier to read in the datagrid

        MainGrid.Columns[0].Header = "#";
        MainGrid.Columns[1].Header = "Date";
        MainGrid.Columns[2].Header = "Customer";
        MainGrid.Columns[3].Header = "OEM";
        MainGrid.Columns[4].Header = "Qty";
        MainGrid.Columns[5].Header = "Quote Number";
        MainGrid.Columns[6].Header = "Fab Drawing Num";
        MainGrid.Columns[7].Header = "RFQ Number";
        MainGrid.Columns[8].Header = "Rev Number";
        MainGrid.Columns[9].Header = "MOA";
        MainGrid.Columns[10].Header = "MOQ";
        MainGrid.Columns[11].Header = "Markup";
        MainGrid.Columns[12].Header = "FOB";
        MainGrid.Columns[13].Header = "Shipping";
        MainGrid.Columns[14].Header = "Freight";
        MainGrid.Columns[15].Header = "Vendor Price";
        MainGrid.Columns[16].Header = "Unit Price";
        MainGrid.Columns[17].Header = "Difference";
        MainGrid.Columns[18].Header = "Vendor NRE/ET";
        MainGrid.Columns[19].Header = "NRE";
        MainGrid.Columns[20].Header = "ET";
        MainGrid.Columns[21].Header = "STINET";
        MainGrid.Columns[22].Header = "Mfg. Time";
        MainGrid.Columns[23].Header = "Delivery Time";
        MainGrid.Columns[24].Header = "Manufacturer";
        MainGrid.Columns[25].Header = "Mfg. Location";

    }

    private void submitQuotebtn_Click(object sender, RoutedEventArgs e)
    {
        CustomerData newQuote = new CustomerData();

        int quantity;
        quantity = Convert.ToInt32(quantityTxt.Text);

        string theDate = System.DateTime.Today.Date.ToString("d");

        newQuote.OpenQuote = theDate;
        newQuote.CustomerName = customerNameTxt.Text;
        newQuote.OEMName = oemNameTxt.Text;
        newQuote.Qty = quantity;
        newQuote.QuoteNumber = quoteNumberTxt.Text;
        newQuote.FdNumber = fabDrawingNumberTxt.Text;
        newQuote.RfqNumber = rfqNumberTxt.Text;
        newQuote.RevNumber = revNumberTxt.Text;

        try
        {
            string insertConString = Sqtm.Properties.Settings.Default.SqtmDbConnectionString;

            using (SqlConnection insertConnection = new SqlConnection(insertConString))
            {
                insertConnection.Open();

                SqlDataAdapter adapter = new SqlDataAdapter(Sqtm.Properties.Settings.Default.SqtmDbConnectionString, insertConnection);

                SqlCommand updateCmd = new SqlCommand("UPDATE General_Info " + "Quote_ID = @Quote_ID, "
                                                    + "Open_Quote = @Open_Quote, " + "OEM_Name = @OEM_Name, " + "Qty = @Qty, "
                                                    + "Quote_Num = @Quote_Num, " + "Fab_Drawing_Num = @Fab_Drawing_Num, "
                                                    + "Rfq_Num = @Rfq_Num, " + "Rev_Num = @Rev_Num "
                                                    + "WHERE Quote_ID = @Quote_ID");

                updateCmd.Connection = insertConnection;

                System.Data.SqlClient.SqlParameterCollection param = updateCmd.Parameters;

                //
                // Add new SqlParameters to the command.
                //
                param.AddWithValue("Open_Quote", newQuote.OpenQuote);
                param.AddWithValue("Customer_Name", newQuote.CustomerName);
                param.AddWithValue("OEM_Name", newQuote.OEMName);
                param.AddWithValue("Qty", newQuote.Qty);
                param.AddWithValue("Quote_Num", newQuote.QuoteNumber);
                param.AddWithValue("Fab_Drawing_Num", newQuote.FdNumber);
                param.AddWithValue("Rfq_Num", newQuote.RfqNumber);
                param.AddWithValue("Rev_Num", newQuote.RevNumber);

                adapter.UpdateCommand = updateCmd;

                adapter.Update(mds.Tables[0]);

                mds.AcceptChanges();
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

提前感谢任何可以提供帮助的人,我真的很感激,

  • 安德鲁

【问题讨论】:

  • 什么是“什么都没有发生”?你调试了吗?代码能工作多远?你从服务器得到答案吗? ...
  • 嘿 DHN,我进行了调试,据我所知,一切似乎都正常工作。数据库连接在他们应该打开的时候打开,虽然我不完全确定如何从 SSMS 检查我的数据表中的值,但当我单步执行 param.AddWithValue... 的代码时,我被告知 SqlValues 用于每行都等于我之前在文本框中输入的内容。我希望问题与我如何使用数据适配器/数据表/和数据集自行设置数据网格有关;我仍然有点困惑的领域。
  • 我确实有另一个关于什么可能导致问题的理论。 General_Info 数据表的设置方式,其主键称为 Quote_ID,在 Sql Server Management Studio 中,我将其设置为自动添加到新行并为下一行递增一。也就是说,单击提交按钮后,我的代码仅引用 updateCmd 中的 Quote_ID。我还需要为 Quote_ID 添加一个 param.AddWithValue() 吗?

标签: c# sql-server wpf data-binding datagrid


【解决方案1】:

您没有设置 Quote_ID 参数。所以你的更新可能会运行WHERE Quote_ID = null,所以没有更新。

【讨论】:

  • 嘿 Spevy,感谢您的输入,这就是我认为问题所在,但我不完全确定如何解决它,因为 Quote_ID 是一个应该是的值当新行开始时自动设置(即第一行是 1000,第二行是 10001,等等)。我应该如何以及在哪里设置 Quote_ID 参数?
  • 我认为您应该像设置其他参数一样设置 Quote_ID 参数,但是您需要从更新子句中删除分配,因为您不需要更改值。
  • 因此,如果我理解正确,我应该将更新子句更改为:
  • 忽略我之前的评论。我的意思是:因此,如果我理解正确,我应该将更新子句更改为 SqlCommand updateCmd = new SqlCommand("UPDATE General_Info " + "Open_Quote = @Open_Quote, " + "..." + "WHERE Quote_ID = @Quote_ID");然后添加 param.AddWithValue("Quote_ID", someInt);其中 someInt 之前定义为一个整数,每次开始新行时递增一?我会开始做这件事并回帖。谢谢斯佩维
  • 我在这里真的很挣扎,我不知道为什么。我已经将主键的 (Quote_ID) 标识设置为 true,种子为 1000,增量为 1。我似乎无法弄清楚如何将该 Quote_ID 与表的其余部分链接起来,以便在我的数据网格。我尝试使用 INSERT INTO 为 Quote_ID 创建第二个 SqlCommand,但这没有用。我认为我最困惑的是如何使用 param.AddWithValues 添加 Quote_ID 因为我认为如果我写 param.AddWithValue("Quote_ID", ???); 它会起作用。但我不知道用什么替换这些问号。
【解决方案2】:

您是要更新现有行还是插入新行?

因为如果您需要插入,那么正确的命令是插入(而不是更新)。
要获取插入行的标识值,请使用 Scope_Identity()

而且您一次只能插入一个表。

Scope_Identity() 不是参数
不要尝试将其用作参数

见下例

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];

MSDN.Microsoft.com 上有很多例子

【讨论】:

  • 我正在插入一行,所以我应该将 Update 更改为 Insert 并在下面写 param.AddWithValues("Quote_ID", Quote_ID.Scope_Identity() ); ?我理解正确吗?
  • 忽略之前的评论...所以我将 UPDATE 更改为 "INSERT INTO General_Info" + "Quote_ID = @Quote_ID" + "..." + "WHERE Quote_ID = @Quote_ID" 正确吗?我应该在哪里实施 Scope_Identity()?
  • 好的,我会试一试,然后回复。感谢您的帮助
【解决方案3】:

使用 LINQ 我能够解决这个问题。代码如下:

    var sqtmDC = new SqtmLinqDataContext();

        var mainTable = from generalInfo in sqtmDC.GetTable<General_Info>()
                      //join quoteData in sqtmDataContext.GetTable<Quote_Data>() on generalInfo.Quote_ID equals quoteData.Quote_ID
                      select generalInfo;

                      myGrid.ItemsSource = mainTable;
    }

     private void submitBtn_Click(object sender, RoutedEventArgs e)
    {
        var sqtmDC = new SqtmLinqDataContext();

       // string theDate = System.DateTime.Today.Date.ToString("d");
        int quantity = Convert.ToInt32(quantityTxt.Text);

        General_Info insert = new General_Info();

        insert.Open_Quote = DateTime.UtcNow;
        insert.Customer_Name = customerNameTxt.Text;
        insert.OEM_Name = oemNameTxt.Text;
        insert.Qty = quantity;
        insert.Quote_Num = quoteNumberTxt.Text;
        insert.Fab_Drawing_Num = fabDrawingNumTxt.Text;
        insert.Rfq_Num = rfqNumberTxt.Text;
        insert.Rev_Num = revNumberTxt.Text;

        sqtmDC.General_Infos.InsertOnSubmit(insert);
        sqtmDC.SubmitChanges();

        int quoteID = insert.Quote_ID;

        var mainTable = from generalInfo in sqtmDC.GetTable<General_Info>()

                        select generalInfo;

        myGrid.ItemsSource = mainTable;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2019-07-22
    • 2020-02-05
    相关资源
    最近更新 更多