问题 我可以'保存更新我的数据库;需要更新命令

神是

成员
已加入
2019年7月31日
留言内容
11
编程经验
Beginner
保存records.png时出错


我有决心开发薪资数据库。
在Microsoft Visual Studio 2015中创建表单后,我将DataGridView和Details节点都拖到了DataSet窗口的前面。
当我运行该应用程序时,我能够将我输入的两个条目保存到数据库中。但是此后,我无法再保存任何记录。
附件是单击“保存”按钮时显示的错误消息。
我恳切希望有人能帮助我解决我的问题。

- 神是
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,595
地点
弗吉尼亚州切萨皮克
编程经验
10+
该错误似乎很容易解释:更新调用需要有效的更新命令才能保存修改后的行。

请发布您的代码。我们也许能够发现您当前的update命令可能出了什么问题。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
It appears that you are using a typed DataSet. In that case, the wizard will generate the UpdateCommand automatically 如果 it is able to do so. If it wasn't able to do so in your case then that is most likely because one or more of your tables doesn't have a primary key. With no primary key, there's no obvious way to uniquely identify a record to update or delete, thus no UpdateCommand or DeleteCommand can be generated. It's a very rare thing that not having a primary key in a database table is a good idea. You should fix that and then regenerate the typed DataSet in the Data Sources window to have those commands automatically generated.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
为了将来参考,请不要张贴代码图片。代码是文本,因此将其发布为文本,并设置为易于阅读的代码格式。该站点上的代码编辑器使您可以突出显示特定的行,从而可以指示发生错误的位置等。错误消息也是文本。

另外,当您发布屏幕截图时(有时可能会有所帮助),请仅在其中一小部分有用时不要发布整个屏幕。通过以最容易使用的形式发布所有相关内容,而不是无关紧要的内容,帮助我们为您提供帮助。关于屏幕截图,我们无法从屏幕截图中复制和粘贴文本,因此这意味着我们无法轻松运行代码或搜索错误消息等。如果您需要花费更多的时间和精力来减少我们的时间和精力,那就是应该发生的事情,因为我们是陌生人,我们自愿花时间帮助您。我并不是说这不是您这次要做的事情,但是您会更好地了解下一次的情况。
 

神是

成员
已加入
2019年7月31日
留言内容
11
编程经验
Beginner
以下是我正在构建的项目的代码。
在代码中可以看到,我有两个带有不同代码的单独的保存按钮,但是它们都无法保存更新。

我正在等待协助:-

使用系统;
使用System.Collections.Generic;
使用System.ComponentModel;
使用System.Configuration;
使用System.Data;
使用System.Data.SqlClient;
使用System.Drawing;
使用System.Linq;
使用System.Text;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间薪资
{
公共局部类Form1:表单
{
公共Form1()
{
InitializeComponent();
}
SqlConnection con =新的SqlConnection(ConfigurationManager.ConnectionStrings ["con"].ConnectionString);
SqlCommand命令=新的SqlCommand();


私有void Form1_Load(对象发送者,EventArgs e)
{
// TODO:这行代码将数据加载到“ salariesDataSet.Salaries”表中。您可以根据需要移动或删除它。
this.salariesTableAdapter.FillBy(this.salariesDataSet.Salaries);
}
//声明变量
十进制BasicSalary,加班,ExtraOvertime,LeaveOutstanding,GrossSalary,SSNIT13,SSNIT5,应纳税收入,IncomeTax,缺勤,TotalDeductions,NetSalary;
int DaysWorked,DaysAbsent;
DateTime EmpDate,CurrentDate;




私人void saveButton_Click(object sender,EventArgs e)
{
this.Validate();
this.salariesBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.salariesDataSet);
}
}

私人void salariesBindingNavigatorSaveItem_Click(对象发送者,EventArgs e)
{
尝试
{
this.Validate();
this.salariesBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.salariesDataSet);
SalariesDataSet.SalariesDataTable deleteSalaries =(SalariesDataSet.SalariesDataTable)
SalariesDataSet.SalariesRow.GetChanges(DataRowState.Deleted);
SalariesDataSet.SalariesDataTable newSalaries =(SalariesDataSet.SalariesDataTable)
SalariesDataSet.SalariesRow.GetChanges(DataRowState.Added);
SalariesDataSet.SalariesDataTablemodifiedSalaries =(SalariesDataSet.SalariesDataTable)
SalariesDataSet.SalariesRow.GetChanges(DataRowState.Modified);

{
//从薪金表中删除所有已删除的薪水。
如果(deletedSalaries!= null)
{
salariesTableAdapter.Update(deletedSalaries);
}
//将新的薪水添加到Salaries表中。
如果(newSalaries!= null)
{
salariesTableAdapter.Update(newSalaries);
}
//更新所有修改后的薪水。
如果(modifiedSalaries!= null)
{
salariesTableAdapter.Update(newSalaries);
}
salariesDataSet.AcceptChanges();
}

}

