C# 绑定值与数据库不匹配

本文关键字:数据库 不匹配 绑定 | 更新日期: 2023-09-27 18:37:01

C# VS2010 表单应用程序

我有一个带有SQL Server数据库(.mdf文件)的C#项目,其中包括一个ID字段,数据类型int,不允许使用null;以便它自动编号。

在我的主窗体中,我将表绑定到绑定源,ID 字段绑定到标签。

它们的所有窗体控件及其绑定属性都是在属性窗口中创建的,没有代码。

该窗体包含一个绑定导航器,该绑定导航器具有 + 按钮(添加记录)。单击 + 按钮的那一刻,将为 ID 字段分配一个值 -1;大概是临时值,但这会自动发生,没有任何代码隐藏。

然后,当我将绑定控件中的所有值插入到数据库的各自列中时(此代码工作正常),除了数据库自动分配的 ID(自动递增 int)。因此,这就是绑定控件中的值与数据库中存储的值不匹配的原因。

这使我无法继续创建通过引用 ID 字段来删除记录的方法,因为绑定控件中的值 (-1) 无效,即数据库中不存在此类记录。

我已经尝试BindingSource.ResetBindings方法并刷新标签,但在退出并重新启动程序之前,该值仍为 -1。

我还发现了尝试将BindingSource.DataSource设置为 null 然后重新绑定的建议,但尝试将数据源或数据成员设置为 null 会引发异常。我找到了另一个建议将BindingSource.RaiseListChangedEvents设置为 false 的建议,但异常仍然发生。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Address_Book
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
            //***Program Execution***
            fillContactGrid();
        }    
        private void fillContactGrid()
        //This method retrieves and displays all records from ContactInfo
        {         
            //Create a connection to the database
            using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ContactsConnectionString))
            {               
                //Construct the SQL Query string
                string sqlQuery = "SELECT * FROM ContactInfo";
                //Open the connection
                connection.Open();
                //Pass the query to the database and receive dataset
                SqlDataAdapter dataadapter = new SqlDataAdapter(sqlQuery, connection);
                DataSet ds = new DataSet();               
                dataadapter.Fill(ds, "ContactInfo");
                //Close the connection
                connection.Close();
                //Load the dataset into GridView
                contactsGridView.DataSource = ds;
                contactsGridView.DataMember = "ContactInfo";
            }
        }
        private void FormMain_Load(object sender, EventArgs e)
        {
            //Initialize contactsDataSet
            this.contactInfoTableAdapter.Fill(this.contactsDataSet.ContactInfo);
        }
        private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
        {
            disableNavigation();
            //Show save and cancel buttons
            buttonSave.Visible = true;
            buttonCancel.Visible = true;
        }
        private void disableNavigation()
        {
            //Temporarily disable navigator controls
            bindingNavigatorAddNewItem.Enabled = false;
            bindingNavigatorDeleteItem.Enabled = false;
            bindingNavigatorPositionItem.Enabled = false;
            bindingNavigatorMoveFirstItem.Enabled = false;
            bindingNavigatorMoveLastItem.Enabled = false;
            bindingNavigatorMoveNextItem.Enabled = false;
            bindingNavigatorMovePreviousItem.Enabled = false;
        }
        private void buttonCancel_Click(object sender, EventArgs e)
        {
            //Cancel new record entry
            contactInfoBindingSource.RemoveCurrent();
            //Hide save and cancel buttons
            buttonSave.Visible = false;
            buttonCancel.Visible = false;
            enableNavigation();
        }
        private void enableNavigation()
        {
            //Enable navigator controls
            bindingNavigatorAddNewItem.Enabled = true;
            bindingNavigatorDeleteItem.Enabled = true;
            bindingNavigatorPositionItem.Enabled = true;
            bindingNavigatorMoveFirstItem.Enabled = true;
            bindingNavigatorMoveLastItem.Enabled = true;
            bindingNavigatorMoveNextItem.Enabled = true;
            bindingNavigatorMovePreviousItem.Enabled = true;
        }
        private void buttonSave_Click(object sender, EventArgs e)
        {
            insertNewContact(); 
        }
        private void insertNewContact()
        {       
            using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ContactsConnectionString))
            {
                //***Construct the SQL Command string
                //Format: INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...)
                //Command
                string sqlCmd = "INSERT INTO ";
                //Table name
                sqlCmd += @"ContactInfo ";
                //Column names
                sqlCmd += @"(LastName, ";
                sqlCmd += @"FirstName, ";
                sqlCmd += @"Relationship, ";
                sqlCmd += @"Title, ";
                sqlCmd += @"Company, ";
                sqlCmd += @"OfficePhone, ";
                sqlCmd += @"OfficeExtension, ";
                sqlCmd += @"CellPhone, ";
                sqlCmd += @"HomePhone, ";
                sqlCmd += @"Email1, ";
                sqlCmd += @"Email2) ";
                //Values
                sqlCmd += @"VALUES ";
                sqlCmd += @"(@LastName, ";
                sqlCmd += @"@FirstName, ";
                sqlCmd += @"@Relationship, ";
                sqlCmd += @"@Title, ";
                sqlCmd += @"@Company, ";
                sqlCmd += @"@OfficePhone, ";
                sqlCmd += @"@OfficeExtension, ";
                sqlCmd += @"@CellPhone, ";
                sqlCmd += @"@HomePhone, ";
                sqlCmd += @"@Email1, ";
                sqlCmd += @"@Email2)";
                //Open the connection
                connection.Open();
                //Pass the command to the database
                using (SqlCommand command =new SqlCommand(sqlCmd, connection))
                {
                    command.Parameters.Add("@LastName", SqlDbType.NChar).Value = textLastName.Text;
                    command.Parameters.Add("@FirstName", SqlDbType.NChar).Value = textFirstName.Text;
                    command.Parameters.Add("@Relationship", SqlDbType.NChar).Value = textRelationship.Text;
                    command.Parameters.Add("@Title", SqlDbType.NChar).Value = textTitle.Text;
                    command.Parameters.Add("@Company", SqlDbType.NChar).Value = textCompany.Text;
                    command.Parameters.Add("@OfficePhone", SqlDbType.NChar).Value = textOfficePhone.Text;
                    command.Parameters.Add("@OfficeExtension", SqlDbType.NChar).Value = textOfficeExtension.Text;
                    command.Parameters.Add("@CellPhone", SqlDbType.NChar).Value = textCellPhone.Text;
                    command.Parameters.Add("@HomePhone", SqlDbType.NChar).Value = textHomePhone.Text;
                    command.Parameters.Add("@Email1", SqlDbType.NChar).Value = textEmail1.Text;
                    command.Parameters.Add("@Email2", SqlDbType.NChar).Value = textEmail2.Text;
                    try
                    {
                        int rows = command.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
                connection.Close();
                buttonSave.Visible = false;
                buttonCancel.Visible = false;                
                enableNavigation();
            }
        }
        private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            //Update the binding grid when its tab is selected
            fillContactGrid();
        }
    }
}