捕获(System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}

}
}
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
请再试一遍。我之前曾要求您将代码发布为文本,然后将其格式化为代码。您已经完成了前者,但没有完成。我试图为您进行格式化,但是您发布的内容完全是一团糟。缩进无处不在,并且代码甚至都无法按原样编译。如果您发布的内容是您自己在VS中看到的内容,那也就不足为奇了。确保已正确格式化了代码,以提高可读性。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,971
地点
英国
编程经验
10+
我已经为您解决了缩进问题,并将您的方法包含在类中,但是我没有多余的时间来阅读您的文章。其他人将需要帮助。
使用VS提供的缩进:
使用系统;
使用System.Configuration;
using System.Data;
使用System.Data.SqlClient;
使用System.Windows.Forms;

namespace Payroll
{
    公共局部类Form1:表单
    {
        public Form1()
        {
            InitializeComponent();
        }

        private SqlConnection con =新的SqlConnection(ConfigurationManager.ConnectionStrings ["con"].ConnectionString);
        private SqlCommand命令=新的SqlCommand();

        私有void Form1_Load(对象发送者,EventArgs e)
        {
            // TODO:这行代码将数据加载到“ salariesDataSet.Salaries”表中。您可以根据需要移动或删除它。
            this.salariesTableAdapter.FillBy(this.salariesDataSet.Salaries);
        }

        //声明变量
        private 十进制BasicSalary,加班,ExtraOvertime,LeaveOutstanding,GrossSalary,SSNIT13,SSNIT5,应纳税收入,IncomeTax,缺勤,TotalDeductions,NetSalary;

        private int DaysWorked,DaysAbsent;
        private DateTime EmpDate,CurrentDate;

        私人void saveButton_Click(object sender,EventArgs e)
        {
            this.Validate();
            this.salariesBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.salariesDataSet);
        }

        私人void salariesBindingNavigatorSaveItem_Click(对象发送者,EventArgs e)
        {
            try
            {
                this.Validate();
                this.salariesBindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.salariesDataSet);
                SalariesDataSet.SalariesDataTable deleteSalaries =(SalariesDataSet.SalariesDataTable)
                SalariesDataSet.SalariesRow.GetChanges(DataRowState.Deleted);
                SalariesDataSet.SalariesDataTable newSalaries =(SalariesDataSet.SalariesDataTable)
                SalariesDataSet.SalariesRow.GetChanges(DataRowState.Added);
                SalariesDataSet.SalariesDataTablemodifiedSalaries =(SalariesDataSet.SalariesDataTable)
                SalariesDataSet.SalariesRow.GetChanges(DataRowState.Modified);

                {
                    //从薪金表中删除所有已删除的薪水。
                    如果(deletedSalaries!= null)
                    {
                        salariesTableAdapter.Update(deletedSalaries);
                    }
                    //将新的薪水添加到Salaries表中。
                    如果(newSalaries!= null)
                    {
                        salariesTableAdapter.Update(newSalaries);
                    }
                    //更新所有修改后的薪水。
                    如果(modifiedSalaries!= null)
                    {
                        salariesTableAdapter.Update(newSalaries);
                    }
                    salariesDataSet.AcceptChanges();
                }
            }
            捕获(System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }
        }
    }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
我什至不真正理解您为什么要发布该代码。我告诉您,问题几乎可以肯定是您的数据库表没有主键,但您根本没有解决。您的数据库表是否具有主键?如果没有,按照我说的做,添加它们,然后重新生成您的DataSet。没有比在您提供建议时无视您的建议更好的方法了,它可以使人们在将来不再帮助您。
 

神是

成员
已加入
2019年7月31日
留言内容
11
编程经验
Beginner
谢谢 金西尼,

当我回到SQL Management Studio并发现未设置主键时,我做对了。我设置了它,回到了VS,删除了DataSet并重新配置了它,重建了应用程序,现在我可以保存更新了。

非常感谢所有贡献者。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
回到VS,删除数据集并重新配置它
无需删除现有的数据集并创建一个新的数据集。我首先将您指向“数据源”窗口,因为工具栏中有一个按钮可以在现有数据集上重新运行向导以更新架构。
 
最佳 底部