C# 绑定值与数据库不匹配

这是我

所看到的问题:

将数据集绑定到应用程序中的控件。单击"+"按钮,这会在数据集中生成一个新行并分配默认Id -1 。 然后,您通过 insertNewContact 手动插入该数据,但是您从未实际检索Id发布的数据库并将其应用于您的数据集。 如果数据集中仍-1 Id 字段的值,则重置绑定的次数无关紧要,也不会从数据库中刷新数据集。

您可以通过多种方式之一执行此操作。 您可以在insertNewContact后简单地致电fillContactGrid。或者,可以在查询结束时select @@identity并手动更新数据集。 为此,您需要将数据库调用更改为 command.ExecuteScalar()

无论哪种方式,您都需要以某种方式从数据库中检索新插入的 Id 并更新数据集中的相应行。

如果我没记错的话(已经有一段时间了)。仅供参考,这有点黑客,但它演示了这个概念:

地址:sqlCmd += @"; select @@identity";

改变:

int rows = command.ExecuteNonQuery();

自:

int newid = (int)command.ExecuteScalar();
((DataSet)contactsGridView.DataSource).Tables["ContactInfo"].Select("Id = -1")[0].SetField("Id", newId);

花了一段时间,但终于找到了问题/解决方案。

FormMain_Load Visual Studio 添加了一行来填充将控件绑定到 BindingSource 时创建的数据适配器;

this.contactInfoTableAdapter.Fill(this.contactsDataSet.ContactInfo);

完成命令后添加此行代码。ExecuteNonQuery 刷新了绑定控件中的数据,并且 ID 值 -1 被替换为 SQLServer 分配的正确值。

非常感谢布莱恩。我从您的帮助中学到了很多新东西,我相信将来会对我有益。